Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
eclipse
GitHub Repository: eclipse/sumo
Path: blob/main/src/router/ROEdge.h
169666 views
1
/****************************************************************************/
2
// Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
3
// Copyright (C) 2002-2025 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
/****************************************************************************/
14
/// @file ROEdge.h
15
/// @author Daniel Krajzewicz
16
/// @author Jakob Erdmann
17
/// @author Christian Roessel
18
/// @author Michael Behrisch
19
/// @author Melanie Knocke
20
/// @author Yun-Pang Floetteroed
21
/// @author Ruediger Ebendt
22
/// @date Sept 2002
23
///
24
// A basic edge for routing applications
25
/****************************************************************************/
26
#pragma once
27
#include <config.h>
28
29
#include <string>
30
#include <map>
31
#include <vector>
32
#include <algorithm>
33
#include <utils/common/Named.h>
34
#include <utils/common/StdDefs.h>
35
#include <utils/common/ValueTimeLine.h>
36
#include <utils/common/SUMOVehicleClass.h>
37
#include <utils/common/RandHelper.h>
38
#include <utils/emissions/PollutantsInterface.h>
39
#include <utils/geom/Boundary.h>
40
#ifdef HAVE_FOX
41
#include <utils/foxtools/fxheader.h>
42
#endif
43
#include <utils/vehicle/SUMOVTypeParameter.h>
44
#include "RONode.h"
45
#include "ROVehicle.h"
46
#include <utils/router/FlippedEdge.h>
47
48
49
// ===========================================================================
50
// class declarations
51
// ===========================================================================
52
class ROLane;
53
class ROEdge;
54
55
typedef std::vector<ROEdge*> ROEdgeVector;
56
typedef std::vector<const ROEdge*> ConstROEdgeVector;
57
typedef std::vector<std::pair<const ROEdge*, const ROEdge*> > ROConstEdgePairVector;
58
59
60
// ===========================================================================
61
// class definitions
62
// ===========================================================================
63
/**
64
* @class ROEdge
65
* @brief A basic edge for routing applications
66
*
67
* The edge contains two time lines, one for the travel time and one for a second
68
* measure which may be used for computing the costs of a route. After loading
69
* the weights, it is needed to call "buildTimeLines" in order to initialise
70
* these time lines.
71
*/
72
class ROEdge : public Named, public Parameterised {
73
public:
74
/** @brief Constructor
75
*
76
* @param[in] id The id of the edge
77
* @param[in] from The node the edge begins at
78
* @param[in] to The node the edge ends at
79
* @param[in] index The numeric id of the edge
80
*/
81
ROEdge(const std::string& id, RONode* from, RONode* to, int index, const int priority, const std::string& type);
82
83
/** @brief Constructor for dummy edge, only used when building the connectivity graph **/
84
ROEdge(const std::string& id, const RONode* from, const RONode* to, SVCPermissions p);
85
86
87
/// Destructor
88
virtual ~ROEdge();
89
90
91
/// @name Set-up methods
92
//@{
93
94
/** @brief Adds a lane to the edge while loading
95
*
96
* The lane's length is adapted. Additionally, the information about allowed/disallowed
97
* vehicle classes is patched using the information stored in the lane.
98
*
99
* @param[in] lane The lane to add
100
* @todo What about vehicle-type aware connections?
101
*/
102
virtual void addLane(ROLane* lane);
103
104
105
/** @brief Adds information about a connected edge
106
*
107
* The edge s is added to "myFollowingEdges" and this edge is added as predecessor to s.
108
* @param[in] s The edge to add
109
* @todo What about vehicle-type aware connections?
110
*/
111
virtual void addSuccessor(ROEdge* s, ROEdge* via = nullptr, std::string dir = "");
112
113
114
/** @brief Sets the function of the edge
115
* @param[in] func The new function for the edge
116
*/
117
inline void setFunction(SumoXMLEdgeFunc func) {
118
myFunction = func;
119
}
120
121
122
/** @brief Sets whether the edge is a source
123
* @param[in] func The new source functionality for the edge
124
*/
125
inline void setSource(const bool isSource = true) {
126
myAmSource = isSource;
127
}
128
129
130
/** @brief Sets whether the edge is a sink
131
* @param[in] func The new sink functionality for the edge
132
*/
133
inline void setSink(const bool isSink = true) {
134
myAmSink = isSink;
135
}
136
137
138
/** @brief Sets the vehicle class specific speed limits of the edge
139
* @param[in] restrictions The restrictions for the edge
140
*/
141
inline void setRestrictions(const std::map<SUMOVehicleClass, double>* restrictions) {
142
myRestrictions = restrictions;
143
}
144
145
inline void setTimePenalty(double value) {
146
myTimePenalty = value;
147
}
148
149
inline double getTimePenalty() const {
150
return myTimePenalty;
151
}
152
153
/// @brief return whether this edge is a normal edge
154
inline bool isNormal() const {
155
return myFunction == SumoXMLEdgeFunc::NORMAL;
156
}
157
158
/// @brief return whether this edge is an internal edge
159
inline bool isInternal() const {
160
return myFunction == SumoXMLEdgeFunc::INTERNAL;
161
}
162
163
/// @brief return whether this edge is a pedestrian crossing
164
inline bool isCrossing() const {
165
return myFunction == SumoXMLEdgeFunc::CROSSING;
166
}
167
168
/// @brief return whether this edge is walking area
169
inline bool isWalkingArea() const {
170
return myFunction == SumoXMLEdgeFunc::WALKINGAREA;
171
}
172
173
inline bool isTazConnector() const {
174
return myFunction == SumoXMLEdgeFunc::CONNECTOR;
175
}
176
177
void setOtherTazConnector(const ROEdge* edge) {
178
myOtherTazConnector = edge;
179
}
180
181
const ROEdge* getOtherTazConnector() const {
182
return myOtherTazConnector;
183
}
184
185
/** @brief Builds the internal representation of the travel time/effort
186
*
187
* Should be called after weights / travel times have been loaded.
188
*
189
* In the case "weight-attribute" is one of "CO", "CO2", "HC", "NOx", "PMx", "fuel", or "electricity"
190
* the proper value (departs/s) is computed and multiplied with the travel time.
191
*
192
* @param[in] measure The name of the measure to use.
193
*/
194
void buildTimeLines(const std::string& measure, const bool boundariesOverride);
195
196
void cacheParamRestrictions(const std::vector<std::string>& restrictionKeys);
197
//@}
198
199
200
201
/// @name Getter methods
202
//@{
203
204
/** @brief Returns the function of the edge
205
* @return This edge's basic function
206
* @see SumoXMLEdgeFunc
207
*/
208
inline SumoXMLEdgeFunc getFunction() const {
209
return myFunction;
210
}
211
212
213
/** @brief Returns whether the edge acts as a sink
214
* @return whether the edge is a sink
215
*/
216
inline bool isSink() const {
217
return myAmSink;
218
}
219
220
221
/** @brief Returns the length of the edge
222
* @return This edge's length
223
*/
224
double getLength() const {
225
return myLength;
226
}
227
228
/** @brief Returns the index (numeric id) of the edge
229
* @return This edge's numerical id
230
*/
231
int getNumericalID() const {
232
return myIndex;
233
}
234
235
236
/** @brief Returns the speed allowed on this edge
237
* @return The speed allowed on this edge
238
*/
239
double getSpeedLimit() const {
240
return mySpeed;
241
}
242
243
/// @brief return a lower bound on shape.length() / myLength that is
244
// sufficient for the astar air-distance heuristic
245
double getLengthGeometryFactor() const;
246
247
/** @brief Returns the lane's maximum speed, given a vehicle's speed limit adaptation
248
* @param[in] The vehicle to return the adapted speed limit for
249
* @return This lane's resulting max. speed
250
*/
251
inline double getVClassMaxSpeed(SUMOVehicleClass vclass) const {
252
if (myRestrictions != 0) {
253
std::map<SUMOVehicleClass, double>::const_iterator r = myRestrictions->find(vclass);
254
if (r != myRestrictions->end()) {
255
return r->second;
256
}
257
}
258
return mySpeed;
259
}
260
261
262
/** @brief Returns the number of lanes this edge has
263
* @return This edge's number of lanes
264
*/
265
int getNumLanes() const {
266
return (int) myLanes.size();
267
}
268
269
270
/** @brief returns the information whether this edge is directly connected to the given
271
*
272
* @param[in] e The edge which may be connected
273
* @param[in] vClass The vehicle class for which the connectivity is checked
274
* @return Whether the given edge is a direct successor to this one
275
*/
276
bool isConnectedTo(const ROEdge& e, const SUMOVehicleClass vClass, bool ignoreTransientPermissions = false) const;
277
278
279
/** @brief Returns whether this edge prohibits the given vehicle to pass it
280
* @param[in] vehicle The vehicle for which the information has to be returned
281
* @return Whether the vehicle must not enter this edge
282
*/
283
inline bool prohibits(const ROVehicle* const vehicle) const {
284
const SUMOVehicleClass vclass = vehicle->getVClass();
285
return (myCombinedPermissions & vclass) != vclass;
286
}
287
288
inline SVCPermissions getPermissions() const {
289
return myCombinedPermissions;
290
}
291
292
/** @brief Returns whether this edge has restriction parameters forbidding the given vehicle to pass it
293
* @param[in] vehicle The vehicle for which the information has to be returned
294
* @return Whether the vehicle must not enter this edge
295
*/
296
inline bool restricts(const ROVehicle* const vehicle) const {
297
const std::vector<double>& vTypeRestrictions = vehicle->getType()->paramRestrictions;
298
assert(vTypeRestrictions.size() == myParamRestrictions.size());
299
for (int i = 0; i < (int)vTypeRestrictions.size(); i++) {
300
if (vTypeRestrictions[i] > myParamRestrictions[i]) {
301
return true;
302
}
303
}
304
return false;
305
}
306
307
308
/** @brief Returns whether this edge succeeding edges prohibit the given vehicle to pass them
309
* @param[in] vehicle The vehicle for which the information has to be returned
310
* @return Whether the vehicle may continue its route on any of the following edges
311
*/
312
bool allFollowersProhibit(const ROVehicle* const vehicle) const;
313
//@}
314
315
316
317
/// @name Methods for getting/setting travel time and cost information
318
//@{
319
320
/** @brief Adds a weight value
321
*
322
* @param[in] value The value to add
323
* @param[in] timeBegin The begin time of the interval the given value is valid for [s]
324
* @param[in] timeEnd The end time of the interval the given value is valid for [s]
325
*/
326
void addEffort(double value, double timeBegin, double timeEnd);
327
328
329
/** @brief Adds a travel time value
330
*
331
* @param[in] value The value to add
332
* @param[in] timeBegin The begin time of the interval the given value is valid for [s]
333
* @param[in] timeEnd The end time of the interval the given value is valid for [s]
334
*/
335
void addTravelTime(double value, double timeBegin, double timeEnd);
336
337
338
/** @brief Returns the number of edges this edge is connected to
339
*
340
* If this edge's type is set to "sink", 0 is returned, otherwise
341
* the number of edges stored in "myFollowingEdges".
342
*
343
* @return The number of edges following this edge
344
*/
345
int getNumSuccessors() const;
346
347
348
/** @brief Returns the following edges, restricted by vClass
349
* @param[in] vClass The vClass for which to restrict the successors
350
* @return The eligible following edges
351
*/
352
const ROEdgeVector& getSuccessors(SUMOVehicleClass vClass = SVC_IGNORING) const;
353
354
/** @brief Returns the following edges including vias, restricted by vClass
355
* @param[in] vClass The vClass for which to restrict the successors
356
* @return The eligible following edges
357
*/
358
const ROConstEdgePairVector& getViaSuccessors(SUMOVehicleClass vClass = SVC_IGNORING, bool ignoreTransientPermissions = false) const;
359
360
361
/** @brief Returns the number of edges connected to this edge
362
*
363
* If this edge's type is set to "source", 0 is returned, otherwise
364
* the number of edges stored in "myApproachingEdges".
365
*
366
* @return The number of edges reaching into this edge
367
*/
368
int getNumPredecessors() const;
369
370
371
/** @brief Returns the edge at the given position from the list of incoming edges
372
* @param[in] pos The position of the list within the list of incoming
373
* @return The incoming edge, stored at position pos
374
*/
375
const ROEdgeVector& getPredecessors() const {
376
return myApproachingEdges;
377
}
378
379
/// @brief if this edge is an internal edge, return its first normal predecessor, otherwise the edge itself
380
const ROEdge* getNormalBefore() const;
381
382
/// @brief if this edge is an internal edge, return its first normal successor, otherwise the edge itself
383
const ROEdge* getNormalAfter() const;
384
385
/** @brief Returns the effort for this edge
386
*
387
* @param[in] veh The vehicle for which the effort on this edge shall be retrieved
388
* @param[in] time The tim for which the effort shall be returned [s]
389
* @return The effort needed by the given vehicle to pass the edge at the given time
390
* @todo Recheck whether the vehicle's maximum speed is considered
391
*/
392
double getEffort(const ROVehicle* const veh, double time) const;
393
394
395
/** @brief Returns whether a travel time for this edge was loaded
396
*
397
* @param[in] time The time for which the travel time shall be returned [s]
398
* @return whether a value was loaded
399
*/
400
bool hasLoadedTravelTime(double time) const;
401
402
403
/** @brief Returns the travel time for this edge
404
*
405
* @param[in] veh The vehicle for which the travel time on this edge shall be retrieved
406
* @param[in] time The time for which the travel time shall be returned [s]
407
* @return The travel time needed by the given vehicle to pass the edge at the given time
408
*/
409
double getTravelTime(const ROVehicle* const veh, double time) const;
410
411
412
/** @brief Returns the effort for the given edge
413
*
414
* @param[in] edge The edge for which the effort shall be retrieved
415
* @param[in] veh The vehicle for which the effort on this edge shall be retrieved
416
* @param[in] time The time for which the effort shall be returned [s]
417
* @return The effort needed by the given vehicle to pass the edge at the given time
418
* @todo Recheck whether the vehicle's maximum speed is considered
419
*/
420
static inline double getEffortStatic(const ROEdge* const edge, const ROVehicle* const veh, double time) {
421
return edge->getEffort(veh, time);
422
}
423
424
425
/** @brief Returns the travel time for the given edge
426
*
427
* @param[in] edge The edge for which the travel time shall be retrieved
428
* @param[in] veh The vehicle for which the travel time on this edge shall be retrieved
429
* @param[in] time The time for which the travel time shall be returned [s]
430
* @return The traveltime needed by the given vehicle to pass the edge at the given time
431
*/
432
static inline double getTravelTimeStatic(const ROEdge* const edge, const ROVehicle* const veh, double time) {
433
return edge->getTravelTime(veh, time);
434
}
435
436
static inline double getTravelTimeStaticRandomized(const ROEdge* const edge, const ROVehicle* const veh, double time) {
437
return edge->getTravelTime(veh, time) * RandHelper::rand(1., gWeightsRandomFactor);
438
}
439
440
/// @brief Alias for getTravelTimeStatic (there is no routing device to provide aggregated travel times)
441
static inline double getTravelTimeAggregated(const ROEdge* const edge, const ROVehicle* const veh, double time) {
442
return edge->getTravelTime(veh, time);
443
}
444
445
/// @brief Return traveltime weighted by edge priority (scaled penalty for low-priority edges)
446
static inline double getTravelTimeStaticPriorityFactor(const ROEdge* const edge, const ROVehicle* const veh, double time) {
447
double result = edge->getTravelTime(veh, time);
448
// lower priority should result in higher effort (and the edge with
449
// minimum priority receives a factor of myPriorityFactor
450
const double relativeInversePrio = 1 - ((edge->getPriority() - myMinEdgePriority) / myEdgePriorityRange);
451
result *= 1 + relativeInversePrio * myPriorityFactor;
452
return result;
453
}
454
455
/** @brief Returns a lower bound for the travel time on this edge without using any stored timeLine
456
*
457
* @param[in] veh The vehicle for which the effort on this edge shall be retrieved
458
* @param[in] time The time for which the effort shall be returned [s]
459
*/
460
inline double getMinimumTravelTime(const ROVehicle* const veh) const {
461
if (isTazConnector()) {
462
return 0;
463
} else if (veh != 0) {
464
return myLength / MIN2(veh->getType()->maxSpeed, veh->getChosenSpeedFactor() * getVClassMaxSpeed(veh->getVClass()));
465
} else {
466
return myLength / mySpeed;
467
}
468
}
469
470
471
template<PollutantsInterface::EmissionType ET>
472
static double getEmissionEffort(const ROEdge* const edge, const ROVehicle* const veh, double time) {
473
double ret = 0;
474
if (!edge->getStoredEffort(time, ret)) {
475
const SUMOVTypeParameter* const type = veh->getType();
476
const double vMax = MIN2(type->maxSpeed, edge->getVClassMaxSpeed(veh->getVClass()));
477
const double accel = type->getCFParam(SUMO_ATTR_ACCEL, SUMOVTypeParameter::getDefaultAccel(type->vehicleClass)) * type->getCFParam(SUMO_ATTR_SIGMA, SUMOVTypeParameter::getDefaultImperfection(type->vehicleClass)) / 2.;
478
ret = PollutantsInterface::computeDefault(type->emissionClass, ET, vMax, accel, 0, edge->getTravelTime(veh, time), nullptr); // @todo: give correct slope
479
}
480
return ret;
481
}
482
483
484
static double getNoiseEffort(const ROEdge* const edge, const ROVehicle* const veh, double time);
485
486
static double getStoredEffort(const ROEdge* const edge, const ROVehicle* const /*veh*/, double time) {
487
double ret = 0;
488
edge->getStoredEffort(time, ret);
489
return ret;
490
}
491
//@}
492
493
494
/// @brief optimistic distance heuristic for use in routing
495
double getDistanceTo(const ROEdge* other, const bool doBoundaryEstimate = false) const;
496
497
498
/** @brief Returns all ROEdges */
499
static const ROEdgeVector& getAllEdges();
500
501
static void setGlobalOptions(const bool interpolate) {
502
myInterpolate = interpolate;
503
}
504
505
static void disableTimelineWarning() {
506
myHaveTTWarned = true;
507
}
508
509
/// @brief return the coordinates of the center of the given stop
510
static const Position getStopPosition(const SUMOVehicleParameter::Stop& stop);
511
512
/// @brief get edge priority (road class)
513
int getPriority() const {
514
return myPriority;
515
}
516
517
/// @brief get edge type
518
const std::string& getType() const {
519
return myType;
520
}
521
522
const RONode* getFromJunction() const {
523
return myFromJunction;
524
}
525
526
const RONode* getToJunction() const {
527
return myToJunction;
528
}
529
530
/** @brief Returns this edge's lanes
531
*
532
* @return This edge's lanes
533
*/
534
const std::vector<ROLane*>& getLanes() const {
535
return myLanes;
536
}
537
538
/// @brief return opposite superposable/congruent edge, if it exist and 0 else
539
inline const ROEdge* getBidiEdge() const {
540
return myBidiEdge;
541
}
542
543
/// @brief set opposite superposable/congruent edge
544
inline void setBidiEdge(const ROEdge* bidiEdge) {
545
myBidiEdge = bidiEdge;
546
}
547
548
ReversedEdge<ROEdge, ROVehicle>* getReversedRoutingEdge() const {
549
if (myReversedRoutingEdge == nullptr) {
550
myReversedRoutingEdge = new ReversedEdge<ROEdge, ROVehicle>(this);
551
}
552
return myReversedRoutingEdge;
553
}
554
555
/// @brief Returns the flipped routing edge
556
// @note If not called before, the flipped routing edge is created
557
FlippedEdge<ROEdge, RONode, ROVehicle>* getFlippedRoutingEdge() const {
558
if (myFlippedRoutingEdge == nullptr) {
559
myFlippedRoutingEdge = new FlippedEdge<ROEdge, RONode, ROVehicle>(this);
560
}
561
return myFlippedRoutingEdge;
562
}
563
564
RailEdge<ROEdge, ROVehicle>* getRailwayRoutingEdge() const {
565
if (myRailwayRoutingEdge == nullptr) {
566
myRailwayRoutingEdge = new RailEdge<ROEdge, ROVehicle>(this);
567
}
568
return myRailwayRoutingEdge;
569
}
570
571
/// @brief whether effort data was loaded for this edge
572
bool hasStoredEffort() const {
573
return myUsingETimeLine;
574
}
575
576
/// @brief initialize priority factor range
577
static bool initPriorityFactor(double priorityFactor);
578
579
protected:
580
/** @brief Retrieves the stored effort
581
*
582
* @param[in] veh The vehicle for which the effort on this edge shall be retrieved
583
* @param[in] time The tim for which the effort shall be returned
584
* @return Whether the effort is given
585
*/
586
bool getStoredEffort(double time, double& ret) const;
587
588
589
590
protected:
591
/// @brief the junctions for this edge
592
RONode* myFromJunction;
593
RONode* myToJunction;
594
595
/// @brief The index (numeric id) of the edge
596
const int myIndex;
597
598
/// @brief The edge priority (road class)
599
const int myPriority;
600
601
/// @brief the type of this edge
602
const std::string myType;
603
604
/// @brief The maximum speed allowed on this edge
605
double mySpeed;
606
607
/// @brief The length of the edge
608
double myLength;
609
610
/// @brief whether the edge is a source or a sink
611
bool myAmSink, myAmSource;
612
/// @brief Container storing passing time varying over time for the edge
613
mutable ValueTimeLine<double> myTravelTimes;
614
/// @brief Information whether the time line shall be used instead of the length value
615
bool myUsingTTTimeLine;
616
617
/// @brief Container storing passing time varying over time for the edge
618
mutable ValueTimeLine<double> myEfforts;
619
/// @brief Information whether the time line shall be used instead of the length value
620
bool myUsingETimeLine;
621
622
/// @brief Information whether to interpolate at interval boundaries
623
static bool myInterpolate;
624
625
/// @brief Information whether the edge has reported missing weights
626
static bool myHaveEWarned;
627
/// @brief Information whether the edge has reported missing weights
628
static bool myHaveTTWarned;
629
630
/// @brief List of edges that may be approached from this edge
631
ROEdgeVector myFollowingEdges;
632
633
ROConstEdgePairVector myFollowingViaEdges;
634
635
/// @brief List of edges that approached this edge
636
ROEdgeVector myApproachingEdges;
637
638
/// @brief The function of the edge
639
SumoXMLEdgeFunc myFunction;
640
641
/// The vClass speed restrictions for this edge
642
const std::map<SUMOVehicleClass, double>* myRestrictions;
643
644
/// @brief This edge's lanes
645
std::vector<ROLane*> myLanes;
646
647
/// @brief The list of allowed vehicle classes combined across lanes
648
SVCPermissions myCombinedPermissions;
649
650
/// @brief the other taz-connector if this edge isTazConnector, otherwise nullptr
651
const ROEdge* myOtherTazConnector;
652
653
/// @brief the bidirectional rail edge or nullpr
654
const ROEdge* myBidiEdge;
655
656
/// @brief The bounding rectangle of end nodes incoming or outgoing edges for taz connectors or of my own start and end node for normal edges
657
Boundary myBoundary;
658
659
/// @brief flat penalty when computing traveltime
660
double myTimePenalty;
661
662
/// @brief cached value of parameters which may restrict access
663
std::vector<double> myParamRestrictions;
664
665
static ROEdgeVector myEdges;
666
667
/// @brief Coefficient for factoring edge priority into routing weight
668
static double myPriorityFactor;
669
/// @brief Minimum priority for all edges
670
static double myMinEdgePriority;
671
/// @brief the difference between maximum and minimum priority for all edges
672
static double myEdgePriorityRange;
673
674
/// @brief The successors available for a given vClass
675
mutable std::map<SUMOVehicleClass, ROEdgeVector> myClassesSuccessorMap;
676
677
/// @brief The successors with vias available for a given vClass
678
mutable std::map<SUMOVehicleClass, ROConstEdgePairVector> myClassesViaSuccessorMap;
679
680
/// @brief a reversed version for backward routing
681
mutable ReversedEdge<ROEdge, ROVehicle>* myReversedRoutingEdge = nullptr;
682
/// @brief An extended version of the reversed edge for backward routing (used for the arc flag router)
683
mutable FlippedEdge<ROEdge, RONode, ROVehicle>* myFlippedRoutingEdge = nullptr;
684
mutable RailEdge<ROEdge, ROVehicle>* myRailwayRoutingEdge = nullptr;
685
686
#ifdef HAVE_FOX
687
/// The mutex used to avoid concurrent updates of myClassesSuccessorMap
688
mutable FXMutex myLock;
689
#endif
690
691
private:
692
/// @brief Invalidated copy constructor
693
ROEdge(const ROEdge& src);
694
695
/// @brief Invalidated assignment operator
696
ROEdge& operator=(const ROEdge& src);
697
698
};
699
700