From 9f1b902822afe63921bb7a5638e259729c5253d1 Mon Sep 17 00:00:00 2001 From: gmoryes Date: Thu, 13 Feb 2020 18:59:14 +0300 Subject: [PATCH] [routing] refactor access serialization --- routing/CMakeLists.txt | 1 - routing/road_access_serialization.cpp | 7 -- routing/road_access_serialization.hpp | 69 ++++++++++--------- .../routing/routing.xcodeproj/project.pbxproj | 4 -- 4 files changed, 35 insertions(+), 46 deletions(-) delete mode 100644 routing/road_access_serialization.cpp diff --git a/routing/CMakeLists.txt b/routing/CMakeLists.txt index a334a914dd..d961d431fd 100644 --- a/routing/CMakeLists.txt +++ b/routing/CMakeLists.txt @@ -99,7 +99,6 @@ set( restrictions_serialization.hpp road_access.cpp road_access.hpp - road_access_serialization.cpp road_access_serialization.hpp road_graph.cpp road_graph.hpp diff --git a/routing/road_access_serialization.cpp b/routing/road_access_serialization.cpp deleted file mode 100644 index fcdeeb4c8d..0000000000 --- a/routing/road_access_serialization.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "routing/road_access_serialization.hpp" - -namespace routing -{ -// static -uint32_t const RoadAccessSerializer::kLatestVersion = 1; -} // namespace routing diff --git a/routing/road_access_serialization.hpp b/routing/road_access_serialization.hpp index 2e77d27417..6f3e863e7f 100644 --- a/routing/road_access_serialization.hpp +++ b/routing/road_access_serialization.hpp @@ -41,14 +41,33 @@ public: { uint32_t const header = kLatestVersion; WriteToSink(sink, header); + SerializeAccess(sink, roadAccessByType); + } + template + static void Deserialize(Source & src, VehicleType vehicleType, RoadAccess & roadAccess) + { + uint32_t const header = ReadPrimitiveFromSource(src); + CHECK_EQUAL(header, kLatestVersion, ()); + DeserializeAccess(src, vehicleType, roadAccess); + } + +private: + inline static uint32_t const kLatestVersion = 1; + + inline static std::map const kSupportedVehicles = { + {VehicleType::Pedestrian, true}, + {VehicleType::Bicycle, true}, + {VehicleType::Car, true}, + {VehicleType::Transit, false}}; + + template + static void SerializeAccess(Sink & sink, RoadAccessByVehicleType const & roadAccessByType) + { auto const sectionSizesPos = sink.Pos(); - std::array(VehicleType::Count)> sectionSizes; + std::array(VehicleType::Count)> sectionSizes = {}; for (size_t i = 0; i < sectionSizes.size(); ++i) - { - sectionSizes[i] = 0; - WriteToSink(sink, sectionSizes[i]); - } + WriteToSink(sink, 0); for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) { @@ -60,38 +79,23 @@ public: auto const endPos = sink.Pos(); sink.Seek(sectionSizesPos); - for (size_t i = 0; i < sectionSizes.size(); ++i) - WriteToSink(sink, sectionSizes[i]); + for (auto const sectionSize : sectionSizes) + WriteToSink(sink, sectionSize); + sink.Seek(endPos); } template - static void Deserialize(Source & src, VehicleType vehicleType, RoadAccess & roadAccess) + static void DeserializeAccess(Source & src, VehicleType vehicleType, RoadAccess & roadAccess) { - auto const subsectionNumberToVehicleType = [](uint32_t version, size_t subsection) + std::array(VehicleType::Count)> sectionSizes{}; + for (auto & sectionSize : sectionSizes) + sectionSize = ReadPrimitiveFromSource(src); + + for (size_t i = 0; i < sectionSizes.size(); ++i) { - 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(subsection); - }; - - uint32_t const header = ReadPrimitiveFromSource(src); - - std::vector sectionSizes; - for (size_t i = 0; subsectionNumberToVehicleType(header, i) < VehicleType::Count; ++i) - sectionSizes.push_back(ReadPrimitiveFromSource(src)); - - for (size_t i = 0; subsectionNumberToVehicleType(header, i) < VehicleType::Count; ++i) - { - if (vehicleType != subsectionNumberToVehicleType(header, i)) + auto const sectionVehicleType = static_cast(i); + if (!kSupportedVehicles.at(vehicleType) || sectionVehicleType != vehicleType) { src.Skip(sectionSizes[i]); continue; @@ -105,7 +109,6 @@ public: } } -private: template static void SerializeOneVehicleType(Sink & sink, RoadAccessTypesFeatureMap const & mf, RoadAccessTypesPointMap const & mp) @@ -238,7 +241,5 @@ private: for (size_t i = 0; i < n; ++i) segments.emplace_back(kFakeNumMwmId, featureIds[i], segmentIndices[i], isForward[i]); } - - uint32_t static const kLatestVersion; }; } // namespace routing diff --git a/xcode/routing/routing.xcodeproj/project.pbxproj b/xcode/routing/routing.xcodeproj/project.pbxproj index 3523758dd8..41e54d1ea0 100644 --- a/xcode/routing/routing.xcodeproj/project.pbxproj +++ b/xcode/routing/routing.xcodeproj/project.pbxproj @@ -139,7 +139,6 @@ 567F81952154D6FF0093C25B /* city_roads.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 567F81932154D6FF0093C25B /* city_roads.hpp */; }; 568194751F03A32400450EC3 /* road_access_test.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 568194731F03A32400450EC3 /* road_access_test.cpp */; }; 568194761F03A32400450EC3 /* routing_helpers_tests.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 568194741F03A32400450EC3 /* routing_helpers_tests.cpp */; }; - 5694CECA1EBA25F7004576D3 /* road_access_serialization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5694CEC51EBA25F7004576D3 /* road_access_serialization.cpp */; }; 5694CECB1EBA25F7004576D3 /* road_access_serialization.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5694CEC61EBA25F7004576D3 /* road_access_serialization.hpp */; }; 5694CECC1EBA25F7004576D3 /* road_access.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 5694CEC71EBA25F7004576D3 /* road_access.cpp */; }; 5694CECD1EBA25F7004576D3 /* road_access.hpp in Headers */ = {isa = PBXBuildFile; fileRef = 5694CEC81EBA25F7004576D3 /* road_access.hpp */; }; @@ -472,7 +471,6 @@ 567F81932154D6FF0093C25B /* city_roads.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = city_roads.hpp; path = ../../routing/city_roads.hpp; sourceTree = ""; }; 568194731F03A32400450EC3 /* road_access_test.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = road_access_test.cpp; sourceTree = ""; }; 568194741F03A32400450EC3 /* routing_helpers_tests.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = routing_helpers_tests.cpp; sourceTree = ""; }; - 5694CEC51EBA25F7004576D3 /* road_access_serialization.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = road_access_serialization.cpp; sourceTree = ""; }; 5694CEC61EBA25F7004576D3 /* road_access_serialization.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = road_access_serialization.hpp; sourceTree = ""; }; 5694CEC71EBA25F7004576D3 /* road_access.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = road_access.cpp; sourceTree = ""; }; 5694CEC81EBA25F7004576D3 /* road_access.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = road_access.hpp; sourceTree = ""; }; @@ -959,7 +957,6 @@ 67C79BA01E2CEE1400C40034 /* restriction_loader.hpp */, 349D1CDE1E3F589900A878FD /* restrictions_serialization.cpp */, 349D1CDF1E3F589900A878FD /* restrictions_serialization.hpp */, - 5694CEC51EBA25F7004576D3 /* road_access_serialization.cpp */, 5694CEC61EBA25F7004576D3 /* road_access_serialization.hpp */, 5694CEC71EBA25F7004576D3 /* road_access.cpp */, 5694CEC81EBA25F7004576D3 /* road_access.hpp */, @@ -1408,7 +1405,6 @@ 40C645161F8D167F002E05A0 /* fake_ending.cpp in Sources */, 56099E331CC9247E00A7772A /* bicycle_directions.cpp in Sources */, 0C08AA341DF83223004195DD /* index_graph_serialization.cpp in Sources */, - 5694CECA1EBA25F7004576D3 /* road_access_serialization.cpp in Sources */, 674F9BD41B0A580E00704FFA /* road_graph.cpp in Sources */, 5631B66B219B125D009F47D4 /* maxspeeds.cpp in Sources */, 0C81E1571F0258AA00DC66DF /* segmented_route.cpp in Sources */,