From addf1aafd8dd1c1ccd95c0367bc328dcfac11b21 Mon Sep 17 00:00:00 2001 From: gmoryes Date: Wed, 12 Feb 2020 17:26:29 +0300 Subject: [PATCH] [routing] Refactor RoadAccess class --- .../generator_tests/road_access_test.cpp | 12 +++--- generator/road_access_generator.cpp | 6 +-- routing/index_graph.cpp | 16 ++++---- routing/index_graph.hpp | 2 +- routing/road_access.cpp | 18 ++++----- routing/road_access.hpp | 38 +++++++++---------- routing/road_access_serialization.hpp | 6 +-- routing/routing_tests/index_graph_tools.cpp | 6 +-- routing/routing_tests/road_access_test.cpp | 8 ++-- 9 files changed, 54 insertions(+), 58 deletions(-) diff --git a/generator/generator_tests/road_access_test.cpp b/generator/generator_tests/road_access_test.cpp index a4f4a61bef..4e17b88a6e 100644 --- a/generator/generator_tests/road_access_test.cpp +++ b/generator/generator_tests/road_access_test.cpp @@ -155,7 +155,7 @@ UNIT_TEST(RoadAccess_AccessPrivate) auto const roadAccessAllTypes = SaveAndLoadRoadAccess(roadAccessContent, osmIdsToFeatureIdsContent); auto const carRoadAccess = roadAccessAllTypes[static_cast(VehicleType::Car)]; - TEST_EQUAL(carRoadAccess.GetFeatureType(0 /* featureId */), RoadAccess::Type::Private, ()); + TEST_EQUAL(carRoadAccess.GetAccess(0 /* featureId */), RoadAccess::Type::Private, ()); } UNIT_TEST(RoadAccess_Access_Multiple_Vehicle_Types) @@ -172,12 +172,12 @@ UNIT_TEST(RoadAccess_Access_Multiple_Vehicle_Types) SaveAndLoadRoadAccess(roadAccessContent, osmIdsToFeatureIdsContent); auto const carRoadAccess = roadAccessAllTypes[static_cast(VehicleType::Car)]; auto const bicycleRoadAccess = roadAccessAllTypes[static_cast(VehicleType::Bicycle)]; - TEST_EQUAL(carRoadAccess.GetFeatureType(1 /* featureId */), RoadAccess::Type::Private, ()); - TEST_EQUAL(carRoadAccess.GetFeatureType(2 /* featureId */), RoadAccess::Type::Private, ()); - TEST_EQUAL(carRoadAccess.GetFeatureType(3 /* featureId */), RoadAccess::Type::Yes, ()); - TEST_EQUAL(carRoadAccess.GetFeatureType(4 /* featureId */), RoadAccess::Type::Destination, + TEST_EQUAL(carRoadAccess.GetAccess(1 /* featureId */), RoadAccess::Type::Private, ()); + TEST_EQUAL(carRoadAccess.GetAccess(2 /* featureId */), RoadAccess::Type::Private, ()); + TEST_EQUAL(carRoadAccess.GetAccess(3 /* featureId */), RoadAccess::Type::Yes, ()); + TEST_EQUAL(carRoadAccess.GetAccess(4 /* featureId */), RoadAccess::Type::Destination, ()); - TEST_EQUAL(bicycleRoadAccess.GetFeatureType(3 /* featureId */), RoadAccess::Type::No, ()); + TEST_EQUAL(bicycleRoadAccess.GetAccess(3 /* featureId */), RoadAccess::Type::No, ()); } UNIT_TEST(RoadAccessWriter_Merge) diff --git a/generator/road_access_generator.cpp b/generator/road_access_generator.cpp index 52a6a1e8c9..1741941a2c 100644 --- a/generator/road_access_generator.cpp +++ b/generator/road_access_generator.cpp @@ -143,8 +143,8 @@ bool ParseRoadAccess(string const & roadAccessPath, return false; } - RoadAccess::FeatureTypeHashMap featureType[static_cast(VehicleType::Count)]; - RoadAccess::PointsTypeHashMap pointType[static_cast(VehicleType::Count)]; + RoadAccess::WayToAccess featureType[static_cast(VehicleType::Count)]; + RoadAccess::PointToAccess pointType[static_cast(VehicleType::Count)]; auto addFeature = [&](uint32_t featureId, VehicleType vehicleType, RoadAccess::Type roadAccessType, uint64_t osmId) { @@ -226,7 +226,7 @@ bool ParseRoadAccess(string const & roadAccessPath, } for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) - roadAccessByVehicleType[i].SetAccessTypes(move(featureType[i]), move(pointType[i])); + roadAccessByVehicleType[i].SetAccess(move(featureType[i]), move(pointType[i])); return true; } diff --git a/routing/index_graph.cpp b/routing/index_graph.cpp index e83743dd96..8c5b3855a1 100644 --- a/routing/index_graph.cpp +++ b/routing/index_graph.cpp @@ -297,10 +297,10 @@ void IndexGraph::ReconstructJointSegment(JointSegment const & parentJoint, return currentPointId < lastPointId ? pointId + 1 : pointId - 1; }; - if (m_roadAccess.GetFeatureType(firstChild.GetFeatureId()) == RoadAccess::Type::No) + if (m_roadAccess.GetAccess(firstChild.GetFeatureId()) == RoadAccess::Type::No) continue; - if (m_roadAccess.GetPointType(parent.GetRoadPoint(isOutgoing)) == RoadAccess::Type::No) + if (m_roadAccess.GetAccess(parent.GetRoadPoint(isOutgoing)) == RoadAccess::Type::No) continue; if (IsUTurn(parent, firstChild) && IsUTurnAndRestricted(parent, firstChild, isOutgoing)) @@ -318,7 +318,7 @@ void IndexGraph::ReconstructJointSegment(JointSegment const & parentJoint, bool noRoadAccess = false; do { - if (m_roadAccess.GetPointType(rp) == RoadAccess::Type::No) + if (m_roadAccess.GetAccess(rp) == RoadAccess::Type::No) { noRoadAccess = true; break; @@ -367,11 +367,11 @@ void IndexGraph::GetNeighboringEdge(Segment const & from, Segment const & to, bo if (IsRestricted(from, from.GetFeatureId(), to.GetFeatureId(), isOutgoing, parents)) return; - if (m_roadAccess.GetFeatureType(to.GetFeatureId()) == RoadAccess::Type::No) + if (m_roadAccess.GetAccess(to.GetFeatureId()) == RoadAccess::Type::No) return; RoadPoint const rp = from.GetRoadPoint(isOutgoing); - if (m_roadAccess.GetPointType(rp) == RoadAccess::Type::No) + if (m_roadAccess.GetAccess(rp) == RoadAccess::Type::No) return; auto const weight = CalculateEdgeWeight(EdgeEstimator::Purpose::Weight, isOutgoing, from, to); @@ -399,8 +399,8 @@ RouteWeight IndexGraph::GetPenalties(EdgeEstimator::Purpose purpose, fromPenaltyData.m_passThroughAllowed == toPenaltyData.m_passThroughAllowed ? 0 : 1; // We do not distinguish between RoadAccess::Type::Private and RoadAccess::Type::Destination for now. - bool const fromAccessAllowed = m_roadAccess.GetFeatureType(u.GetFeatureId()) == RoadAccess::Type::Yes; - bool const toAccessAllowed = m_roadAccess.GetFeatureType(v.GetFeatureId()) == RoadAccess::Type::Yes; + bool const fromAccessAllowed = m_roadAccess.GetAccess(u.GetFeatureId()) == RoadAccess::Type::Yes; + bool const toAccessAllowed = m_roadAccess.GetAccess(v.GetFeatureId()) == RoadAccess::Type::Yes; // Route crosses border of access=yes/access={private, destination} area if |u| and |v| have different // access restrictions. int8_t accessPenalty = fromAccessAllowed == toAccessAllowed ? 0 : 1; @@ -408,7 +408,7 @@ RouteWeight IndexGraph::GetPenalties(EdgeEstimator::Purpose purpose, // RoadPoint between u and v is front of u. auto const rp = u.GetRoadPoint(true /* front */); // No double penalty for barriers on the border of access=yes/access={private, destination} area. - if (m_roadAccess.GetPointType(rp) != RoadAccess::Type::Yes) + if (m_roadAccess.GetAccess(rp) != RoadAccess::Type::Yes) accessPenalty = 1; double weightPenalty = 0.0; diff --git a/routing/index_graph.hpp b/routing/index_graph.hpp index 86a989f0a4..24e515e1b3 100644 --- a/routing/index_graph.hpp +++ b/routing/index_graph.hpp @@ -70,7 +70,7 @@ public: RoadAccess::Type GetAccessType(Segment const & segment) const { - return m_roadAccess.GetFeatureType(segment.GetFeatureId()); + return m_roadAccess.GetAccess(segment.GetFeatureId()); } uint32_t GetNumRoads() const { return m_roadIndex.GetSize(); } diff --git a/routing/road_access.cpp b/routing/road_access.cpp index cf5784c6b0..6918ccdde3 100644 --- a/routing/road_access.cpp +++ b/routing/road_access.cpp @@ -32,21 +32,21 @@ void PrintKV(ostringstream & oss, KV const & kvs, size_t maxKVToShow) namespace routing { // RoadAccess -------------------------------------------------------------------------------------- -RoadAccess::Type RoadAccess::GetFeatureType(uint32_t featureId) const +RoadAccess::Type RoadAccess::GetAccess(uint32_t featureId) const { // todo(@m) This may or may not be too slow. Consider profiling this and using // a Bloom filter or anything else that is faster than std::map. - auto const it = m_featureTypes.find(featureId); - if (it != m_featureTypes.cend()) + auto const it = m_wayToAccess.find(featureId); + if (it != m_wayToAccess.cend()) return it->second; return RoadAccess::Type::Yes; } -RoadAccess::Type RoadAccess::GetPointType(RoadPoint const & point) const +RoadAccess::Type RoadAccess::GetAccess(RoadPoint const & point) const { - auto const it = m_pointTypes.find(point); - if (it != m_pointTypes.cend()) + auto const it = m_pointToAccess.find(point); + if (it != m_pointToAccess.cend()) return it->second; return RoadAccess::Type::Yes; @@ -54,7 +54,7 @@ RoadAccess::Type RoadAccess::GetPointType(RoadPoint const & point) const bool RoadAccess::operator==(RoadAccess const & rhs) const { - return m_featureTypes == rhs.m_featureTypes && m_pointTypes == rhs.m_pointTypes; + return m_wayToAccess == rhs.m_wayToAccess && m_pointToAccess == rhs.m_pointToAccess; } // Functions --------------------------------------------------------------------------------------- @@ -87,9 +87,9 @@ string DebugPrint(RoadAccess const & r) size_t const kMaxIdsToShow = 10; ostringstream oss; oss << "RoadAccess { FeatureTypes ["; - PrintKV(oss, r.GetFeatureTypes(), kMaxIdsToShow); + PrintKV(oss, r.GetWayToAccess(), kMaxIdsToShow); oss << "], PointTypes ["; - PrintKV(oss, r.GetPointTypes(), kMaxIdsToShow); + PrintKV(oss, r.GetPointToAccess(), kMaxIdsToShow); oss << "] }"; return oss.str(); } diff --git a/routing/road_access.hpp b/routing/road_access.hpp index d37674c6db..914b90a1b1 100644 --- a/routing/road_access.hpp +++ b/routing/road_access.hpp @@ -43,47 +43,43 @@ public: Count }; - using FeatureTypeHashMap = ska::flat_hash_map; - using PointsTypeHashMap = ska::flat_hash_map; + using WayToAccess = ska::flat_hash_map; + using PointToAccess = ska::flat_hash_map; - FeatureTypeHashMap const & GetFeatureTypes() const + WayToAccess const & GetWayToAccess() const { - return m_featureTypes; + return m_wayToAccess; } - PointsTypeHashMap const & GetPointTypes() const + PointToAccess const & GetPointToAccess() const { - return m_pointTypes; + return m_pointToAccess; } - Type GetFeatureType(uint32_t featureId) const; - Type GetPointType(RoadPoint const & point) const; + Type GetAccess(uint32_t featureId) const; + Type GetAccess(RoadPoint const & point) const; - template - void SetAccessTypes(MF && mf, MP && mp) + template + void SetAccess(WayToAccess && wayToAccess, PointToAccess && pointToAccess) { - m_featureTypes = std::forward(mf); - m_pointTypes = std::forward(mp); + m_wayToAccess = std::forward(wayToAccess); + m_pointToAccess = std::forward(pointToAccess); } - void Clear(); - - void Swap(RoadAccess & rhs); - bool operator==(RoadAccess const & rhs) const; - template - void SetFeatureTypesForTests(MF && mf) + template + void SetWayToAccessForTests(WayToAccess && wayToAccess) { - m_featureTypes = std::forward(mf); + m_wayToAccess = std::forward(wayToAccess); } private: // If segmentIdx of a key in this map is 0, it means the // entire feature has the corresponding access type. // Otherwise, the information is about the segment with number (segmentIdx-1). - FeatureTypeHashMap m_featureTypes; - PointsTypeHashMap m_pointTypes; + WayToAccess m_wayToAccess; + PointToAccess m_pointToAccess; }; std::string ToString(RoadAccess::Type type); diff --git a/routing/road_access_serialization.hpp b/routing/road_access_serialization.hpp index 0b734a1b76..2e77d27417 100644 --- a/routing/road_access_serialization.hpp +++ b/routing/road_access_serialization.hpp @@ -53,8 +53,8 @@ public: for (size_t i = 0; i < static_cast(VehicleType::Count); ++i) { auto const pos = sink.Pos(); - SerializeOneVehicleType(sink, roadAccessByType[i].GetFeatureTypes(), - roadAccessByType[i].GetPointTypes()); + SerializeOneVehicleType(sink, roadAccessByType[i].GetWayToAccess(), + roadAccessByType[i].GetPointToAccess()); sectionSizes[i] = base::checked_cast(sink.Pos() - pos); } @@ -101,7 +101,7 @@ public: RoadAccessTypesPointMap mp; DeserializeOneVehicleType(src, mf, mp); - roadAccess.SetAccessTypes(std::move(mf), std::move(mp)); + roadAccess.SetAccess(std::move(mf), std::move(mp)); } } diff --git a/routing/routing_tests/index_graph_tools.cpp b/routing/routing_tests/index_graph_tools.cpp index 2897dc5282..35eeaa9223 100644 --- a/routing/routing_tests/index_graph_tools.cpp +++ b/routing/routing_tests/index_graph_tools.cpp @@ -307,8 +307,8 @@ void TestIndexGraphTopology::Builder::BuildJoints() void TestIndexGraphTopology::Builder::BuildGraphFromRequests(vector const & requests) { - RoadAccess::FeatureTypeHashMap featureTypes; - RoadAccess::PointsTypeHashMap pointTypes; + RoadAccess::WayToAccess featureTypes; + RoadAccess::PointToAccess pointTypes; for (auto const & request : requests) { BuildSegmentFromEdge(request); @@ -322,7 +322,7 @@ void TestIndexGraphTopology::Builder::BuildGraphFromRequests(vector pointTypes[RoadPoint(request.m_id, 1 /* pointId */)] = request.m_toAccessType; } - m_roadAccess.SetAccessTypes(move(featureTypes), move(pointTypes)); + m_roadAccess.SetAccess(move(featureTypes), move(pointTypes)); } void TestIndexGraphTopology::Builder::BuildSegmentFromEdge(EdgeRequest const & request) diff --git a/routing/routing_tests/road_access_test.cpp b/routing/routing_tests/road_access_test.cpp index 54fa0078cb..31fb2fff82 100644 --- a/routing/routing_tests/road_access_test.cpp +++ b/routing/routing_tests/road_access_test.cpp @@ -22,21 +22,21 @@ namespace { UNIT_TEST(RoadAccess_Serialization) { - RoadAccess::FeatureTypeHashMap const m0 = { + RoadAccess::WayToAccess const m0 = { {1 /* featureId */, RoadAccess::Type::No}, {2 /* featureId */, RoadAccess::Type::Private}, }; - RoadAccess::FeatureTypeHashMap const m1 = { + RoadAccess::WayToAccess const m1 = { {1 /* featureId */, RoadAccess::Type::Private}, {2 /* featureId */, RoadAccess::Type::Destination}, }; RoadAccess roadAccessCar; - roadAccessCar.SetFeatureTypesForTests(m0); + roadAccessCar.SetWayToAccessForTests(m0); RoadAccess roadAccessPedestrian; - roadAccessPedestrian.SetFeatureTypesForTests(m1); + roadAccessPedestrian.SetWayToAccessForTests(m1); RoadAccessSerializer::RoadAccessByVehicleType roadAccessAllTypes; roadAccessAllTypes[static_cast(VehicleType::Car)] = roadAccessCar;