From c8787c10dc1b9b158aac531a53f3c15084c8d5db Mon Sep 17 00:00:00 2001 From: Maxim Pimenov Date: Fri, 28 Apr 2017 17:09:32 +0300 Subject: [PATCH] [routing] Skip sections with inappropriate router types when deserializing road access. --- generator/road_access_generator.cpp | 12 +++++------ routing/road_access.cpp | 2 +- routing/road_access_serialization.hpp | 31 ++++++++++++++++++++++++--- 3 files changed, 34 insertions(+), 11 deletions(-) diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index d53d9df26d..0ba9e16318 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -32,9 +32,6 @@ using namespace std; namespace { char constexpr kDelim[] = " \t\r\n"; -string const kCar = "Car"; -string const kPedestrian = "Pedestrian"; -string const kBicycle = "Bicycle"; using TagMapping = routing::RoadAccessTagProcessor::TagMapping; @@ -143,6 +140,7 @@ bool ParseRoadAccess(string const & roadAccessPath, map const for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) { auto const vehicleType = static_cast(i); + roadAccessByVehicleType[i].SetVehicleType(vehicleType); roadAccessByVehicleType[i].SetTypes(segmentType[vehicleType]); } @@ -158,10 +156,10 @@ RoadAccessTagProcessor::RoadAccessTagProcessor(VehicleType vehicleType) { switch (vehicleType) { - case VehicleType::Car: m_tagMapping = &kCarTagMapping; - case VehicleType::Pedestrian: m_tagMapping = &kPedestrianTagMapping; - case VehicleType::Bicycle: m_tagMapping = &kBicycleTagMapping; - case VehicleType::Count: CHECK(false, ("Bad vehicle type")); + case VehicleType::Car: m_tagMapping = &kCarTagMapping; break; + case VehicleType::Pedestrian: m_tagMapping = &kPedestrianTagMapping; break; + case VehicleType::Bicycle: m_tagMapping = &kBicycleTagMapping; break; + case VehicleType::Count: CHECK(false, ("Bad vehicle type")); break; } } diff --git a/routing/road_access.cpp b/routing/road_access.cpp index 4ab67c5494..040da3effe 100644 --- a/routing/road_access.cpp +++ b/routing/road_access.cpp @@ -75,7 +75,7 @@ string DebugPrint(RoadAccess const & r) break; } if (r.GetSegmentTypes().size() > kMaxIdsToShow) - oss << "..."; + oss << ", ..."; oss << "]"; return oss.str(); diff --git a/routing/road_access_serialization.hpp b/routing/road_access_serialization.hpp index d69fdfcc0c..30556dc566 100644 --- a/routing/road_access_serialization.hpp +++ b/routing/road_access_serialization.hpp @@ -36,8 +36,23 @@ public: uint32_t const header = kLatestVersion; WriteToSink(sink, header); + auto const sectionSizesPos = sink.Pos(); + std::array(VehicleType::Count)> sectionSizes; + for (size_t i = 0; i < sectionSizes.size(); ++i) + WriteToSink(sink, sectionSizes[i]); + for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) + { + auto const pos = sink.Pos(); SerializeOneVehicleType(sink, roadAccessByType[i].GetSegmentTypes()); + sectionSizes[i] = base::checked_cast(sink.Pos() - pos); + } + + auto const endPos = sink.Pos(); + sink.Seek(sectionSizesPos); + for (size_t i = 0; i < sectionSizes.size(); ++i) + WriteToSink(sink, sectionSizes[i]); + sink.Seek(endPos); } template @@ -46,13 +61,23 @@ public: uint32_t const header = ReadPrimitiveFromSource(src); CHECK_EQUAL(header, kLatestVersion, ()); - roadAccess.SetVehicleType(vehicleType); + std::array(VehicleType::Count)> sectionSizes; + for (size_t i = 0; i < sectionSizes.size(); ++i) + sectionSizes[i] = ReadPrimitiveFromSource(src); + for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) { + if (vehicleType != static_cast(i)) + { + src.Skip(sectionSizes[i]); + continue; + } + RoadAccessTypesMap m; DeserializeOneVehicleType(src, m); - if (vehicleType == static_cast(i)) - roadAccess.SetTypes(std::move(m)); + + roadAccess.SetVehicleType(vehicleType); + roadAccess.SetTypes(std::move(m)); } }