Eclipse SUMO - Simulation of Urban MObility
ReversedEdge.h
Go to the documentation of this file.
1/****************************************************************************/
2// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3// Copyright (C) 2001-2022 German Aerospace Center (DLR) and others.
4// This program and the accompanying materials are made available under the
5// terms of the Eclipse Public License 2.0 which is available at
6// https://www.eclipse.org/legal/epl-2.0/
7// This Source Code may also be made available under the following Secondary
8// Licenses when the conditions for such availability set forth in the Eclipse
9// Public License 2.0 are satisfied: GNU General Public License, version 2
10// or later which is available at
11// https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
12// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
13/****************************************************************************/
18// The ReversedEdge is a wrapper around a ROEdge or a MSEdge used for
19// backward search
20/****************************************************************************/
21#pragma once
22#include <config.h>
23
24
25// ===========================================================================
26// class definitions
27// ===========================================================================
29template<class E, class V>
31public:
32 typedef std::vector<std::pair<const ReversedEdge<E, V>*, const ReversedEdge<E, V>*> > ConstEdgePairVector;
33
34 ReversedEdge(const E* orig) : myOriginal(orig) {
35 }
36
37 void init() {
38 if (!myOriginal->isInternal()) {
39 for (const auto& viaPair : myOriginal->getViaSuccessors()) {
40 const ReversedEdge<E, V>* revSource = viaPair.first->getReversedRoutingEdge();
41 const E* via = viaPair.second;
42 const ReversedEdge<E, V>* preVia = nullptr;
43 while (via != nullptr && via->isInternal()) {
44 via->getReversedRoutingEdge()->myViaSuccessors.push_back(std::make_pair(this, preVia));
45 preVia = via->getReversedRoutingEdge();
46 via = via->getViaSuccessors().front().second;
47 }
48 revSource->myViaSuccessors.push_back(std::make_pair(this, preVia));
49 }
50 }
51 }
52
56 int getNumericalID() const {
57 return myOriginal->getNumericalID();
58 }
59
63 const std::string& getID() const {
64 return myOriginal->getID();
65 }
66
70 double getLength() const {
71 return myOriginal->getLength();
72 }
73
74 const ReversedEdge* getBidiEdge() const {
75 return myOriginal->getBidiEdge()->getReversedRoutingEdge();
76 }
77
78 bool isInternal() const {
79 return myOriginal->isInternal();
80 }
81
82 inline bool prohibits(const V* const vehicle) const {
83 return myOriginal->prohibits(vehicle);
84 }
85
86 inline bool restricts(const V* const vehicle) const {
87 return myOriginal->restricts(vehicle);
88 }
89
90 static inline double getTravelTimeStatic(const ReversedEdge<E, V>* const edge, const V* const veh, double time) {
91 return edge->myOriginal->getTravelTime(veh, time);
92 }
93
95 if (vClass == SVC_IGNORING || myOriginal->isTazConnector()) { // || !MSNet::getInstance()->hasPermissions()) {
96 return myViaSuccessors;
97 }
98#ifdef HAVE_FOX
99 FXMutexLock lock(mySuccessorMutex);
100#endif
101 auto i = myClassesViaSuccessorMap.find(vClass);
102 if (i != myClassesViaSuccessorMap.end()) {
103 // can use cached value
104 return i->second;
105 }
106 // instantiate vector
108 // this vClass is requested for the first time. rebuild all successors
109 for (const auto& viaPair : myViaSuccessors) {
110 if (viaPair.first->myOriginal->isTazConnector() || viaPair.first->myOriginal->isConnectedTo(*myOriginal, vClass)) {
111 result.push_back(viaPair);
112 }
113 }
114 return result;
115 }
116
117private:
118 const E* myOriginal;
120 mutable std::map<SUMOVehicleClass, ConstEdgePairVector> myClassesViaSuccessorMap;
121
123
124#ifdef HAVE_FOX
126 mutable FXMutex mySuccessorMutex;
127#endif
128
129};
SUMOVehicleClass
Definition of vehicle classes to differ between different lane usage and authority types.
@ SVC_IGNORING
vehicles ignoring classes
the edge type representing backward edges
Definition: ReversedEdge.h:30
double getLength() const
Returns the length of the edge.
Definition: ReversedEdge.h:70
const std::string & getID() const
Returns the id of the edge.
Definition: ReversedEdge.h:63
std::vector< std::pair< const ReversedEdge< E, V > *, const ReversedEdge< E, V > * > > ConstEdgePairVector
Definition: ReversedEdge.h:32
ConstEdgePairVector myViaSuccessors
Definition: ReversedEdge.h:122
bool prohibits(const V *const vehicle) const
Definition: ReversedEdge.h:82
std::map< SUMOVehicleClass, ConstEdgePairVector > myClassesViaSuccessorMap
The successors available for a given vClass.
Definition: ReversedEdge.h:120
const ReversedEdge * getBidiEdge() const
Definition: ReversedEdge.h:74
bool restricts(const V *const vehicle) const
Definition: ReversedEdge.h:86
const ConstEdgePairVector & getViaSuccessors(SUMOVehicleClass vClass=SVC_IGNORING) const
Definition: ReversedEdge.h:94
ReversedEdge(const E *orig)
Definition: ReversedEdge.h:34
const E * myOriginal
Definition: ReversedEdge.h:118
int getNumericalID() const
Returns the index (numeric id) of the edge.
Definition: ReversedEdge.h:56
bool isInternal() const
Definition: ReversedEdge.h:78
static double getTravelTimeStatic(const ReversedEdge< E, V > *const edge, const V *const veh, double time)
Definition: ReversedEdge.h:90