Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mapsme/omim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--generator/road_access_generator.cpp3
-rw-r--r--iphone/Maps/Core/Routing/MWMCoreRouterType.h1
-rw-r--r--map/mwm_url.cpp4
-rw-r--r--map/routing_manager.cpp8
-rw-r--r--platform/marketing_service.cpp2
-rw-r--r--platform/marketing_service.hpp2
-rw-r--r--qt/search_panel.cpp2
-rw-r--r--routing/edge_estimator.cpp3
-rw-r--r--routing/index_router.cpp24
-rw-r--r--routing/road_access_serialization.cpp2
-rw-r--r--routing/road_access_serialization.hpp26
-rw-r--r--routing/router.cpp3
-rw-r--r--routing/router.hpp1
-rw-r--r--routing/routing_settings.cpp1
-rw-r--r--routing/vehicle_mask.cpp3
-rw-r--r--routing/vehicle_mask.hpp5
-rw-r--r--routing_common/CMakeLists.txt1
-rw-r--r--routing_common/routing_common.pro1
-rw-r--r--routing_common/transit_max_speed.hpp6
-rw-r--r--xcode/routing_common/routing_common.xcodeproj/project.pbxproj4
20 files changed, 86 insertions, 16 deletions
diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp
index 41b59dc8b4..235eea6209 100644
--- a/generator/road_access_generator.cpp
+++ b/generator/road_access_generator.cpp
@@ -35,6 +35,8 @@ char constexpr kDelim[] = " \t\r\n";
using TagMapping = routing::RoadAccessTagProcessor::TagMapping;
+TagMapping const kEmptyTagMapping = {};
+
TagMapping const kCarTagMapping = {
{OsmElement::Tag("access", "no"), RoadAccess::Type::No},
{OsmElement::Tag("vehicle", "no"), RoadAccess::Type::No},
@@ -144,6 +146,7 @@ RoadAccessTagProcessor::RoadAccessTagProcessor(VehicleType vehicleType)
case VehicleType::Car: m_tagMapping = &kCarTagMapping; break;
case VehicleType::Pedestrian: m_tagMapping = &kPedestrianTagMapping; break;
case VehicleType::Bicycle: m_tagMapping = &kBicycleTagMapping; break;
+ case VehicleType::Transit: m_tagMapping = &kEmptyTagMapping; break;
case VehicleType::Count: CHECK(false, ("Bad vehicle type")); break;
}
}
diff --git a/iphone/Maps/Core/Routing/MWMCoreRouterType.h b/iphone/Maps/Core/Routing/MWMCoreRouterType.h
index b9690f9368..812d0170b4 100644
--- a/iphone/Maps/Core/Routing/MWMCoreRouterType.h
+++ b/iphone/Maps/Core/Routing/MWMCoreRouterType.h
@@ -18,6 +18,7 @@ static inline MWMRouterType routerType(routing::RouterType type)
switch (type)
{
case routing::RouterType::Vehicle: return MWMRouterTypeVehicle;
+ case routing::RouterType::Transit: // TODO: AddTransitType
case routing::RouterType::Pedestrian: return MWMRouterTypePedestrian;
case routing::RouterType::Bicycle: return MWMRouterTypeBicycle;
case routing::RouterType::Taxi: return MWMRouterTypeTaxi;
diff --git a/map/mwm_url.cpp b/map/mwm_url.cpp
index 6c12ca29e2..2c3291dc1f 100644
--- a/map/mwm_url.cpp
+++ b/map/mwm_url.cpp
@@ -85,6 +85,7 @@ char const * kRouteType = "type";
char const * kRouteTypeVehicle = "vehicle";
char const * kRouteTypePedestrian = "pedestrian";
char const * kRouteTypeBicycle = "bicycle";
+char const * kRouteTypeTransit = "transit";
} // namespace route
namespace search
@@ -285,7 +286,8 @@ bool ParsedMapApi::RouteKeyValue(string const & key, string const & value, vecto
else if (key == kRouteType)
{
string const lowerValue = strings::MakeLowerCase(value);
- if (lowerValue == kRouteTypePedestrian || lowerValue == kRouteTypeVehicle || lowerValue == kRouteTypeBicycle)
+ if (lowerValue == kRouteTypePedestrian || lowerValue == kRouteTypeVehicle ||
+ lowerValue == kRouteTypeBicycle || lowerValue == kRouteTypeTransit)
{
m_routingType = lowerValue;
}
diff --git a/map/routing_manager.cpp b/map/routing_manager.cpp
index 41f1ad2104..914b1346ad 100644
--- a/map/routing_manager.cpp
+++ b/map/routing_manager.cpp
@@ -209,6 +209,7 @@ VehicleType GetVehicleType(RouterType routerType)
case RouterType::Bicycle: return VehicleType::Bicycle;
case RouterType::Vehicle:
case RouterType::Taxi: return VehicleType::Car;
+ case RouterType::Transit: return VehicleType::Transit;
case RouterType::Count: CHECK(false, ("Invalid type", routerType)); return VehicleType::Count;
}
}
@@ -348,7 +349,8 @@ RouterType RoutingManager::GetLastUsedRouter() const
switch (routerType)
{
case RouterType::Pedestrian:
- case RouterType::Bicycle: return routerType;
+ case RouterType::Bicycle:
+ case RouterType::Transit: return routerType;
default: return RouterType::Vehicle;
}
}
@@ -469,6 +471,7 @@ void RoutingManager::InsertRoute(Route const & route)
subroute->m_turns);
break;
case RouterType::Pedestrian:
+ case RouterType::Transit: // TODO: AddTransitType
subroute->m_routeType = df::RouteType::Pedestrian;
subroute->m_color = df::kRoutePedestrian;
subroute->m_pattern = df::RoutePattern(4.0, 2.0);
@@ -791,6 +794,9 @@ void RoutingManager::BuildRoute(uint32_t timeoutSec)
case RouterType::Taxi:
tag = isP2P ? marketing::kRoutingP2PTaxiDiscovered : marketing::kRoutingTaxiDiscovered;
break;
+ case RouterType::Transit:
+ tag = isP2P ? marketing::kRoutingP2PTransitDiscovered : marketing::kRoutingTransitDiscovered;
+ break;
case RouterType::Count: CHECK(false, ("Bad router type", m_currentRouterType));
}
GetPlatform().GetMarketingService().SendPushWooshTag(tag);
diff --git a/platform/marketing_service.cpp b/platform/marketing_service.cpp
index 01726f2e82..5b02fa75ea 100644
--- a/platform/marketing_service.cpp
+++ b/platform/marketing_service.cpp
@@ -13,10 +13,12 @@ char const * const kRoutingP2PVehicleDiscovered = "routing_p2p_vehicle_discovere
char const * const kRoutingP2PPedestrianDiscovered = "routing_p2p_pedestrian_discovered";
char const * const kRoutingP2PBicycleDiscovered = "routing_p2p_bicycle_discovered";
char const * const kRoutingP2PTaxiDiscovered = "routing_p2p_taxi_discovered";
+char const * const kRoutingP2PTransitDiscovered = "routing_p2p_transit_discovered";
char const * const kRoutingVehicleDiscovered = "routing_vehicle_discovered";
char const * const kRoutingPedestrianDiscovered = "routing_pedestrian_discovered";
char const * const kRoutingBicycleDiscovered = "routing_bicycle_discovered";
char const * const kRoutingTaxiDiscovered = "routing_taxi_discovered";
+char const * const kRoutingTransitDiscovered = "routing_transit_discovered";
char const * const kEditorAddDiscovered = "editor_add_discovered";
char const * const kEditorEditDiscovered = "editor_edit_discovered";
char const * const kTrafficDiscovered = "traffic_discovered";
diff --git a/platform/marketing_service.hpp b/platform/marketing_service.hpp
index 3b5bf40374..bac4604c80 100644
--- a/platform/marketing_service.hpp
+++ b/platform/marketing_service.hpp
@@ -18,10 +18,12 @@ extern char const * const kRoutingP2PVehicleDiscovered;
extern char const * const kRoutingP2PPedestrianDiscovered;
extern char const * const kRoutingP2PBicycleDiscovered;
extern char const * const kRoutingP2PTaxiDiscovered;
+extern char const * const kRoutingP2PTransitDiscovered;
extern char const * const kRoutingVehicleDiscovered;
extern char const * const kRoutingPedestrianDiscovered;
extern char const * const kRoutingBicycleDiscovered;
extern char const * const kRoutingTaxiDiscovered;
+extern char const * const kRoutingTransitDiscovered;
extern char const * const kEditorAddDiscovered;
extern char const * const kEditorEditDiscovered;
extern char const * const kTrafficDiscovered;
diff --git a/qt/search_panel.cpp b/qt/search_panel.cpp
index 52111c8573..d3633cadc7 100644
--- a/qt/search_panel.cpp
+++ b/qt/search_panel.cpp
@@ -140,6 +140,8 @@ bool SearchPanel::TryChangeRouterCmd(QString const & str)
routerType = routing::RouterType::Vehicle;
else if (str == "?bicycle")
routerType = routing::RouterType::Bicycle;
+ else if (str == "?transit")
+ routerType = routing::RouterType::Transit;
else
return false;
diff --git a/routing/edge_estimator.cpp b/routing/edge_estimator.cpp
index 59377afb6c..d8cf56c319 100644
--- a/routing/edge_estimator.cpp
+++ b/routing/edge_estimator.cpp
@@ -190,7 +190,8 @@ shared_ptr<EdgeEstimator> EdgeEstimator::Create(VehicleType vehicleType, double
{
switch (vehicleType)
{
- case VehicleType::Pedestrian: return make_shared<PedestrianEstimator>(maxSpeedKMpH);
+ case VehicleType::Pedestrian:
+ case VehicleType::Transit: return make_shared<PedestrianEstimator>(maxSpeedKMpH);
case VehicleType::Bicycle: return make_shared<BicycleEstimator>(maxSpeedKMpH);
case VehicleType::Car: return make_shared<CarEstimator>(trafficStash, maxSpeedKMpH);
case VehicleType::Count:
diff --git a/routing/index_router.cpp b/routing/index_router.cpp
index 87d2895504..9223f2b423 100644
--- a/routing/index_router.cpp
+++ b/routing/index_router.cpp
@@ -21,6 +21,7 @@
#include "routing_common/bicycle_model.hpp"
#include "routing_common/car_model.hpp"
#include "routing_common/pedestrian_model.hpp"
+#include "routing_common/transit_max_speed.hpp"
#include "indexer/feature_altitude.hpp"
@@ -53,8 +54,13 @@ double constexpr kMinDistanceToFinishM = 10000;
// Limit of adjust in seconds.
double constexpr kAdjustLimitSec = 5 * 60;
-double CalcMaxSpeed(NumMwmIds const & numMwmIds, VehicleModelFactoryInterface const & vehicleModelFactory)
+double CalcMaxSpeed(NumMwmIds const & numMwmIds,
+ VehicleModelFactoryInterface const & vehicleModelFactory,
+ VehicleType vehicleType)
{
+ if (vehicleType == VehicleType::Transit)
+ return kTransitMaxSpeedKMpH;
+
double maxSpeed = 0.0;
numMwmIds.ForEachId([&](NumMwmId id) {
string const & country = numMwmIds.GetFile(id).GetName();
@@ -72,6 +78,7 @@ shared_ptr<VehicleModelFactoryInterface> CreateVehicleModelFactory(
switch (vehicleType)
{
case VehicleType::Pedestrian:
+ case VehicleType::Transit:
return make_shared<PedestrianModelFactory>(countryParentNameGetterFn);
case VehicleType::Bicycle: return make_shared<BicycleModelFactory>(countryParentNameGetterFn);
case VehicleType::Car: return make_shared<CarModelFactory>(countryParentNameGetterFn);
@@ -86,7 +93,8 @@ unique_ptr<IDirectionsEngine> CreateDirectionsEngine(VehicleType vehicleType,
{
switch (vehicleType)
{
- case VehicleType::Pedestrian: return make_unique<PedestrianDirectionsEngine>(numMwmIds);
+ case VehicleType::Pedestrian:
+ case VehicleType::Transit: return make_unique<PedestrianDirectionsEngine>(numMwmIds);
case VehicleType::Bicycle:
// @TODO Bicycle turn generation engine is used now. It's ok for the time being.
// But later a special car turn generation engine should be implemented.
@@ -289,11 +297,13 @@ IndexRouter::IndexRouter(VehicleType vehicleType, bool loadAltitudes,
, m_trafficStash(CreateTrafficStash(m_vehicleType, m_numMwmIds, trafficCache))
, m_indexManager(countryFileFn, m_index)
, m_roadGraph(m_index,
- vehicleType == VehicleType::Pedestrian ? IRoadGraph::Mode::IgnoreOnewayTag
- : IRoadGraph::Mode::ObeyOnewayTag,
+ vehicleType == VehicleType::Pedestrian || vehicleType == VehicleType::Transit
+ ? IRoadGraph::Mode::IgnoreOnewayTag
+ : IRoadGraph::Mode::ObeyOnewayTag,
m_vehicleModelFactory)
, m_estimator(EdgeEstimator::Create(
- m_vehicleType, CalcMaxSpeed(*m_numMwmIds, *m_vehicleModelFactory), m_trafficStash))
+ m_vehicleType, CalcMaxSpeed(*m_numMwmIds, *m_vehicleModelFactory, m_vehicleType),
+ m_trafficStash))
, m_directionsEngine(CreateDirectionsEngine(m_vehicleType, m_numMwmIds, m_index))
{
CHECK(!m_name.empty(), ());
@@ -487,12 +497,16 @@ IRouter::ResultCode IndexRouter::CalculateSubroute(Checkpoints const & checkpoin
{
case VehicleType::Pedestrian:
case VehicleType::Bicycle:
+ case VehicleType::Transit:
starter.GetGraph().SetMode(WorldGraph::Mode::NoLeaps);
break;
case VehicleType::Car:
starter.GetGraph().SetMode(AreMwmsNear(starter.GetMwms()) ? WorldGraph::Mode::LeapsIfPossible
: WorldGraph::Mode::LeapsOnly);
break;
+ case VehicleType::Count:
+ CHECK(false, ("Unknown vehicle type:", m_vehicleType));
+ break;
}
LOG(LINFO, ("Routing in mode:", starter.GetGraph().GetMode()));
diff --git a/routing/road_access_serialization.cpp b/routing/road_access_serialization.cpp
index acdd59f22d..fcdeeb4c8d 100644
--- a/routing/road_access_serialization.cpp
+++ b/routing/road_access_serialization.cpp
@@ -3,5 +3,5 @@
namespace routing
{
// static
-uint32_t const RoadAccessSerializer::kLatestVersion = 0;
+uint32_t const RoadAccessSerializer::kLatestVersion = 1;
} // namespace routing
diff --git a/routing/road_access_serialization.hpp b/routing/road_access_serialization.hpp
index ad3d26a251..856479ba1f 100644
--- a/routing/road_access_serialization.hpp
+++ b/routing/road_access_serialization.hpp
@@ -61,16 +61,30 @@ public:
template <class Source>
static void Deserialize(Source & src, VehicleType vehicleType, RoadAccess & roadAccess)
{
+ auto const subsectionNumberToVehicleType = [](uint32_t version, size_t subsection)
+ {
+ if (version == 0)
+ {
+ switch (subsection)
+ {
+ case 0: return VehicleType::Pedestrian;
+ case 1: return VehicleType::Bicycle;
+ case 2: return VehicleType::Car;
+ default: return VehicleType::Count;
+ }
+ }
+ return static_cast<VehicleType>(subsection);
+ };
+
uint32_t const header = ReadPrimitiveFromSource<uint32_t>(src);
- CHECK_EQUAL(header, kLatestVersion, ());
- std::array<uint32_t, static_cast<size_t>(VehicleType::Count)> sectionSizes;
- for (size_t i = 0; i < sectionSizes.size(); ++i)
- sectionSizes[i] = ReadPrimitiveFromSource<uint32_t>(src);
+ std::vector<uint32_t> sectionSizes;
+ for (size_t i = 0; subsectionNumberToVehicleType(header, i) < VehicleType::Count; ++i)
+ sectionSizes.push_back(ReadPrimitiveFromSource<uint32_t>(src));
- for (size_t i = 0; i < static_cast<size_t>(VehicleType::Count); ++i)
+ for (size_t i = 0; subsectionNumberToVehicleType(header, i) < VehicleType::Count; ++i)
{
- if (vehicleType != static_cast<VehicleType>(i))
+ if (vehicleType != subsectionNumberToVehicleType(header, i))
{
src.Skip(sectionSizes[i]);
continue;
diff --git a/routing/router.cpp b/routing/router.cpp
index ba6303a027..4135cfc84f 100644
--- a/routing/router.cpp
+++ b/routing/router.cpp
@@ -10,6 +10,7 @@ std::string ToString(RouterType type)
case RouterType::Pedestrian: return "pedestrian";
case RouterType::Bicycle: return "bicycle";
case RouterType::Taxi: return "taxi";
+ case RouterType::Transit: return "transit";
case RouterType::Count: return "count";
}
ASSERT(false, ());
@@ -26,6 +27,8 @@ RouterType FromString(std::string const & str)
return RouterType::Bicycle;
if (str == "taxi")
return RouterType::Taxi;
+ if (str == "transit")
+ return RouterType::Transit;
ASSERT(false, ("Incorrect routing string:", str));
return RouterType::Vehicle;
diff --git a/routing/router.hpp b/routing/router.hpp
index d1a30670ee..ebd24a5e92 100644
--- a/routing/router.hpp
+++ b/routing/router.hpp
@@ -29,6 +29,7 @@ enum class RouterType
Pedestrian, /// For A star pedestrian routing.
Bicycle, /// For A star bicycle routing.
Taxi, /// For taxi route calculation Vehicle routing is used.
+ Transit, /// For A star pedestrian + transit routing.
Count /// Number of router types.
};
diff --git a/routing/routing_settings.cpp b/routing/routing_settings.cpp
index b166154eeb..c52e35c77a 100644
--- a/routing/routing_settings.cpp
+++ b/routing/routing_settings.cpp
@@ -7,6 +7,7 @@ RoutingSettings GetRoutingSettings(VehicleType vehicleType)
switch (vehicleType)
{
case VehicleType::Pedestrian:
+ case VehicleType::Transit:
return {true /* m_matchRoute */, false /* m_soundDirection */,
20. /* m_matchingThresholdM */, true /* m_keepPedestrianInfo */,
false /* m_showTurnAfterNext */, false /* m_speedCameraWarning*/};
diff --git a/routing/vehicle_mask.cpp b/routing/vehicle_mask.cpp
index b529b24329..bf9a60cff1 100644
--- a/routing/vehicle_mask.cpp
+++ b/routing/vehicle_mask.cpp
@@ -16,6 +16,7 @@ string DebugPrint(VehicleType vehicleType)
case VehicleType::Pedestrian: return "Pedestrian";
case VehicleType::Bicycle: return "Bicycle";
case VehicleType::Car: return "Car";
+ case VehicleType::Transit: return "Transit";
case VehicleType::Count: return "Count";
}
}
@@ -30,6 +31,8 @@ void FromString(string const & s, VehicleType & vehicleType)
vehicleType = VehicleType::Bicycle;
else if (s == "Car")
vehicleType = VehicleType::Car;
+ else if (s == "Transit")
+ vehicleType = VehicleType::Transit;
else
{
ASSERT(false, ("Could not read VehicleType from string", s));
diff --git a/routing/vehicle_mask.hpp b/routing/vehicle_mask.hpp
index 3b8277a18d..11046157fa 100644
--- a/routing/vehicle_mask.hpp
+++ b/routing/vehicle_mask.hpp
@@ -5,12 +5,15 @@
namespace routing
{
+// Declaration order matters. There are sections in mwm with the same order
+// of subsections. New vehicle types should be added after existent types.
enum class VehicleType
{
Pedestrian = 0,
Bicycle = 1,
Car = 2,
- Count = 3
+ Transit = 3,
+ Count = 4
};
using VehicleMask = uint32_t;
diff --git a/routing_common/CMakeLists.txt b/routing_common/CMakeLists.txt
index e1c15d6259..4858cbaf13 100644
--- a/routing_common/CMakeLists.txt
+++ b/routing_common/CMakeLists.txt
@@ -8,6 +8,7 @@ set(
car_model.hpp
pedestrian_model.cpp
pedestrian_model.hpp
+ transit_max_speed.hpp
vehicle_model.cpp
vehicle_model.hpp
)
diff --git a/routing_common/routing_common.pro b/routing_common/routing_common.pro
index 450f01cb42..51ad9161d2 100644
--- a/routing_common/routing_common.pro
+++ b/routing_common/routing_common.pro
@@ -23,4 +23,5 @@ HEADERS += \
bicycle_model.hpp \
car_model.hpp \
pedestrian_model.hpp \
+ transit_max_speed.hpp \
vehicle_model.hpp \
diff --git a/routing_common/transit_max_speed.hpp b/routing_common/transit_max_speed.hpp
new file mode 100644
index 0000000000..53319a6004
--- /dev/null
+++ b/routing_common/transit_max_speed.hpp
@@ -0,0 +1,6 @@
+#pragma once
+
+namespace routing
+{
+double constexpr kTransitMaxSpeedKMpH = 400;
+} // namespace routing
diff --git a/xcode/routing_common/routing_common.xcodeproj/project.pbxproj b/xcode/routing_common/routing_common.xcodeproj/project.pbxproj
index 17da24f5dd..649ca207cf 100644
--- a/xcode/routing_common/routing_common.xcodeproj/project.pbxproj
+++ b/xcode/routing_common/routing_common.xcodeproj/project.pbxproj
@@ -7,6 +7,7 @@
objects = {
/* Begin PBXBuildFile section */
+ 40576F7A1F7AA1B4000B593B /* transit_max_speed.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */; };
40FF45D01F388EF80046BD40 /* vehicle_model_for_country_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */; };
671E78881E6A3C5D00B2859B /* bicycle_model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 671E78801E6A3C5D00B2859B /* bicycle_model.cpp */; };
671E78891E6A3C5D00B2859B /* bicycle_model.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 671E78811E6A3C5D00B2859B /* bicycle_model.hpp */; };
@@ -35,6 +36,7 @@
/* End PBXBuildFile section */
/* Begin PBXFileReference section */
+ 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = transit_max_speed.hpp; sourceTree = "<group>"; };
40FF45CF1F388EF80046BD40 /* vehicle_model_for_country_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vehicle_model_for_country_test.cpp; sourceTree = "<group>"; };
671E78721E6A3BE200B2859B /* librouting_common.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = librouting_common.a; sourceTree = BUILT_PRODUCTS_DIR; };
671E78801E6A3C5D00B2859B /* bicycle_model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = bicycle_model.cpp; sourceTree = "<group>"; };
@@ -128,6 +130,7 @@
671E78831E6A3C5D00B2859B /* car_model.hpp */,
671E78841E6A3C5D00B2859B /* pedestrian_model.cpp */,
671E78851E6A3C5D00B2859B /* pedestrian_model.hpp */,
+ 40576F791F7AA1B4000B593B /* transit_max_speed.hpp */,
671E78861E6A3C5D00B2859B /* vehicle_model.cpp */,
671E78871E6A3C5D00B2859B /* vehicle_model.hpp */,
);
@@ -176,6 +179,7 @@
files = (
671E788D1E6A3C5D00B2859B /* pedestrian_model.hpp in Headers */,
671E78891E6A3C5D00B2859B /* bicycle_model.hpp in Headers */,
+ 40576F7A1F7AA1B4000B593B /* transit_max_speed.hpp in Headers */,
671E788B1E6A3C5D00B2859B /* car_model.hpp in Headers */,
671E788F1E6A3C5D00B2859B /* vehicle_model.hpp in Headers */,
);