1 /****************************************************************************/
2 // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.org/sumo
3 // Copyright (C) 2002-2019 German Aerospace Center (DLR) and others.
4 // This program and the accompanying materials
5 // are made available under the terms of the Eclipse Public License v2.0
6 // which accompanies this distribution, and is available at
7 // http://www.eclipse.org/legal/epl-v20.html
8 // SPDX-License-Identifier: EPL-2.0
9 /****************************************************************************/
10 /// @file    SUMOXMLDefinitions.cpp
11 /// @author  Daniel Krajzewicz
12 /// @author  Jakob Erdmann
13 /// @author  Clemens Honomichl
14 /// @author  Piotr Woznica
15 /// @author  Michael Behrisch
16 /// @author  Walter Bamberger
17 /// @date    Sept 2002
18 /// @version $Id$
19 ///
20 // Definitions of elements and attributes known by SUMO
21 /****************************************************************************/
22 
23 
24 // ===========================================================================
25 // included modules
26 // ===========================================================================
27 #include <config.h>
28 
29 #include <cassert>
30 #include <utils/common/StringBijection.h>
31 #include <utils/common/StringTokenizer.h>
32 
33 #include "SUMOXMLDefinitions.h"
34 
35 // ===========================================================================
36 // definitions
37 // ===========================================================================
38 
39 StringBijection<int>::Entry SUMOXMLDefinitions::tags[] = {
40     // Simulation elements
41     { "net",                        SUMO_TAG_NET },
42     { "edge",                       SUMO_TAG_EDGE },
43     { "lane",                       SUMO_TAG_LANE },
44     { "neigh",                      SUMO_TAG_NEIGH },
45     { "poi",                        SUMO_TAG_POI },
46     { "poiLane",                    SUMO_TAG_POILANE },
47     { "poly",                       SUMO_TAG_POLY },
48     { "junction",                   SUMO_TAG_JUNCTION },
49     { "restriction",                SUMO_TAG_RESTRICTION },
50     { "e1Detector",                 SUMO_TAG_E1DETECTOR },
51     { "inductionLoop",              SUMO_TAG_INDUCTION_LOOP },
52     { "e2Detector",                 SUMO_TAG_E2DETECTOR },
53     { "e2MultilaneDetector",        SUMO_TAG_E2DETECTOR_MULTILANE },
54     { "laneAreaDetector",           SUMO_TAG_LANE_AREA_DETECTOR },
55     { "e3Detector",                 SUMO_TAG_E3DETECTOR },
56     { "entryExitDetector",          SUMO_TAG_ENTRY_EXIT_DETECTOR },
57     { "edgeData",                   SUMO_TAG_MEANDATA_EDGE },
58     { "laneData",                   SUMO_TAG_MEANDATA_LANE },
59     { "detEntry",                   SUMO_TAG_DET_ENTRY },
60     { "detExit",                    SUMO_TAG_DET_EXIT },
61     { "edgeFollowDetector",         SUMO_TAG_EDGEFOLLOWDETECTOR },
62     { "instantInductionLoop",       SUMO_TAG_INSTANT_INDUCTION_LOOP },
63     { "variableSpeedSign",          SUMO_TAG_VSS },
64     { "calibrator",                 SUMO_TAG_CALIBRATOR },
65     { "laneCalibrator",             SUMO_TAG_LANECALIBRATOR },
66     { "rerouter",                   SUMO_TAG_REROUTER },
67     { "busStop",                    SUMO_TAG_BUS_STOP },
68     { "trainStop",                  SUMO_TAG_TRAIN_STOP },
69     { "ptLine",                     SUMO_TAG_PT_LINE },
70     { "access",                     SUMO_TAG_ACCESS },
71     { "containerStop",              SUMO_TAG_CONTAINER_STOP },
72     { "parkingArea",                SUMO_TAG_PARKING_AREA },
73     { "space",                      SUMO_TAG_PARKING_SPACE },
74     { "chargingStation",            SUMO_TAG_CHARGING_STATION },
75     { "vTypeProbe",                 SUMO_TAG_VTYPEPROBE },
76     { "routeProbe",                 SUMO_TAG_ROUTEPROBE },
77     { "routes",                     SUMO_TAG_ROUTES },
78     { "vehicle",                    SUMO_TAG_VEHICLE },
79     { "vType",                      SUMO_TAG_VTYPE },
80     { "route",                      SUMO_TAG_ROUTE },
81     { "request",                    SUMO_TAG_REQUEST },
82     { "source",                     SUMO_TAG_SOURCE },
83     { "taz",                        SUMO_TAG_TAZ },
84     { "tazSource",                  SUMO_TAG_TAZSOURCE },
85     { "tazSink",                    SUMO_TAG_TAZSINK },
86     { "trafficLight",               SUMO_TAG_TRAFFIC_LIGHT },
87     { "tlLogic",                    SUMO_TAG_TLLOGIC },
88     { "phase",                      SUMO_TAG_PHASE },
89     { "trip",                       SUMO_TAG_TRIP },
90     { "tripTAZ",                    SUMO_TAG_TRIP_TAZ },
91     { "flow",                       SUMO_TAG_FLOW },
92     { "calibratorFlow",             SUMO_TAG_CALIBRATORFLOW },
93     { "flowState",                  SUMO_TAG_FLOWSTATE },
94     { "step",                       SUMO_TAG_STEP },
95     { "interval",                   SUMO_TAG_INTERVAL },
96     { "timedEvent",                 SUMO_TAG_TIMEDEVENT },
97     { "fromEdge",                   SUMO_TAG_FROMEDGE },
98     { "toEdge",                     SUMO_TAG_TOEDGE },
99     { "sink",                       SUMO_TAG_SINK },
100     { "param",                      SUMO_TAG_PARAM },
101     { "WAUT",                       SUMO_TAG_WAUT },
102     { "wautSwitch",                 SUMO_TAG_WAUT_SWITCH },
103     { "wautJunction",               SUMO_TAG_WAUT_JUNCTION },
104     { "segment",                    SUMO_TAG_SEGMENT },
105     { "delete",                     SUMO_TAG_DELETE },
106     { "stop",                       SUMO_TAG_STOP },
107     { "stopBusStop",                SUMO_TAG_STOP_BUSSTOP },
108     { "stopContainerStop",          SUMO_TAG_STOP_CONTAINERSTOP },
109     { "stopChargingStation",        SUMO_TAG_STOP_CHARGINGSTATION },
110     { "stopParkingArea",            SUMO_TAG_STOP_PARKINGAREA },
111     { "stopLane",                   SUMO_TAG_STOP_LANE },
112     { "destProbReroute",            SUMO_TAG_DEST_PROB_REROUTE },
113     { "closingReroute",             SUMO_TAG_CLOSING_REROUTE },
114     { "closingLaneReroute",         SUMO_TAG_CLOSING_LANE_REROUTE },
115     { "routeProbReroute",           SUMO_TAG_ROUTE_PROB_REROUTE },
116     { "parkingAreaReroute",         SUMO_TAG_PARKING_ZONE_REROUTE },
117     { "polygonType",                SUMO_TAG_POLYTYPE },
118     { "connection",                 SUMO_TAG_CONNECTION },
119     { "prohibition",                SUMO_TAG_PROHIBITION },
120     { "split",                      SUMO_TAG_SPLIT },
121     { "node",                       SUMO_TAG_NODE },
122     { "type",                       SUMO_TAG_TYPE },
123     { "detectorDefinition",         SUMO_TAG_DETECTOR_DEFINITION },
124     { "routeDistribution",          SUMO_TAG_ROUTE_DISTRIBUTION },
125     { "vTypeDistribution",          SUMO_TAG_VTYPE_DISTRIBUTION },
126     { "vaporizer",                  SUMO_TAG_VAPORIZER },
127     { "roundabout",                 SUMO_TAG_ROUNDABOUT },
128     { "join",                       SUMO_TAG_JOIN },
129     { "joinExclude",                SUMO_TAG_JOINEXCLUDE },
130     { "crossing",                   SUMO_TAG_CROSSING },
131     { "walkingArea",                SUMO_TAG_WALKINGAREA },
132     { "stopOffset",                 SUMO_TAG_STOPOFFSET },
133     // OSM
134     { "way",                        SUMO_TAG_WAY },
135     { "nd",                         SUMO_TAG_ND },
136     { "tag",                        SUMO_TAG_TAG },
137     { "relation",                   SUMO_TAG_RELATION },
138     { "member",                     SUMO_TAG_MEMBER },
139     // View
140     { "viewsettings",               SUMO_TAG_VIEWSETTINGS },
141     { "decal",                      SUMO_TAG_VIEWSETTINGS_DECAL },
142     { "light",                      SUMO_TAG_VIEWSETTINGS_LIGHT },
143     { "scheme",                     SUMO_TAG_VIEWSETTINGS_SCHEME },
144     { "opengl",                     SUMO_TAG_VIEWSETTINGS_OPENGL },
145     { "background",                 SUMO_TAG_VIEWSETTINGS_BACKGROUND },
146     { "edges",                      SUMO_TAG_VIEWSETTINGS_EDGES },
147     { "vehicles",                   SUMO_TAG_VIEWSETTINGS_VEHICLES },
148     { "persons",                    SUMO_TAG_VIEWSETTINGS_PERSONS },
149     { "containers",                 SUMO_TAG_VIEWSETTINGS_CONTAINERS },
150     { "junctions",                  SUMO_TAG_VIEWSETTINGS_JUNCTIONS },
151     { "additionals",                SUMO_TAG_VIEWSETTINGS_ADDITIONALS },
152     { "pois",                       SUMO_TAG_VIEWSETTINGS_POIS },
153     { "polys",                      SUMO_TAG_VIEWSETTINGS_POLYS },
154     { "legend",                     SUMO_TAG_VIEWSETTINGS_LEGEND },
155     { "event",                      SUMO_TAG_VIEWSETTINGS_EVENT },
156     { "jamTime",                    SUMO_TAG_VIEWSETTINGS_EVENT_JAM_TIME },
157     { "include",                    SUMO_TAG_INCLUDE },
158     { "delay",                      SUMO_TAG_DELAY },
159     { "viewport",                   SUMO_TAG_VIEWPORT },
160     { "snapshot",                   SUMO_TAG_SNAPSHOT },
161     { "breakpoints-file",           SUMO_TAG_BREAKPOINTS_FILE },
162     { "breakpoint",                 SUMO_TAG_BREAKPOINT },
163     { "location",                   SUMO_TAG_LOCATION },
164     { "colorScheme",                SUMO_TAG_COLORSCHEME },
165     { "scalingScheme",              SUMO_TAG_SCALINGSCHEME },
166     { "entry",                      SUMO_TAG_ENTRY },
167     { "rngState",                   SUMO_TAG_RNGSTATE },
168     { "vehicleTransfer",            SUMO_TAG_VEHICLETRANSFER },
169     { "device",                     SUMO_TAG_DEVICE },
170     // Cars
171     { "carFollowing-IDM",           SUMO_TAG_CF_IDM },
172     { "carFollowing-IDMM",          SUMO_TAG_CF_IDMM },
173     { "carFollowing-Krauss",        SUMO_TAG_CF_KRAUSS },
174     { "carFollowing-KraussPS",      SUMO_TAG_CF_KRAUSS_PLUS_SLOPE },
175     { "carFollowing-KraussOrig1",   SUMO_TAG_CF_KRAUSS_ORIG1 },
176     { "carFollowing-KraussX",       SUMO_TAG_CF_KRAUSSX },
177     { "carFollowing-SmartSK",       SUMO_TAG_CF_SMART_SK },
178     { "carFollowing-Daniel1",       SUMO_TAG_CF_DANIEL1 },
179     { "carFollowing-PWagner2009",   SUMO_TAG_CF_PWAGNER2009 },
180     { "carFollowing-BKerner",       SUMO_TAG_CF_BKERNER },
181     { "carFollowing-Wiedemann",     SUMO_TAG_CF_WIEDEMANN },
182     { "carFollowing-Rail",          SUMO_TAG_CF_RAIL },
183     { "carFollowing-ACC",           SUMO_TAG_CF_ACC },
184     { "carFollowing-CACC",          SUMO_TAG_CF_CACC },
185     { "carFollowing-CC",            SUMO_TAG_CF_CC },
186     // Person
187     { "person",                     SUMO_TAG_PERSON },
188     { "personTrip",                 SUMO_TAG_PERSONTRIP },
189     { "ride",                       SUMO_TAG_RIDE },
190     { "walk",                       SUMO_TAG_WALK },
191     { "personFlow",                 SUMO_TAG_PERSONFLOW },
192     // Transport
193     { "container",                  SUMO_TAG_CONTAINER },
194     { "transport",                  SUMO_TAG_TRANSPORT },
195     { "tranship",                   SUMO_TAG_TRANSHIP },
196     //Trajectories
197     { "trajectories",               SUMO_TAG_TRAJECTORIES },
198     { "timestep",                   SUMO_TAG_TIMESTEP },
199     { "timeSlice",                  SUMO_TAG_TIMESLICE },
200     { "actorConfig",                SUMO_TAG_ACTORCONFIG },
201     { "motionState",                SUMO_TAG_MOTIONSTATE },
202     { "odPair",                     SUMO_TAG_OD_PAIR },
203     // ActivityGen statistics file
204     { "general",                    AGEN_TAG_GENERAL },
205     { "street",                     AGEN_TAG_STREET },
206     { "workHours",                  AGEN_TAG_WORKHOURS },
207     { "opening",                    AGEN_TAG_OPENING },
208     { "closing",                    AGEN_TAG_CLOSING },
209     { "schools",                    AGEN_TAG_SCHOOLS },
210     { "school",                     AGEN_TAG_SCHOOL },
211     { "busStation",                 AGEN_TAG_BUSSTATION },
212     { "busLine",                    AGEN_TAG_BUSLINE },
213     { "stations",                   AGEN_TAG_STATIONS },
214     { "revStations",                AGEN_TAG_REV_STATIONS },
215     { "station",                    AGEN_TAG_STATION },
216     { "frequency",                  AGEN_TAG_FREQUENCY },
217     { "population",                 AGEN_TAG_POPULATION },
218     { "bracket",                    AGEN_TAG_BRACKET },
219     { "cityGates",                  AGEN_TAG_CITYGATES },
220     { "entrance",                   AGEN_TAG_ENTRANCE },
221     { "parameters",                 AGEN_TAG_PARAM },
222     // Other
223     { "",                           SUMO_TAG_NOTHING } //< must be the last one
224 };
225 
226 
227 StringBijection<int>::Entry SUMOXMLDefinitions::attrs[] = {
228     // Edge
229     { "id",                     SUMO_ATTR_ID },
230     { "refId",                  SUMO_ATTR_REFID },
231     { "name",                   SUMO_ATTR_NAME },
232     { "type",                   SUMO_ATTR_TYPE },
233     { "priority",               SUMO_ATTR_PRIORITY },
234     { "numLanes",               SUMO_ATTR_NUMLANES },
235     { "speed",                  SUMO_ATTR_SPEED },
236     { "oneway",                 SUMO_ATTR_ONEWAY },
237     { "width",                  SUMO_ATTR_WIDTH },
238     { "sidewalkWidth",          SUMO_ATTR_SIDEWALKWIDTH },
239     { "bikeLaneWidth",          SUMO_ATTR_BIKELANEWIDTH },
240     { "remove",                 SUMO_ATTR_REMOVE },
241     { "length",                 SUMO_ATTR_LENGTH },
242     { "bidi",                   SUMO_ATTR_BIDI },
243     // Split
244     { "idBefore",               SUMO_ATTR_ID_BEFORE },
245     { "idAfter",                SUMO_ATTR_ID_AFTER },
246     // Positions
247     { "x",                      SUMO_ATTR_X },
248     { "y",                      SUMO_ATTR_Y },
249     { "z",                      SUMO_ATTR_Z },
250     { "centerX",                SUMO_ATTR_CENTER_X },
251     { "centerY",                SUMO_ATTR_CENTER_Y },
252     { "centerZ",                SUMO_ATTR_CENTER_Z },
253 
254     { "key",                    SUMO_ATTR_KEY },
255     { "requestSize",            SUMO_ATTR_REQUESTSIZE },
256     { "request",                SUMO_ATTR_REQUEST },
257     { "response",               SUMO_ATTR_RESPONSE },
258     { "programID",              SUMO_ATTR_PROGRAMID },
259     { "offset",                 SUMO_ATTR_OFFSET },
260     { "endOffset",              SUMO_ATTR_ENDOFFSET },
261     { "incLanes",               SUMO_ATTR_INCLANES },
262     { "intLanes",               SUMO_ATTR_INTLANES },
263 
264     { "weight",                 SUMO_ATTR_WEIGHT },
265     { "node",                   SUMO_ATTR_NODE },
266     { "edge",                   SUMO_ATTR_EDGE },
267     { "edges",                  SUMO_ATTR_EDGES },
268     // Vehicle
269     { "depart",                 SUMO_ATTR_DEPART },
270     { "departLane",             SUMO_ATTR_DEPARTLANE },
271     { "departPos",              SUMO_ATTR_DEPARTPOS },
272     { "departPosLat",           SUMO_ATTR_DEPARTPOS_LAT },
273     { "departSpeed",            SUMO_ATTR_DEPARTSPEED },
274     { "arrivalLane",            SUMO_ATTR_ARRIVALLANE },
275     { "arrivalPos",             SUMO_ATTR_ARRIVALPOS },
276     { "arrivalPosLat",          SUMO_ATTR_ARRIVALPOS_LAT },
277     { "arrivalSpeed",           SUMO_ATTR_ARRIVALSPEED },
278     { "route",                  SUMO_ATTR_ROUTE },
279     { "maxSpeed",               SUMO_ATTR_MAXSPEED },
280     { "maxSpeedLat",            SUMO_ATTR_MAXSPEED_LAT },
281     { "latAlignment",           SUMO_ATTR_LATALIGNMENT },
282     { "minGapLat",              SUMO_ATTR_MINGAP_LAT },
283     { "accel",                  SUMO_ATTR_ACCEL },
284     { "decel",                  SUMO_ATTR_DECEL },
285     { "emergencyDecel",         SUMO_ATTR_EMERGENCYDECEL },
286     { "apparentDecel",          SUMO_ATTR_APPARENTDECEL },
287     { "actionStepLength",       SUMO_ATTR_ACTIONSTEPLENGTH },
288     { "hasDriverState",         SUMO_ATTR_HASDRIVERSTATE },
289     { "vClass",                 SUMO_ATTR_VCLASS },
290     { "vClasses",               SUMO_ATTR_VCLASSES },
291     { "exceptions",             SUMO_ATTR_EXCEPTIONS },
292     { "repno",                  SUMO_ATTR_REPNUMBER },
293     { "speedFactor",            SUMO_ATTR_SPEEDFACTOR },
294     { "speedDev",               SUMO_ATTR_SPEEDDEV },
295     { "laneChangeModel",        SUMO_ATTR_LANE_CHANGE_MODEL },
296     { "carFollowModel",         SUMO_ATTR_CAR_FOLLOW_MODEL },
297     { "minGap",                 SUMO_ATTR_MINGAP },
298     { "collisionMinGapFactor",  SUMO_ATTR_COLLISION_MINGAP_FACTOR },
299     { "boardingDuration",       SUMO_ATTR_BOARDING_DURATION },
300     { "loadingDuration",        SUMO_ATTR_LOADING_DURATION },
301     // Charging Station
302     { "power",                  SUMO_ATTR_CHARGINGPOWER },
303     { "efficiency",             SUMO_ATTR_EFFICIENCY },
304     { "chargeInTransit",        SUMO_ATTR_CHARGEINTRANSIT },
305     { "chargeDelay",            SUMO_ATTR_CHARGEDELAY},
306     // MSDevice_Battery
307     { "actualBatteryCapacity",  SUMO_ATTR_ACTUALBATTERYCAPACITY },
308     { "maximumBatteryCapacity", SUMO_ATTR_MAXIMUMBATTERYCAPACITY },
309     { "maximumPower",           SUMO_ATTR_MAXIMUMPOWER },
310     { "vehicleMass",            SUMO_ATTR_VEHICLEMASS },
311     { "frontSurfaceArea",       SUMO_ATTR_FRONTSURFACEAREA },
312     { "airDragCoefficient",     SUMO_ATTR_AIRDRAGCOEFFICIENT },
313     { "internalMomentOfInertia", SUMO_ATTR_INTERNALMOMENTOFINERTIA },
314     { "radialDragCoefficient",  SUMO_ATTR_RADIALDRAGCOEFFICIENT },
315     { "rollDragCoefficient",    SUMO_ATTR_ROLLDRAGCOEFFICIENT },
316     { "constantPowerIntake",    SUMO_ATTR_CONSTANTPOWERINTAKE },
317     { "propulsionEfficiency",   SUMO_ATTR_PROPULSIONEFFICIENCY },
318     { "recuperationEfficiency", SUMO_ATTR_RECUPERATIONEFFICIENCY },
319     { "stoppingTreshold",       SUMO_ATTR_STOPPINGTRESHOLD },
320     // MSBatteryExport
321     { "energyConsumed",         SUMO_ATTR_ENERGYCONSUMED },
322     { "chargingStationId",      SUMO_ATTR_CHARGINGSTATIONID },
323     { "energyCharged",          SUMO_ATTR_ENERGYCHARGED },
324     { "energyChargedInTransit", SUMO_ATTR_ENERGYCHARGEDINTRANSIT },
325     { "energyChargedStopped",   SUMO_ATTR_ENERGYCHARGEDSTOPPED },
326     { "posOnLane",              SUMO_ATTR_POSONLANE },
327     { "timeStopped",            SUMO_ATTR_TIMESTOPPED },
328     // ChargingStation output
329     { "chargingStatus",         SUMO_ATTR_CHARGING_STATUS },
330     { "totalEnergyCharged",     SUMO_ATTR_TOTALENERGYCHARGED },
331     { "chargingSteps",          SUMO_ATTR_CHARGINGSTEPS },
332     { "totalEnergyChargedIntoVehicle",  SUMO_ATTR_TOTALENERGYCHARGED_VEHICLE },
333     { "chargingBegin",          SUMO_ATTR_CHARGINGBEGIN },
334     { "chargingEnd",            SUMO_ATTR_CHARGINGEND },
335     { "partialCharge",          SUMO_ATTR_PARTIALCHARGE },
336 
337     { "sigma",                  SUMO_ATTR_SIGMA },
338     { "tau",                    SUMO_ATTR_TAU },
339     { "tmp1",                   SUMO_ATTR_TMP1 },
340     { "tmp2",                   SUMO_ATTR_TMP2 },
341     { "tmp3",                   SUMO_ATTR_TMP3 },
342     { "tmp4",                   SUMO_ATTR_TMP4 },
343     { "tmp5",                   SUMO_ATTR_TMP5 },
344 
345     { "speedControlGain", SUMO_ATTR_SC_GAIN },
346     { "gapClosingControlGainSpeed", SUMO_ATTR_GCC_GAIN_SPEED },
347     { "gapClosingControlGainSpace", SUMO_ATTR_GCC_GAIN_SPACE },
348     { "gapControlGainSpeed", SUMO_ATTR_GC_GAIN_SPEED },
349     { "gapControlGainSpace", SUMO_ATTR_GC_GAIN_SPACE },
350     { "collisionAvoidanceGainSpeed", SUMO_ATTR_CA_GAIN_SPEED },
351     { "collisionAvoidanceGainSpace", SUMO_ATTR_CA_GAIN_SPACE },
352 
353     { "speedControlGainCACC", SUMO_ATTR_SC_GAIN_CACC },
354     { "gapClosingControlGainGap", SUMO_ATTR_GCC_GAIN_GAP_CACC },
355     { "gapClosingControlGainGapDot", SUMO_ATTR_GCC_GAIN_GAP_DOT_CACC },
356     { "gapControlGainGap", SUMO_ATTR_GC_GAIN_GAP_CACC },
357     { "gapControlGainGapDot", SUMO_ATTR_GC_GAIN_GAP_DOT_CACC },
358     { "collisionAvoidanceGainGap", SUMO_ATTR_CA_GAIN_GAP_CACC },
359     { "collisionAvoidanceGainGapDot", SUMO_ATTR_CA_GAIN_GAP_DOT_CACC },
360 
361     { "trainType",               SUMO_ATTR_TRAIN_TYPE },
362 
363     { "lcStrategic",            SUMO_ATTR_LCA_STRATEGIC_PARAM },
364     { "lcCooperative",          SUMO_ATTR_LCA_COOPERATIVE_PARAM },
365     { "lcSpeedGain",            SUMO_ATTR_LCA_SPEEDGAIN_PARAM },
366     { "lcKeepRight",            SUMO_ATTR_LCA_KEEPRIGHT_PARAM },
367     { "lcSublane",              SUMO_ATTR_LCA_SUBLANE_PARAM },
368     { "lcOpposite",             SUMO_ATTR_LCA_OPPOSITE_PARAM },
369     { "lcPushy",                SUMO_ATTR_LCA_PUSHY },
370     { "lcPushyGap",             SUMO_ATTR_LCA_PUSHYGAP },
371     { "lcAssertive",            SUMO_ATTR_LCA_ASSERTIVE },
372     { "lcImpatience",           SUMO_ATTR_LCA_IMPATIENCE },
373     { "lcTimeToImpatience",     SUMO_ATTR_LCA_TIME_TO_IMPATIENCE },
374     { "lcAccelLat",             SUMO_ATTR_LCA_ACCEL_LAT },
375     { "lcTurnAlignmentDistance", SUMO_ATTR_LCA_TURN_ALIGNMENT_DISTANCE },
376     { "lcLookaheadLeft",        SUMO_ATTR_LCA_LOOKAHEADLEFT },
377     { "lcSpeedGainRight",       SUMO_ATTR_LCA_SPEEDGAINRIGHT },
378     { "lcMaxSpeedLatStanding",  SUMO_ATTR_LCA_MAXSPEEDLATSTANDING },
379     { "lcMaxSpeedLatFactor",    SUMO_ATTR_LCA_MAXSPEEDLATFACTOR },
380     { "lcExperimental1",        SUMO_ATTR_LCA_EXPERIMENTAL1 },
381 
382     { "jmCrossingGap",          SUMO_ATTR_JM_CROSSING_GAP },
383     { "jmDriveAfterRedTime",    SUMO_ATTR_JM_DRIVE_AFTER_RED_TIME },
384     { "jmDriveRedSpeed",        SUMO_ATTR_JM_DRIVE_RED_SPEED },
385     { "jmIgnoreKeepClearTime",  SUMO_ATTR_JM_IGNORE_KEEPCLEAR_TIME },
386     { "jmIgnoreFoeSpeed",       SUMO_ATTR_JM_IGNORE_FOE_SPEED },
387     { "jmIgnoreFoeProb",        SUMO_ATTR_JM_IGNORE_FOE_PROB },
388     { "jmSigmaMinor",           SUMO_ATTR_JM_SIGMA_MINOR },
389     { "jmTimegapMinor",         SUMO_ATTR_JM_TIMEGAP_MINOR },
390 
391     { "last",                   SUMO_ATTR_LAST },
392     { "cost",                   SUMO_ATTR_COST },
393     { "savings",                SUMO_ATTR_SAVINGS },
394     { "probability",            SUMO_ATTR_PROB },
395     { "probabilities",          SUMO_ATTR_PROBS },
396     { "routes",                 SUMO_ATTR_ROUTES },
397     { "vTypes",                 SUMO_ATTR_VTYPES },
398 
399     { "lane",                   SUMO_ATTR_LANE },
400     { "lanes",                  SUMO_ATTR_LANES },
401     { "from",                   SUMO_ATTR_FROM },
402     { "to",                     SUMO_ATTR_TO },
403     { "fromLonLat",             SUMO_ATTR_FROMLONLAT },
404     { "toLonLat",               SUMO_ATTR_TOLONLAT },
405     { "fromXY",                 SUMO_ATTR_FROMXY },
406     { "toXY",                   SUMO_ATTR_TOXY },
407     { "period",                 SUMO_ATTR_PERIOD },
408     { "fromTaz",                SUMO_ATTR_FROM_TAZ },
409     { "toTaz",                  SUMO_ATTR_TO_TAZ },
410     { "reroute",                SUMO_ATTR_REROUTE },
411     { "personCapacity",         SUMO_ATTR_PERSON_CAPACITY },
412     { "containerCapacity",      SUMO_ATTR_CONTAINER_CAPACITY },
413     { "personNumber",           SUMO_ATTR_PERSON_NUMBER },
414     { "containerNumber",        SUMO_ATTR_CONTAINER_NUMBER },
415     { "modes",                  SUMO_ATTR_MODES },
416     { "walkFactor",             SUMO_ATTR_WALKFACTOR },
417 
418     { "function",               SUMO_ATTR_FUNCTION },
419     { "pos",                    SUMO_ATTR_POSITION },
420     { "posLat",                 SUMO_ATTR_POSITION_LAT },
421     { "freq",                   SUMO_ATTR_FREQUENCY },
422     { "style",                  SUMO_ATTR_STYLE },
423     { "file",                   SUMO_ATTR_FILE },
424     { "junction",               SUMO_ATTR_JUNCTION },
425     { "number",                 SUMO_ATTR_NUMBER },
426     { "duration",               SUMO_ATTR_DURATION },
427     { "until",                  SUMO_ATTR_UNTIL },
428     { "routeProbe",             SUMO_ATTR_ROUTEPROBE },
429     { "crossingEdges",          SUMO_ATTR_CROSSING_EDGES },
430     // Traffic light & Nodes
431     { "time",                   SUMO_ATTR_TIME },
432     { "begin",                  SUMO_ATTR_BEGIN },
433     { "end",                    SUMO_ATTR_END },
434     { "tl",                     SUMO_ATTR_TLID },
435     { "tlType",                 SUMO_ATTR_TLTYPE },
436     { "linkIndex",              SUMO_ATTR_TLLINKINDEX },
437     { "linkIndex2",             SUMO_ATTR_TLLINKINDEX2 },
438     { "shape",                  SUMO_ATTR_SHAPE },
439     { "spreadType",             SUMO_ATTR_SPREADTYPE },
440     { "radius",                 SUMO_ATTR_RADIUS },
441     { "customShape",            SUMO_ATTR_CUSTOMSHAPE },
442     { "keepClear",              SUMO_ATTR_KEEP_CLEAR },
443     { "rightOfWay",             SUMO_ATTR_RIGHT_OF_WAY },
444     { "fringe",                 SUMO_ATTR_FRINGE },
445     { "color",                  SUMO_ATTR_COLOR },
446     { "dir",                    SUMO_ATTR_DIR },
447     { "state",                  SUMO_ATTR_STATE },
448     { "layer",                  SUMO_ATTR_LAYER },
449     { "fill",                   SUMO_ATTR_FILL },
450     { "lineWidth",              SUMO_ATTR_LINEWIDTH },
451     { "prefix",                 SUMO_ATTR_PREFIX },
452     { "discard",                SUMO_ATTR_DISCARD },
453 
454     { "fromLane",               SUMO_ATTR_FROM_LANE },
455     { "toLane",                 SUMO_ATTR_TO_LANE },
456     { "dest",                   SUMO_ATTR_DEST },
457     { "source",                 SUMO_ATTR_SOURCE },
458     { "via",                    SUMO_ATTR_VIA },
459     { "viaLonLat",              SUMO_ATTR_VIALONLAT },
460     { "viaXY",                  SUMO_ATTR_VIAXY },
461     { "nodes",                  SUMO_ATTR_NODES },
462     { "visibility",             SUMO_ATTR_VISIBILITY_DISTANCE },
463 
464     { "minDur",                 SUMO_ATTR_MINDURATION },
465     { "maxDur",                 SUMO_ATTR_MAXDURATION },
466     { "next",                   SUMO_ATTR_NEXT },
467     { "foes",                   SUMO_ATTR_FOES },
468     // E2 detector
469     { "cont",                   SUMO_ATTR_CONT },
470     { "contPos",                SUMO_ATTR_CONTPOS },
471     { "timeThreshold",          SUMO_ATTR_HALTING_TIME_THRESHOLD },
472     { "speedThreshold",         SUMO_ATTR_HALTING_SPEED_THRESHOLD },
473     { "jamThreshold",           SUMO_ATTR_JAM_DIST_THRESHOLD },
474     { "show",                   SUMO_ATTR_SHOW_DETECTOR },
475     // E3 detector
476     { "openEntry",              SUMO_ATTR_OPEN_ENTRY },
477 
478     { "wautID",                 SUMO_ATTR_WAUT_ID },
479     { "junctionID",             SUMO_ATTR_JUNCTION_ID },
480     { "procedure",              SUMO_ATTR_PROCEDURE },
481     { "synchron",               SUMO_ATTR_SYNCHRON },
482     { "refTime",                SUMO_ATTR_REF_TIME },
483     { "startProg",              SUMO_ATTR_START_PROG },
484     { "off",                    SUMO_ATTR_OFF },
485     { "friendlyPos",            SUMO_ATTR_FRIENDLY_POS },
486     { "splitByType",            SUMO_ATTR_SPLIT_VTYPE },
487     { "uncontrolled",           SUMO_ATTR_UNCONTROLLED },
488     { "pass",                   SUMO_ATTR_PASS },
489     { "busStop",                SUMO_ATTR_BUS_STOP },
490     { "containerStop",          SUMO_ATTR_CONTAINER_STOP },
491     { "parkingArea",            SUMO_ATTR_PARKING_AREA },
492     { "roadsideCapacity",       SUMO_ATTR_ROADSIDE_CAPACITY },
493     { "onRoad",                 SUMO_ATTR_ONROAD },
494     { "chargingStation",        SUMO_ATTR_CHARGING_STATION},
495     { "line",                   SUMO_ATTR_LINE },
496     { "lines",                  SUMO_ATTR_LINES },
497     { "tripId",                 SUMO_ATTR_TRIP_ID },
498     { "intended",               SUMO_ATTR_INTENDED },
499     { "value",                  SUMO_ATTR_VALUE },
500     { "prohibitor",             SUMO_ATTR_PROHIBITOR },
501     { "prohibited",             SUMO_ATTR_PROHIBITED },
502     { "allow",                  SUMO_ATTR_ALLOW },
503     { "disallow",               SUMO_ATTR_DISALLOW },
504     { "prefer",                 SUMO_ATTR_PREFER },
505     { "controlledInner",        SUMO_ATTR_CONTROLLED_INNER },
506     { "vehsPerHour",            SUMO_ATTR_VEHSPERHOUR },
507     { "personsPerHour",         SUMO_ATTR_PERSONSPERHOUR },
508     { "output",                 SUMO_ATTR_OUTPUT },
509     { "height",                 SUMO_ATTR_HEIGHT },
510     { "guiShape",               SUMO_ATTR_GUISHAPE },
511     { "osgFile",                SUMO_ATTR_OSGFILE },
512     { "imgFile",                SUMO_ATTR_IMGFILE },
513     { "relativePath",           SUMO_ATTR_RELATIVEPATH },
514     { "angle",                  SUMO_ATTR_ANGLE },
515     { "emissionClass",          SUMO_ATTR_EMISSIONCLASS },
516     { "impatience",             SUMO_ATTR_IMPATIENCE },
517     { "startPos",               SUMO_ATTR_STARTPOS },
518     { "endPos",                 SUMO_ATTR_ENDPOS },
519     { "triggered",              SUMO_ATTR_TRIGGERED },
520     { "containerTriggered",     SUMO_ATTR_CONTAINER_TRIGGERED },
521     { "parking",                SUMO_ATTR_PARKING },
522     { "expected",               SUMO_ATTR_EXPECTED },
523     { "expectedContainers",     SUMO_ATTR_EXPECTED_CONTAINERS },
524     { "index",                  SUMO_ATTR_INDEX },
525 
526     { "entering",               SUMO_ATTR_ENTERING },
527     { "excludeEmpty",           SUMO_ATTR_EXCLUDE_EMPTY },
528     { "withInternal",           SUMO_ATTR_WITH_INTERNAL },
529     { "trackVehicles",          SUMO_ATTR_TRACK_VEHICLES },
530     { "detectPersons",          SUMO_ATTR_DETECT_PERSONS },
531     { "maxTraveltime",          SUMO_ATTR_MAX_TRAVELTIME },
532     { "minSamples",             SUMO_ATTR_MIN_SAMPLES },
533 
534     { "lon",                    SUMO_ATTR_LON },
535     { "lat",                    SUMO_ATTR_LAT },
536     { "geo",                    SUMO_ATTR_GEO },
537     { "geoShape",               SUMO_ATTR_GEOSHAPE },
538     { "lon/lat",                SUMO_ATTR_GEOPOSITION },
539     { "k",                      SUMO_ATTR_K },
540     { "v",                      SUMO_ATTR_V },
541     { "ref",                    SUMO_ATTR_REF },
542     { "href",                   SUMO_ATTR_HREF },
543     { "zoom",                   SUMO_ATTR_ZOOM },
544     { "interpolated",           SUMO_ATTR_INTERPOLATED },
545     { "threshold",              SUMO_ATTR_THRESHOLD },
546 
547     { "netOffset",              SUMO_ATTR_NET_OFFSET },
548     { "convBoundary",           SUMO_ATTR_CONV_BOUNDARY },
549     { "origBoundary",           SUMO_ATTR_ORIG_BOUNDARY },
550     { "projParameter",          SUMO_ATTR_ORIG_PROJ },
551 
552     { "tauLast",                SUMO_ATTR_CF_PWAGNER2009_TAULAST },
553     { "apProb",                 SUMO_ATTR_CF_PWAGNER2009_APPROB },
554     { "delta",                  SUMO_ATTR_CF_IDM_DELTA },
555     { "stepping",               SUMO_ATTR_CF_IDM_STEPPING },
556     { "adaptFactor",            SUMO_ATTR_CF_IDMM_ADAPT_FACTOR },
557     { "adaptTime",              SUMO_ATTR_CF_IDMM_ADAPT_TIME },
558     { "phi",                    SUMO_ATTR_CF_KERNER_PHI },
559 
560     { "security",               SUMO_ATTR_CF_WIEDEMANN_SECURITY },
561     { "estimation",             SUMO_ATTR_CF_WIEDEMANN_ESTIMATION },
562 
563     { "ccDecel",                SUMO_ATTR_CF_CC_CCDECEL },
564     { "constSpacing",           SUMO_ATTR_CF_CC_CONSTSPACING },
565     { "kp",                     SUMO_ATTR_CF_CC_KP },
566     { "lambda",                 SUMO_ATTR_CF_CC_LAMBDA },
567     { "c1",                     SUMO_ATTR_CF_CC_C1 },
568     { "xi",                     SUMO_ATTR_CF_CC_XI },
569     { "omegaN",                 SUMO_ATTR_CF_CC_OMEGAN },
570     { "tauEngine",              SUMO_ATTR_CF_CC_TAU },
571     { "lanesCount",             SUMO_ATTR_CF_CC_LANES_COUNT },
572     { "ccAccel",                SUMO_ATTR_CF_CC_CCACCEL },
573     { "ploegKp",                SUMO_ATTR_CF_CC_PLOEG_KP },
574     { "ploegKd",                SUMO_ATTR_CF_CC_PLOEG_KD },
575     { "ploegH",                 SUMO_ATTR_CF_CC_PLOEG_H },
576     { "flatbedKa",              SUMO_ATTR_CF_CC_FLATBED_KA },
577     { "flatbedKv",              SUMO_ATTR_CF_CC_FLATBED_KV },
578     { "flatbedKp",              SUMO_ATTR_CF_CC_FLATBED_KP },
579     { "flatbedD",               SUMO_ATTR_CF_CC_FLATBED_D },
580     { "flatbedH",               SUMO_ATTR_CF_CC_FLATBED_H },
581 
582     { "generateWalks",          SUMO_ATTR_GENERATE_WALKS },
583     { "actType",                SUMO_ATTR_ACTTYPE },
584     { "slope",                  SUMO_ATTR_SLOPE },
585     { "version",                SUMO_ATTR_VERSION },
586     { "junctionCornerDetail",   SUMO_ATTR_CORNERDETAIL },
587     { "junctionLinkDetail",     SUMO_ATTR_LINKDETAIL },
588     { "rectangularLaneCut",     SUMO_ATTR_RECTANGULAR_LANE_CUT },
589     { "walkingareas",           SUMO_ATTR_WALKINGAREAS },
590     { "lefthand",               SUMO_ATTR_LEFTHAND },
591     { "limitTurnSpeed",         SUMO_ATTR_LIMIT_TURN_SPEED },
592     { "checkLaneFoesAll",       SUMO_ATTR_CHECKLANEFOES_ALL },
593     { "checkLaneFoesRoundabout", SUMO_ATTR_CHECKLANEFOES_ROUNDABOUT },
594 
595     { "actorConfig",            SUMO_ATTR_ACTORCONFIG },
596     { "vehicle",                SUMO_ATTR_VEHICLE },
597     { "startTime",              SUMO_ATTR_STARTTIME },
598     { "vehicleClass",           SUMO_ATTR_VEHICLECLASS },
599     { "fuel",                   SUMO_ATTR_FUEL },
600     { "acceleration",           SUMO_ATTR_ACCELERATION },
601     { "amount",                 SUMO_ATTR_AMOUNT },
602     { "origin",                 SUMO_ATTR_ORIGIN },
603     { "destination",            SUMO_ATTR_DESTINATION },
604     { "visible",                SUMO_ATTR_VISIBLE },
605 
606 #ifndef WIN32
607     { "commandPosix",   SUMO_ATTR_COMMAND },
608 #else
609     { "commandWindows", SUMO_ATTR_COMMAND },
610 #endif
611 
612     // ActivityGen statistics file
613     { "inhabitants",            AGEN_ATTR_INHABITANTS },
614     { "households",             AGEN_ATTR_HOUSEHOLDS },
615     { "childrenAgeLimit",       AGEN_ATTR_CHILDREN },
616     { "retirementAgeLimit",     AGEN_ATTR_RETIREMENT },
617     { "carRate",                AGEN_ATTR_CARS },
618     { "unemploymentRate",       AGEN_ATTR_UNEMPLOYEMENT },
619     { "laborDemand",            AGEN_ATTR_LABORDEMAND },
620     { "footDistanceLimit",      AGEN_ATTR_MAX_FOOT_DIST },
621     { "incomingTraffic",        AGEN_ATTR_IN_TRAFFIC },
622     { "incoming",               AGEN_ATTR_INCOMING },
623     { "outgoingTraffic",        AGEN_ATTR_OUT_TRAFFIC },
624     { "outgoing",               AGEN_ATTR_OUTGOING },
625     { "population",             AGEN_ATTR_POPULATION },
626     { "workPosition",           AGEN_ATTR_OUT_WORKPOSITION },
627     { "hour",                   AGEN_ATTR_HOUR },
628     { "proportion",             AGEN_ATTR_PROP },
629     { "capacity",               AGEN_ATTR_CAPACITY },
630     { "opening",                AGEN_ATTR_OPENING },
631     { "closing",                AGEN_ATTR_CLOSING },
632     { "maxTripDuration",        AGEN_ATTR_MAX_TRIP_DURATION },
633     { "rate",                   AGEN_ATTR_RATE },
634     { "beginAge",               AGEN_ATTR_BEGINAGE },
635     { "endAge",                 AGEN_ATTR_ENDAGE },
636     { "peopleNbr",              AGEN_ATTR_PEOPLENBR },
637     { "carPreference",          AGEN_ATTR_CARPREF },
638     { "meanTimePerKmInCity",    AGEN_ATTR_CITYSPEED },
639     { "freeTimeActivityRate",   AGEN_ATTR_FREETIMERATE },
640     { "uniformRandomTraffic",   AGEN_ATTR_UNI_RAND_TRAFFIC },
641     { "departureVariation",     AGEN_ATTR_DEP_VARIATION },
642 
643     // netEdit
644     { "selected",                           GNE_ATTR_SELECTED },
645     { "modificationStatusNotForPrinting",   GNE_ATTR_MODIFICATION_STATUS },
646     { "shapeStart",                         GNE_ATTR_SHAPE_START },
647     { "shapeEnd",                           GNE_ATTR_SHAPE_END },
648     { "bidiRail",                           GNE_ATTR_BIDIR },
649     { "blockMovement",                      GNE_ATTR_BLOCK_MOVEMENT },
650     { "blockShape",                         GNE_ATTR_BLOCK_SHAPE },
651     { "closedShape",                        GNE_ATTR_CLOSE_SHAPE },
652     { "parentItem",                         GNE_ATTR_PARENT },
653     { "genericParameter",                   GNE_ATTR_GENERIC },
654     { "defaultVTypeModified",               GNE_ATTR_DEFAULT_VTYPE_MODIFIED },
655 
656     { "targetLanes", SUMO_ATTR_TARGETLANE },
657     { "crossing", SUMO_ATTR_CROSSING },
658 
659     { "xmlns:xsi", SUMO_ATTR_XMLNS },
660     { "xsi:noNamespaceSchemaLocation", SUMO_ATTR_SCHEMA_LOCATION },
661 
662     //@name RNG state saving attributes
663     // @{
664     { "default",           SUMO_ATTR_RNG_DEFAULT },
665     { "routeHandler",      SUMO_ATTR_RNG_ROUTEHANDLER },
666     { "insertionControl",  SUMO_ATTR_RNG_INSERTIONCONTROL },
667     { "device",            SUMO_ATTR_RNG_DEVICE },
668     { "device.btreceiver", SUMO_ATTR_RNG_DEVICE_BT },
669     { "driverState",       SUMO_ATTR_RNG_DRIVERSTATE },
670     // @}
671 
672     // Other
673     { "",                       SUMO_ATTR_NOTHING } //< must be the last one
674 };
675 
676 
677 const std::string SUMO_PARAM_ORIGID("origId");
678 
679 
680 StringBijection<SumoXMLNodeType>::Entry SUMOXMLDefinitions::sumoNodeTypeValues[] = {
681     {"traffic_light",               NODETYPE_TRAFFIC_LIGHT},
682     {"traffic_light_unregulated",   NODETYPE_TRAFFIC_LIGHT_NOJUNCTION},
683     {"traffic_light_right_on_red",  NODETYPE_TRAFFIC_LIGHT_RIGHT_ON_RED},
684     {"rail_signal",                 NODETYPE_RAIL_SIGNAL},
685     {"rail_crossing",               NODETYPE_RAIL_CROSSING},
686     {"priority",                    NODETYPE_PRIORITY},
687     {"priority_stop",               NODETYPE_PRIORITY_STOP},
688     {"right_before_left",           NODETYPE_RIGHT_BEFORE_LEFT},
689     {"allway_stop",                 NODETYPE_ALLWAY_STOP},
690     {"zipper",                      NODETYPE_ZIPPER},
691     {"district",                    NODETYPE_DISTRICT},
692     {"unregulated",                 NODETYPE_NOJUNCTION},
693     {"internal",                    NODETYPE_INTERNAL},
694     {"dead_end",                    NODETYPE_DEAD_END},
695     {"DEAD_END",                    NODETYPE_DEAD_END_DEPRECATED},
696     {"unknown",                     NODETYPE_UNKNOWN} //< must be the last one
697 };
698 
699 
700 StringBijection<SumoXMLEdgeFunc>::Entry SUMOXMLDefinitions::sumoEdgeFuncValues[] = {
701     {"unknown",     EDGEFUNC_UNKNOWN},
702     {"normal",      EDGEFUNC_NORMAL},
703     {"connector",   EDGEFUNC_CONNECTOR},
704     {"crossing",    EDGEFUNC_CROSSING},
705     {"walkingarea", EDGEFUNC_WALKINGAREA},
706     {"internal",    EDGEFUNC_INTERNAL} //< must be the last one
707 };
708 
709 
710 StringBijection<LaneSpreadFunction>::Entry SUMOXMLDefinitions::laneSpreadFunctionValues[] = {
711     {"right",   LANESPREAD_RIGHT }, // default
712     {"center",  LANESPREAD_CENTER } //< must be the last one
713 };
714 
715 StringBijection<RightOfWay>::Entry SUMOXMLDefinitions::rightOfWayValuesInitializer[] = {
716     {"edgePriority", RIGHT_OF_WAY_EDGEPRIORITY },
717     {"default",      RIGHT_OF_WAY_DEFAULT } // default (must be the last one)
718 };
719 
720 StringBijection<FringeType>::Entry SUMOXMLDefinitions::fringeTypeValuesInitializer[] = {
721     {"outer",   FRINGE_TYPE_OUTER },
722     {"inner",   FRINGE_TYPE_INNER },
723     {"default", FRINGE_TYPE_DEFAULT } // default (must be the last one)
724 };
725 
726 StringBijection<PersonMode>::Entry SUMOXMLDefinitions::personModeValuesInitializer[] = {
727     {"none",    PERSONMODE_NONE},
728     {"walk",    PERSONMODE_WALK},
729     {"bicycle", PERSONMODE_BICYCLE },
730     {"car",     PERSONMODE_CAR },
731     {"public",  PERSONMODE_PUBLIC} // (must be the last one)
732 };
733 
734 StringBijection<LinkState>::Entry SUMOXMLDefinitions::linkStateValues[] = {
735     { "G", LINKSTATE_TL_GREEN_MAJOR },
736     { "g", LINKSTATE_TL_GREEN_MINOR },
737     { "r", LINKSTATE_TL_RED },
738     { "u", LINKSTATE_TL_REDYELLOW },
739     { "Y", LINKSTATE_TL_YELLOW_MAJOR },
740     { "y", LINKSTATE_TL_YELLOW_MINOR },
741     { "o", LINKSTATE_TL_OFF_BLINKING },
742     { "O", LINKSTATE_TL_OFF_NOSIGNAL },
743     { "M", LINKSTATE_MAJOR },
744     { "m", LINKSTATE_MINOR },
745     { "=", LINKSTATE_EQUAL },
746     { "s", LINKSTATE_STOP },
747     { "w", LINKSTATE_ALLWAY_STOP },
748     { "Z", LINKSTATE_ZIPPER },
749     { "-", LINKSTATE_DEADEND } //< must be the last one
750 };
751 
752 const char SUMOXMLDefinitions::AllowedTLS_linkStatesInitializer[] = {
753     LINKSTATE_TL_GREEN_MAJOR,
754     LINKSTATE_TL_GREEN_MINOR,
755     LINKSTATE_STOP, // used for NODETYPE_TRAFFIC_LIGHT_RIGHT_ON_RED
756     LINKSTATE_TL_RED,
757     LINKSTATE_TL_REDYELLOW,
758     LINKSTATE_TL_YELLOW_MAJOR,
759     LINKSTATE_TL_YELLOW_MINOR,
760     LINKSTATE_TL_OFF_BLINKING,
761     LINKSTATE_TL_OFF_NOSIGNAL
762 };
763 const std::string SUMOXMLDefinitions::ALLOWED_TLS_LINKSTATES(AllowedTLS_linkStatesInitializer, 9);
764 
765 StringBijection<LinkDirection>::Entry SUMOXMLDefinitions::linkDirectionValues[] = {
766     { "s",      LINKDIR_STRAIGHT },
767     { "t",      LINKDIR_TURN },
768     { "T",      LINKDIR_TURN_LEFTHAND },
769     { "l",      LINKDIR_LEFT },
770     { "r",      LINKDIR_RIGHT },
771     { "L",      LINKDIR_PARTLEFT },
772     { "R",      LINKDIR_PARTRIGHT },
773     { "invalid", LINKDIR_NODIR } //< must be the last one
774 };
775 
776 
777 StringBijection<TrafficLightType>::Entry SUMOXMLDefinitions::trafficLightTypesValues[] = {
778     { "static",         TLTYPE_STATIC },
779     { "railSignal",     TLTYPE_RAIL_SIGNAL },
780     { "railCrossing",   TLTYPE_RAIL_CROSSING },
781     { "actuated",       TLTYPE_ACTUATED },
782     { "delay_based",    TLTYPE_DELAYBASED },
783     { "sotl_phase",     TLTYPE_SOTL_PHASE },
784     { "sotl_platoon",   TLTYPE_SOTL_PLATOON },
785     { "sotl_request",   TLTYPE_SOTL_REQUEST },
786     { "sotl_wave",      TLTYPE_SOTL_WAVE },
787     { "sotl_marching",  TLTYPE_SOTL_MARCHING },
788     { "swarm",          TLTYPE_SWARM_BASED },
789     { "deterministic",  TLTYPE_HILVL_DETERMINISTIC },
790     { "off",            TLTYPE_OFF },
791     { "<invalid>",      TLTYPE_INVALID } //< must be the last one
792 };
793 
794 
795 StringBijection<LaneChangeModel>::Entry SUMOXMLDefinitions::laneChangeModelValues[] = {
796     { "DK2008",     LCM_DK2008 },
797     { "LC2013",     LCM_LC2013 },
798     { "SL2015",     LCM_SL2015 },
799     { "default",    LCM_DEFAULT } //< must be the last one
800 };
801 
802 StringBijection<SumoXMLTag>::Entry SUMOXMLDefinitions::carFollowModelValues[] = {
803     { "IDM",         SUMO_TAG_CF_IDM },
804     { "IDMM",        SUMO_TAG_CF_IDMM },
805     { "Krauss",      SUMO_TAG_CF_KRAUSS },
806     { "KraussPS",    SUMO_TAG_CF_KRAUSS_PLUS_SLOPE },
807     { "KraussOrig1", SUMO_TAG_CF_KRAUSS_ORIG1 },
808     { "KraussX",     SUMO_TAG_CF_KRAUSSX }, // experimental extensions to the Krauss model
809     { "SmartSK",     SUMO_TAG_CF_SMART_SK },
810     { "Daniel1",     SUMO_TAG_CF_DANIEL1 },
811     { "PWagner2009", SUMO_TAG_CF_PWAGNER2009 },
812     { "BKerner",     SUMO_TAG_CF_BKERNER },
813     { "Rail",        SUMO_TAG_CF_RAIL },
814     { "CC",          SUMO_TAG_CF_CC },
815     { "ACC",         SUMO_TAG_CF_ACC },
816     { "CACC",        SUMO_TAG_CF_CACC },
817     { "Wiedemann",   SUMO_TAG_CF_WIEDEMANN } //< must be the last one
818 };
819 
820 StringBijection<LateralAlignment>::Entry SUMOXMLDefinitions::lateralAlignmentValues[] = {
821     { "right",         LATALIGN_RIGHT },
822     { "center",        LATALIGN_CENTER },
823     { "arbitrary",     LATALIGN_ARBITRARY },
824     { "nice",          LATALIGN_NICE },
825     { "compact",       LATALIGN_COMPACT },
826     { "left",          LATALIGN_LEFT } //< must be the last one
827 };
828 
829 StringBijection<LaneChangeAction>::Entry SUMOXMLDefinitions::laneChangeActionValues[] = {
830     { "stay",        LCA_STAY },
831     { "left",        LCA_LEFT },
832     { "right",       LCA_RIGHT },
833     { "strategic",   LCA_STRATEGIC },
834     { "cooperative", LCA_COOPERATIVE },
835     { "speedGain",   LCA_SPEEDGAIN },
836     { "keepRight",   LCA_KEEPRIGHT },
837     { "sublane",     LCA_SUBLANE },
838     { "traci",       LCA_TRACI },
839     { "urgent",      LCA_URGENT },
840     { "overlapping", LCA_OVERLAPPING },
841     { "blocked",     LCA_BLOCKED },
842     { "amBL",        LCA_AMBLOCKINGLEADER },
843     { "amBF",        LCA_AMBLOCKINGFOLLOWER },
844     { "amBB",        LCA_AMBACKBLOCKER },
845     { "amBBS",       LCA_AMBACKBLOCKER_STANDING },
846     { "MR",          LCA_MRIGHT },
847     { "ML",          LCA_MLEFT },
848 
849     { "unknown",     LCA_UNKNOWN } //< must be the last one
850 };
851 
852 StringBijection<TrainType>::Entry SUMOXMLDefinitions::trainTypeValues[] = {
853     { "NGT400",     TRAINTYPE_NGT400 },
854     { "NGT400_16",  TRAINTYPE_NGT400_16 },
855     { "RB425",      TRAINTYPE_RB425 },
856     { "RB628",      TRAINTYPE_RB628 },
857     { "ICE1",       TRAINTYPE_ICE1 },
858     { "REDosto7",   TRAINTYPE_REDOSTO7 },
859     { "Freight",    TRAINTYPE_FREIGHT },
860     { "ICE3",       TRAINTYPE_ICE3 }
861 };
862 
863 
864 StringBijection<int> SUMOXMLDefinitions::Tags(
865     SUMOXMLDefinitions::tags, SUMO_TAG_NOTHING);
866 
867 StringBijection<int> SUMOXMLDefinitions::Attrs(
868     SUMOXMLDefinitions::attrs, SUMO_ATTR_NOTHING);
869 
870 StringBijection<SumoXMLNodeType> SUMOXMLDefinitions::NodeTypes(
871     SUMOXMLDefinitions::sumoNodeTypeValues, NODETYPE_UNKNOWN);
872 
873 StringBijection<SumoXMLEdgeFunc> SUMOXMLDefinitions::EdgeFunctions(
874     SUMOXMLDefinitions::sumoEdgeFuncValues, EDGEFUNC_INTERNAL);
875 
876 StringBijection<LaneSpreadFunction> SUMOXMLDefinitions::LaneSpreadFunctions(
877     SUMOXMLDefinitions::laneSpreadFunctionValues, LANESPREAD_CENTER);
878 
879 StringBijection<RightOfWay> SUMOXMLDefinitions::RightOfWayValues(
880     SUMOXMLDefinitions::rightOfWayValuesInitializer, RIGHT_OF_WAY_DEFAULT);
881 
882 StringBijection<FringeType> SUMOXMLDefinitions::FringeTypeValues(
883     SUMOXMLDefinitions::fringeTypeValuesInitializer, FRINGE_TYPE_DEFAULT);
884 
885 StringBijection<PersonMode> SUMOXMLDefinitions::PersonModeValues(
886     SUMOXMLDefinitions::personModeValuesInitializer, PERSONMODE_PUBLIC);
887 
888 StringBijection<LinkState> SUMOXMLDefinitions::LinkStates(
889     SUMOXMLDefinitions::linkStateValues, LINKSTATE_DEADEND);
890 
891 StringBijection<LinkDirection> SUMOXMLDefinitions::LinkDirections(
892     SUMOXMLDefinitions::linkDirectionValues, LINKDIR_NODIR);
893 
894 StringBijection<TrafficLightType> SUMOXMLDefinitions::TrafficLightTypes(
895     SUMOXMLDefinitions::trafficLightTypesValues, TLTYPE_INVALID);
896 
897 StringBijection<LaneChangeModel> SUMOXMLDefinitions::LaneChangeModels(
898     SUMOXMLDefinitions::laneChangeModelValues, LCM_DEFAULT);
899 
900 StringBijection<SumoXMLTag> SUMOXMLDefinitions::CarFollowModels(
901     SUMOXMLDefinitions::carFollowModelValues, SUMO_TAG_CF_WIEDEMANN);
902 
903 StringBijection<LateralAlignment> SUMOXMLDefinitions::LateralAlignments(
904     SUMOXMLDefinitions::lateralAlignmentValues, LATALIGN_LEFT);
905 
906 StringBijection<LaneChangeAction> SUMOXMLDefinitions::LaneChangeActions(
907     SUMOXMLDefinitions::laneChangeActionValues, LCA_UNKNOWN);
908 
909 StringBijection<TrainType> SUMOXMLDefinitions::TrainTypes(
910     SUMOXMLDefinitions::trainTypeValues, TRAINTYPE_NGT400);
911 
912 
913 std::string
getJunctionIDFromInternalEdge(const std::string internalEdge)914 SUMOXMLDefinitions::getJunctionIDFromInternalEdge(const std::string internalEdge) {
915     assert(internalEdge[0] == ':');
916     return internalEdge.substr(1, internalEdge.rfind('_') - 1);
917 }
918 
919 
920 std::string
getEdgeIDFromLane(const std::string laneID)921 SUMOXMLDefinitions::getEdgeIDFromLane(const std::string laneID) {
922     return laneID.substr(0, laneID.rfind('_'));
923 }
924 
925 
926 bool
isValidNetID(const std::string & value)927 SUMOXMLDefinitions::isValidNetID(const std::string& value) {
928     return (value.size() > 0) && value.find_first_of(" \t\n\r|\\'\";,:!<>&*?") == std::string::npos;
929 }
930 
931 
932 bool
isValidVehicleID(const std::string & value)933 SUMOXMLDefinitions::isValidVehicleID(const std::string& value) {
934     return (value.size() > 0) && value.find_first_of(" \t\n\r|\\'\";,!<>&*?") == std::string::npos;
935 }
936 
937 
938 bool
isValidTypeID(const std::string & value)939 SUMOXMLDefinitions::isValidTypeID(const std::string& value) {
940     return (value.size() > 0) && value.find_first_of(" \t\n\r|\\'\";,<>&*?") == std::string::npos;
941 }
942 
943 
944 bool
isValidDetectorID(const std::string & value)945 SUMOXMLDefinitions::isValidDetectorID(const std::string& value) {
946     return (value.size() > 0) && value.find_first_of("\t\n\r|\\'\";,:!<>&*?") == std::string::npos;
947 }
948 
949 
950 bool
isValidAttribute(const std::string & value)951 SUMOXMLDefinitions::isValidAttribute(const std::string& value) {
952     return value.find_first_of("\t\n\r@$%^&/|\\{}*'\";:<>") == std::string::npos;
953 }
954 
955 
956 bool
isValidFilename(const std::string & value)957 SUMOXMLDefinitions::isValidFilename(const std::string& value) {
958     return (value.find_first_of("\t\n\r@$%^&|\\{}*'\";:<>") == std::string::npos);
959 }
960 
961 
962 bool
isValidListOfNetIDs(const std::string & value)963 SUMOXMLDefinitions::isValidListOfNetIDs(const std::string& value) {
964     const std::vector<std::string>& typeIDs = StringTokenizer(value).getVector();
965     if (typeIDs.empty()) {
966         return false;
967     } else {
968         // check that gives IDs are valid
969         for (auto i : typeIDs) {
970             if (!SUMOXMLDefinitions::isValidNetID(i)) {
971                 return false;
972             }
973         }
974         return true;
975     }
976 }
977 
978 
979 bool
isValidListOfTypeID(const std::string & value)980 SUMOXMLDefinitions::isValidListOfTypeID(const std::string& value) {
981     const std::vector<std::string>& typeIDs = StringTokenizer(value).getVector();
982     if (typeIDs.empty()) {
983         return false;
984     } else {
985         // check that gives IDs are valid
986         for (auto i : typeIDs) {
987             if (!SUMOXMLDefinitions::isValidTypeID(i)) {
988                 return false;
989             }
990         }
991         return true;
992     }
993 }
994 
995 
996 bool
isValidGenericParameterKey(const std::string & value)997 SUMOXMLDefinitions::isValidGenericParameterKey(const std::string& value) {
998     // Generic parameters keys cannot be empty
999     return (value.size() > 0);
1000 }
1001 
1002 
1003 bool
isValidGenericParameterValue(const std::string &)1004 SUMOXMLDefinitions::isValidGenericParameterValue(const std::string& /*value*/) {
1005     // Generic parameters should not be restricted (characters such as <>'" only
1006     // reach this function if they are properly escaped in the xml inputs (and
1007     // they are also escaped when writing)
1008     return true;
1009 }
1010 
1011 /****************************************************************************/
1012 
1013