LCOV - code coverage report
Current view: top level - src/utils/common - SUMOVehicleClass.cpp (source / functions) Hit Total Coverage
Test: lcov.info Lines: 148 196 75.5 %
Date: 2024-05-02 15:31:40 Functions: 28 37 75.7 %

          Line data    Source code
       1             : /****************************************************************************/
       2             : // Eclipse SUMO, Simulation of Urban MObility; see https://eclipse.dev/sumo
       3             : // Copyright (C) 2001-2024 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    SUMOVehicleClass.cpp
      15             : /// @author  Daniel Krajzewicz
      16             : /// @author  Jakob Erdmann
      17             : /// @author  Michael Behrisch
      18             : /// @author  Walter Bamberger
      19             : /// @author  Laura Bieker-Walz
      20             : /// @date    2006-01-24
      21             : ///
      22             : // Definitions of SUMO vehicle classes and helper functions
      23             : /****************************************************************************/
      24             : #include <config.h>
      25             : 
      26             : #include <string>
      27             : #include <map>
      28             : #include "SUMOVehicleClass.h"
      29             : #include <utils/common/StringUtils.h>
      30             : #include <utils/common/ToString.h>
      31             : #include <utils/common/MsgHandler.h>
      32             : #include <utils/common/StringTokenizer.h>
      33             : #include <utils/iodevices/OutputDevice.h>
      34             : #include <utils/xml/SUMOSAXAttributes.h>
      35             : 
      36             : 
      37             : // ===========================================================================
      38             : // static members
      39             : // ===========================================================================
      40             : 
      41             : static StringBijection<SUMOVehicleClass>::Entry sumoVehicleClassStringInitializer[] = {
      42             :     {"ignoring",          SVC_IGNORING},
      43             :     {"private",           SVC_PRIVATE},
      44             :     {"public_emergency",  SVC_EMERGENCY}, // !!! deprecated
      45             :     {"emergency",         SVC_EMERGENCY},
      46             :     {"public_authority",  SVC_AUTHORITY}, // !!! deprecated
      47             :     {"authority",         SVC_AUTHORITY},
      48             :     {"public_army",       SVC_ARMY}, // !!! deprecated
      49             :     {"army",              SVC_ARMY},
      50             :     {"vip",               SVC_VIP},
      51             :     {"passenger",         SVC_PASSENGER},
      52             :     {"hov",               SVC_HOV},
      53             :     {"taxi",              SVC_TAXI},
      54             :     {"public_transport",  SVC_BUS}, // !!! deprecated
      55             :     {"bus",               SVC_BUS},
      56             :     {"coach",             SVC_COACH},
      57             :     {"delivery",          SVC_DELIVERY},
      58             :     {"transport",         SVC_TRUCK}, // !!! deprecated
      59             :     {"truck",             SVC_TRUCK},
      60             :     {"trailer",           SVC_TRAILER},
      61             :     {"lightrail",         SVC_TRAM}, // !!! deprecated
      62             :     {"tram",              SVC_TRAM},
      63             :     {"cityrail",          SVC_RAIL_URBAN}, // !!! deprecated
      64             :     {"rail_urban",        SVC_RAIL_URBAN},
      65             :     {"rail_slow",         SVC_RAIL}, // !!! deprecated
      66             :     {"rail",              SVC_RAIL},
      67             :     {"rail_fast",         SVC_RAIL_FAST},
      68             :     {"rail_electric",     SVC_RAIL_ELECTRIC},
      69             :     {"motorcycle",        SVC_MOTORCYCLE},
      70             :     {"moped",             SVC_MOPED},
      71             :     {"bicycle",           SVC_BICYCLE},
      72             :     {"pedestrian",        SVC_PEDESTRIAN},
      73             :     {"evehicle",          SVC_E_VEHICLE},
      74             :     {"ship",              SVC_SHIP},
      75             :     {"container",         SVC_CONTAINER},
      76             :     {"cable_car",         SVC_CABLE_CAR},
      77             :     {"subway",            SVC_SUBWAY},
      78             :     {"aircraft",          SVC_AIRCRAFT},
      79             :     {"wheelchair",        SVC_WHEELCHAIR},
      80             :     {"scooter",           SVC_SCOOTER},
      81             :     {"drone",             SVC_DRONE},
      82             :     {"custom1",           SVC_CUSTOM1},
      83             :     {"custom2",           SVC_CUSTOM2}
      84             : };
      85             : 
      86             : 
      87             : StringBijection<SUMOVehicleClass> SumoVehicleClassStrings(
      88             :     sumoVehicleClassStringInitializer, SVC_CUSTOM2, false);
      89             : 
      90             : // count only non-deprecated classes
      91             : const int NUM_VCLASSES = SumoVehicleClassStrings.size() - 8;
      92             : 
      93             : std::set<std::string> deprecatedVehicleClassesSeen;
      94             : 
      95             : 
      96             : static StringBijection<SUMOVehicleShape>::Entry sumoVehicleShapeStringInitializer[] = {
      97             :     {"pedestrian",            SUMOVehicleShape::PEDESTRIAN},
      98             :     {"bicycle",               SUMOVehicleShape::BICYCLE},
      99             :     {"moped",                 SUMOVehicleShape::MOPED},
     100             :     {"motorcycle",            SUMOVehicleShape::MOTORCYCLE},
     101             :     {"passenger",             SUMOVehicleShape::PASSENGER},
     102             :     {"passenger/sedan",       SUMOVehicleShape::PASSENGER_SEDAN},
     103             :     {"passenger/hatchback",   SUMOVehicleShape::PASSENGER_HATCHBACK},
     104             :     {"passenger/wagon",       SUMOVehicleShape::PASSENGER_WAGON},
     105             :     {"passenger/van",         SUMOVehicleShape::PASSENGER_VAN},
     106             :     {"taxi",                  SUMOVehicleShape::TAXI},
     107             :     {"delivery",              SUMOVehicleShape::DELIVERY},
     108             :     {"transport",             SUMOVehicleShape::TRUCK}, // !!! deprecated
     109             :     {"truck",                 SUMOVehicleShape::TRUCK},
     110             :     {"transport/semitrailer", SUMOVehicleShape::TRUCK_SEMITRAILER}, // !!! deprecated
     111             :     {"truck/semitrailer",     SUMOVehicleShape::TRUCK_SEMITRAILER},
     112             :     {"transport/trailer",     SUMOVehicleShape::TRUCK_1TRAILER}, // !!! deprecated
     113             :     {"truck/trailer",         SUMOVehicleShape::TRUCK_1TRAILER},
     114             :     {"bus/city",              SUMOVehicleShape::BUS}, // !!! deprecated
     115             :     {"bus",                   SUMOVehicleShape::BUS},
     116             :     {"bus/overland",          SUMOVehicleShape::BUS_COACH}, // !!! deprecated
     117             :     {"bus/coach",             SUMOVehicleShape::BUS_COACH},
     118             :     {"bus/flexible",          SUMOVehicleShape::BUS_FLEXIBLE},
     119             :     {"bus/trolley",           SUMOVehicleShape::BUS_TROLLEY},
     120             :     {"rail/slow",             SUMOVehicleShape::RAIL}, // !!! deprecated
     121             :     {"rail/fast",             SUMOVehicleShape::RAIL}, // !!! deprecated
     122             :     {"rail",                  SUMOVehicleShape::RAIL},
     123             :     {"rail/light",            SUMOVehicleShape::RAIL_CAR}, // !!! deprecated
     124             :     {"rail/city",             SUMOVehicleShape::RAIL_CAR}, // !!! deprecated
     125             :     {"rail/railcar",          SUMOVehicleShape::RAIL_CAR},
     126             :     {"rail/cargo",            SUMOVehicleShape::RAIL_CARGO},
     127             :     {"evehicle",              SUMOVehicleShape::E_VEHICLE},
     128             :     {"ant",                   SUMOVehicleShape::ANT},
     129             :     {"ship",                  SUMOVehicleShape::SHIP},
     130             :     {"emergency",             SUMOVehicleShape::EMERGENCY},
     131             :     {"firebrigade",           SUMOVehicleShape::FIREBRIGADE},
     132             :     {"police",                SUMOVehicleShape::POLICE},
     133             :     {"rickshaw",              SUMOVehicleShape::RICKSHAW },
     134             :     {"scooter",               SUMOVehicleShape::SCOOTER},
     135             :     {"aircraft",              SUMOVehicleShape::AIRCRAFT},
     136             :     {"",                      SUMOVehicleShape::UNKNOWN}
     137             : };
     138             : 
     139             : 
     140             : StringBijection<SUMOVehicleShape> SumoVehicleShapeStrings(
     141             :     sumoVehicleShapeStringInitializer, SUMOVehicleShape::UNKNOWN, false);
     142             : 
     143             : // ===========================================================================
     144             : // static values used for cached
     145             : // ===========================================================================
     146             : 
     147             : static std::map<SVCPermissions, std::vector<std::string> > vehicleClassNamesListCached;
     148             : static std::map<std::string, SVCPermissions> parseVehicleClassesCached;
     149             : static std::map<SVCPermissions, std::string> getVehicleClassNamesCached;
     150             : static std::string VehicleClassNameAll = "all";
     151             : 
     152             : // ===========================================================================
     153             : // additional constants
     154             : // ===========================================================================
     155             : 
     156             : const SUMOVehicleClass SUMOVehicleClass_MAX = SVC_CUSTOM2;
     157             : 
     158             : const SVCPermissions SVCAll = 2 * (long long int)SUMOVehicleClass_MAX - 1; // all relevant bits set to 1
     159             : 
     160             : const SVCPermissions SVC_UNSPECIFIED = -1;
     161             : 
     162             : const SUMOEmissionClass EMISSION_CLASS_UNSPECIFIED = -1;
     163             : 
     164             : const std::string DEFAULT_VTYPE_ID("DEFAULT_VEHTYPE");
     165             : const std::string DEFAULT_PEDTYPE_ID("DEFAULT_PEDTYPE");
     166             : const std::string DEFAULT_BIKETYPE_ID("DEFAULT_BIKETYPE");
     167             : const std::string DEFAULT_CONTAINERTYPE_ID("DEFAULT_CONTAINERTYPE");
     168             : const std::string DEFAULT_TAXITYPE_ID("DEFAULT_TAXITYPE");
     169             : const std::string DEFAULT_RAILTYPE_ID("DEFAULT_RAILTYPE");
     170             : 
     171             : const std::set<std::string> DEFAULT_VTYPES({DEFAULT_VTYPE_ID, DEFAULT_PEDTYPE_ID, DEFAULT_BIKETYPE_ID, DEFAULT_CONTAINERTYPE_ID, DEFAULT_TAXITYPE_ID, DEFAULT_RAILTYPE_ID});
     172             : 
     173             : const double DEFAULT_VEH_PROB(1.);
     174             : 
     175             : const double DEFAULT_PEDESTRIAN_SPEED(5. / 3.6);
     176             : 
     177             : const double DEFAULT_BICYCLE_SPEED(20. / 3.6);
     178             : 
     179             : const double DEFAULT_CONTAINER_TRANSHIP_SPEED(5. / 3.6);
     180             : 
     181             : 
     182             : // ===========================================================================
     183             : // method definitions
     184             : // ===========================================================================
     185             : 
     186             : // Stop Offset
     187             : 
     188     2369932 : StopOffset::StopOffset() :
     189     2369932 :     myPermissions(SVCAll),
     190     2369932 :     myOffset(0) {
     191     2369932 : }
     192             : 
     193             : 
     194         187 : StopOffset::StopOffset(const SUMOSAXAttributes& attrs, bool& ok) :
     195         187 :     myPermissions(SVC_IGNORING),
     196         187 :     myOffset(0) {
     197             :     // first check conditions
     198         187 :     if (attrs.hasAttribute(SUMO_ATTR_VCLASSES) && attrs.hasAttribute(SUMO_ATTR_EXCEPTIONS)) {
     199           0 :         WRITE_ERROR(TL("Simultaneous specification of vClasses and exceptions is not allowed"));
     200           0 :         ok = false;
     201             :     }
     202         187 :     if (!attrs.hasAttribute(SUMO_ATTR_VALUE)) {
     203           2 :         WRITE_ERROR(TL("StopOffset requires an offset value"));
     204           2 :         ok = false;
     205             :     }
     206             :     // parse elements
     207         187 :     const std::string vClasses = attrs.getOpt<std::string>(SUMO_ATTR_VCLASSES, nullptr, ok, "");
     208         187 :     const std::string exceptions = attrs.getOpt<std::string>(SUMO_ATTR_EXCEPTIONS, nullptr, ok, "");
     209             :     // parse permissions
     210         187 :     if (attrs.hasAttribute(SUMO_ATTR_VCLASSES)) {
     211         131 :         myPermissions = parseVehicleClasses(vClasses);
     212          56 :     } else if (attrs.hasAttribute(SUMO_ATTR_EXCEPTIONS)) {
     213          40 :         myPermissions = ~parseVehicleClasses(exceptions);
     214             :     } else {
     215             :         // no vClasses specified, thus apply to all
     216          16 :         myPermissions = parseVehicleClasses("all");
     217             :     }
     218             :     // parse offset
     219         187 :     myOffset = attrs.getOpt<double>(SUMO_ATTR_VALUE, nullptr, ok, 0);
     220         187 : }
     221             : 
     222             : 
     223             : bool
     224  3402582533 : StopOffset::isDefined() const {
     225  3402582533 :     return myOffset != 0;
     226             : }
     227             : 
     228             : 
     229             : void
     230     1439201 : StopOffset::reset() {
     231     1439201 :     myPermissions = SVC_IGNORING;
     232     1439201 :     myOffset = 0;
     233     1439201 : }
     234             : 
     235             : 
     236             : SVCPermissions
     237      128840 : StopOffset::getPermissions() const {
     238      128840 :     return myPermissions;
     239             : }
     240             : 
     241             : 
     242             : std::string
     243           0 : StopOffset::getExceptions() const {
     244           0 :     return getVehicleClassNames(~myPermissions);
     245             : }
     246             : 
     247             : 
     248             : double
     249      131805 : StopOffset::getOffset() const {
     250      131805 :     return myOffset;
     251             : }
     252             : 
     253             : 
     254             : void
     255           0 : StopOffset::setPermissions(const SVCPermissions permissions) {
     256           0 :     myPermissions = permissions;
     257           0 : }
     258             : 
     259             : 
     260             : void
     261           0 : StopOffset::setExceptions(const std::string permissions) {
     262           0 :     myPermissions = ~parseVehicleClasses(permissions);
     263           0 : }
     264             : 
     265             : 
     266             : void
     267           0 : StopOffset::setOffset(const double offset) {
     268           0 :     myOffset = offset;
     269           0 : }
     270             : 
     271             : 
     272             : bool
     273           0 : StopOffset::operator==(StopOffset const& other) const {
     274           0 :     return ((myPermissions == other.myPermissions) &&
     275           0 :             (myOffset == other.myOffset));
     276             : }
     277             : 
     278             : 
     279             : bool
     280      159533 : StopOffset::operator!=(StopOffset const& other) const {
     281      159533 :     return ((myPermissions != other.myPermissions) ||
     282      159510 :             (myOffset != other.myOffset));
     283             : }
     284             : 
     285             : // Conversion of SUMOVehicleClass
     286             : 
     287             : const std::string&
     288      199151 : getVehicleClassNames(SVCPermissions permissions, bool expand) {
     289      199151 :     if ((permissions & SVCAll) == SVCAll && !expand) {
     290             :         return VehicleClassNameAll;
     291             :     }
     292             :     // check if previously was cached
     293             :     if (getVehicleClassNamesCached.count(permissions) == 0) {
     294        4374 :         getVehicleClassNamesCached[permissions] = joinToString(getVehicleClassNamesList(permissions), ' ');
     295             :     }
     296      199147 :     return getVehicleClassNamesCached.at(permissions);
     297             : }
     298             : 
     299             : 
     300             : const std::vector<std::string>&
     301        2389 : getVehicleClassNamesList(SVCPermissions permissions) {
     302             :     // first check if it's cached
     303             :     if (vehicleClassNamesListCached.count(permissions) == 0) {
     304        2352 :         const std::vector<std::string> classNames = SumoVehicleClassStrings.getStrings();
     305             :         std::vector<std::string> result;
     306       82320 :         for (std::vector<std::string>::const_iterator it = classNames.begin(); it != classNames.end(); it++) {
     307       79968 :             const SVCPermissions svc = (SVCPermissions)SumoVehicleClassStrings.get(*it);
     308       79968 :             if ((svc & permissions) == svc && svc != SVC_IGNORING) {
     309       10510 :                 result.push_back(*it);
     310             :             }
     311             :         }
     312             :         // add it into vehicleClassNamesListCached
     313        2352 :         vehicleClassNamesListCached[permissions] = result;
     314        2352 :     }
     315        2389 :     return vehicleClassNamesListCached.at(permissions);
     316             : }
     317             : 
     318             : 
     319             : SUMOVehicleClass
     320      135998 : getVehicleClassID(const std::string& name) {
     321      135998 :     if (SumoVehicleClassStrings.hasString(name)) {
     322      135983 :         return SumoVehicleClassStrings.get(name);
     323             :     }
     324          30 :     throw InvalidArgument("Unknown vehicle class '" + name + "'.");
     325             : }
     326             : 
     327             : 
     328             : SVCPermissions
     329           0 : getVehicleClassCompoundID(const std::string& name) {
     330             :     SVCPermissions ret = SVC_IGNORING;
     331           0 :     const std::vector<std::string> names = SumoVehicleClassStrings.getStrings();
     332           0 :     for (std::vector<std::string>::const_iterator it = names.begin(); it != names.end(); it++) {
     333           0 :         if (name.find(*it) != std::string::npos) {
     334           0 :             ret = ret | (SVCPermissions) SumoVehicleClassStrings.get(*it);
     335             :         }
     336             :     }
     337           0 :     return ret;
     338           0 : }
     339             : 
     340             : 
     341             : SVCPermissions
     342      894613 : parseVehicleClasses(const std::string& allowedS) {
     343      894613 :     if (allowedS == VehicleClassNameAll) {
     344             :         return SVCAll;
     345             :     }
     346             :     // check  if allowedS was previously cached
     347             :     if (parseVehicleClassesCached.count(allowedS) == 0) {
     348             :         SVCPermissions result = 0;
     349       93684 :         StringTokenizer sta(allowedS, " ");
     350       85839 :         while (sta.hasNext()) {
     351       54611 :             const std::string s = sta.next();
     352       54611 :             if (!SumoVehicleClassStrings.hasString(s)) {
     353          30 :                 WRITE_ERRORF(TL("Unknown vehicle class '%' encountered."), s);
     354             :             } else {
     355       54601 :                 const SUMOVehicleClass vc = getVehicleClassID(s);
     356       54601 :                 const std::string& realName = SumoVehicleClassStrings.getString(vc);
     357       54601 :                 if (realName != s) {
     358             :                     deprecatedVehicleClassesSeen.insert(s);
     359             :                 }
     360       54601 :                 result |= vc;
     361             :             }
     362             :         }
     363             :         // save parsed vehicle class cached
     364       31228 :         parseVehicleClassesCached[allowedS] = result;
     365       31228 :     }
     366      883126 :     return parseVehicleClassesCached.at(allowedS);
     367             : }
     368             : 
     369             : 
     370             : bool
     371           0 : canParseVehicleClasses(const std::string& classes) {
     372           0 :     if (classes == VehicleClassNameAll) {
     373             :         return true;
     374             :     }
     375             :     // check if was previously cached
     376             :     if (parseVehicleClassesCached.count(classes) != 0) {
     377           0 :         return true;
     378             :     }
     379           0 :     StringTokenizer sta(classes, " ");
     380           0 :     while (sta.hasNext()) {
     381           0 :         if (!SumoVehicleClassStrings.hasString(sta.next())) {
     382             :             return false;
     383             :         }
     384             :     }
     385             :     return true;
     386           0 : }
     387             : 
     388             : 
     389             : SVCPermissions
     390     5661945 : parseVehicleClasses(const std::string& allowedS, const std::string& disallowedS, const MMVersion& networkVersion) {
     391     5661945 :     if (allowedS.size() == 0 && disallowedS.size() == 0) {
     392             :         return SVCAll;
     393      894424 :     } else if (allowedS.size() > 0 && disallowedS.size() > 0) {
     394           1 :         WRITE_WARNING(TL("SVCPermissions must be specified either via 'allow' or 'disallow'. Ignoring 'disallow'"));
     395           1 :         return parseVehicleClasses(allowedS);
     396      894423 :     } else if (allowedS.size() > 0) {
     397      512779 :         return parseVehicleClasses(allowedS);
     398             :     } else {
     399      381644 :         return invertPermissions(extraDisallowed(parseVehicleClasses(disallowedS), networkVersion));
     400             :     }
     401             : }
     402             : 
     403             : SVCPermissions
     404      381644 : extraDisallowed(SVCPermissions disallowed, const MMVersion& networkVersion) {
     405             :     if (networkVersion < MMVersion(1, 3)) {
     406       33031 :         disallowed |= SVC_RAIL_FAST;
     407             :     }
     408             :     if (networkVersion < MMVersion(1, 20)) {
     409      197520 :         if ((disallowed & SVC_RAIL_URBAN) != 0) {
     410             :             disallowed |= SVC_SUBWAY;
     411       43516 :             disallowed |= SVC_CABLE_CAR;
     412             :         }
     413             :     }
     414      381644 :     return disallowed;
     415             : }
     416             : 
     417             : 
     418             : SVCPermissions
     419      381738 : invertPermissions(SVCPermissions permissions) {
     420      381738 :     return SVCAll & ~permissions;
     421             : }
     422             : 
     423             : 
     424             : SVCPermissions
     425       11947 : parseVehicleClasses(const std::vector<std::string>& allowedS) {
     426             :     SVCPermissions result = 0;
     427       11947 :     if (std::find(allowedS.begin(), allowedS.end(), VehicleClassNameAll) != allowedS.end()) {
     428             :         return SVCAll;
     429             :     }
     430       35675 :     for (std::vector<std::string>::const_iterator i = allowedS.begin(); i != allowedS.end(); ++i) {
     431       23736 :         const SUMOVehicleClass vc = getVehicleClassID(*i);
     432       23729 :         const std::string& realName = SumoVehicleClassStrings.getString(vc);
     433       23729 :         if (realName != *i) {
     434           0 :             WRITE_WARNINGF(TL("The vehicle class '%' is deprecated, use '%' instead."), (*i), realName);
     435             :         }
     436       23729 :         result |= getVehicleClassID(*i);
     437             :     }
     438             :     return result;
     439             : }
     440             : 
     441             : 
     442             : void
     443      308766 : writePermissions(OutputDevice& into, SVCPermissions permissions) {
     444      308766 :     if (permissions == SVCAll) {
     445             :         return;
     446      199601 :     } else if (permissions == 0) {
     447             :         into.writeAttr(SUMO_ATTR_DISALLOW, VehicleClassNameAll);
     448         940 :         return;
     449             :     } else {
     450             :         int num_allowed = 0;
     451     6754474 :         for (SVCPermissions mask = 1; mask <= SUMOVehicleClass_MAX; mask = mask << 1) {
     452     6555813 :             if ((mask & permissions) == mask) {
     453     2270039 :                 ++num_allowed;
     454             :             }
     455             :         }
     456      198661 :         if (num_allowed <= (NUM_VCLASSES - num_allowed) && num_allowed > 0) {
     457      107000 :             into.writeAttr(SUMO_ATTR_ALLOW, getVehicleClassNames(permissions));
     458             :         } else {
     459       91661 :             into.writeAttr(SUMO_ATTR_DISALLOW, getVehicleClassNames(~permissions));
     460             :         }
     461             :     }
     462             : }
     463             : 
     464             : 
     465             : void
     466      305162 : writePreferences(OutputDevice& into, SVCPermissions preferred) {
     467      305162 :     if (preferred == SVCAll || preferred == 0) {
     468             :         return;
     469             :     } else {
     470         116 :         into.writeAttr(SUMO_ATTR_PREFER, getVehicleClassNames(preferred));
     471             :     }
     472             : }
     473             : 
     474             : 
     475             : SUMOVehicleShape
     476          18 : getVehicleShapeID(const std::string& name) {
     477          18 :     if (SumoVehicleShapeStrings.hasString(name)) {
     478          18 :         return SumoVehicleShapeStrings.get(name);
     479             :     } else {
     480           0 :         throw InvalidArgument("Unknown vehicle shape '" + name + "'.");
     481             :     }
     482             : }
     483             : 
     484             : 
     485             : bool
     486           0 : canParseVehicleShape(const std::string& shape) {
     487           0 :     return SumoVehicleShapeStrings.hasString(shape);
     488             : }
     489             : 
     490             : 
     491             : std::string
     492         160 : getVehicleShapeName(SUMOVehicleShape id) {
     493         160 :     return SumoVehicleShapeStrings.getString(id);
     494             : }
     495             : 
     496             : 
     497  2870907530 : bool isRailway(SVCPermissions permissions) {
     498  2870907530 :     return (permissions & SVC_RAIL_CLASSES) > 0 && (permissions & SVC_PASSENGER) == 0;
     499             : }
     500             : 
     501        2340 : bool isTram(SVCPermissions permissions) {
     502        2340 :     return (permissions & SVC_RAIL_CLASSES) == SVC_TRAM && (permissions & SVC_PASSENGER) == 0;
     503             : }
     504             : 
     505      135877 : bool isBikepath(SVCPermissions permissions) {
     506      135877 :     return (permissions & SVC_BICYCLE) == SVC_BICYCLE && (permissions & SVC_PASSENGER) == 0;
     507             : }
     508             : 
     509             : 
     510             : bool
     511    25448003 : isWaterway(SVCPermissions permissions) {
     512    25448003 :     return permissions == SVC_SHIP;
     513             : }
     514             : 
     515             : bool
     516     2367148 : isAirway(SVCPermissions permissions) {
     517     2367148 :     return permissions == SVC_AIRCRAFT || permissions == SVC_DRONE;
     518             : }
     519             : 
     520             : bool
     521      261838 : isForbidden(SVCPermissions permissions) {
     522      261838 :     return (permissions & SVCAll) == 0;
     523             : }
     524             : 
     525             : 
     526             : bool
     527      145206 : isSidewalk(SVCPermissions permissions) {
     528      145206 :     return (permissions & SVCAll) == SVC_PEDESTRIAN;
     529             : }
     530             : 
     531             : 
     532             : bool
     533           0 : isForWeakModes(SVCPermissions permissions) {
     534           0 :     return ((permissions & SVC_WEAK) != 0 && (permissions & ~SVC_WEAK) == 0);
     535             : }
     536             : 
     537             : 
     538             : bool
     539       12924 : noVehicles(SVCPermissions permissions) {
     540       12924 :     return isForbidden(permissions) || isSidewalk(permissions);
     541             : }
     542             : 
     543             : 
     544             : double
     545      605797 : getDefaultVehicleLength(const SUMOVehicleClass vc) {
     546      605797 :     switch (vc) {
     547             :         case SVC_PEDESTRIAN:
     548             :             return 0.215;
     549           0 :         case SVC_WHEELCHAIR:
     550           0 :             return 0.5;
     551       41695 :         case SVC_BICYCLE:
     552       41695 :             return 1.6;
     553           0 :         case SVC_SCOOTER:
     554           0 :             return 1.2;
     555          94 :         case SVC_MOPED:
     556          94 :             return 2.1;
     557         115 :         case SVC_MOTORCYCLE:
     558         115 :             return 2.2;
     559         500 :         case SVC_TRUCK:
     560         500 :             return 7.1;
     561          23 :         case SVC_TRAILER:
     562          23 :             return 16.5;
     563        1248 :         case SVC_BUS:
     564        1248 :             return 12.;
     565          18 :         case SVC_COACH:
     566          18 :             return 14.;
     567         438 :         case SVC_TRAM:
     568         438 :             return 22.;
     569        1112 :         case SVC_RAIL_URBAN:
     570             :         case SVC_SUBWAY:
     571        1112 :             return 36.5 * 3;
     572       42377 :         case SVC_RAIL:
     573       42377 :             return 67.5 * 2;
     574           0 :         case SVC_RAIL_ELECTRIC:
     575             :         case SVC_RAIL_FAST:
     576           0 :             return 25. * 8;
     577         279 :         case SVC_DELIVERY:
     578             :         case SVC_EMERGENCY:
     579         279 :             return 6.5;
     580         223 :         case SVC_SHIP:
     581         223 :             return 17;
     582           0 :         case SVC_CONTAINER:
     583           0 :             return 6.096;
     584           0 :         case SVC_DRONE:
     585           0 :             return 0.5;
     586           0 :         case SVC_AIRCRAFT:
     587           0 :             return 72.7;
     588      427353 :         default:
     589      427353 :             return 5; /*4.3*/
     590             :     }
     591             : }
     592             : 
     593             : 
     594             : 
     595             : /****************************************************************************/

Generated by: LCOV version 1.14