diff options
author | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-05-27 18:05:55 +0300 |
---|---|---|
committer | Vladimir Byko-Ianko <v.bykoianko@corp.mail.ru> | 2016-05-27 18:10:01 +0300 |
commit | 8f7da1501a7382a7ee16641fc459ee4354f43d37 (patch) | |
tree | 5ff985b5cbf7e51b6c46d52ffb7ed5e9cdc75ffb /routing | |
parent | de449b38b67dddd6308c6b1875e6818e08851b1a (diff) |
[bicycle routing] Simplifying IRoadGraph::ForEachEdge().
Diffstat (limited to 'routing')
-rw-r--r-- | routing/road_graph.cpp | 25 | ||||
-rw-r--r-- | routing/road_graph.hpp | 26 |
2 files changed, 19 insertions, 32 deletions
diff --git a/routing/road_graph.cpp b/routing/road_graph.cpp index 31ef1db95f..271e258e63 100644 --- a/routing/road_graph.cpp +++ b/routing/road_graph.cpp @@ -158,33 +158,20 @@ IRoadGraph::RoadInfo::RoadInfo(bool bidirectional, double speedKMPH, initializer // IRoadGraph::CrossOutgoingLoader --------------------------------------------- void IRoadGraph::CrossOutgoingLoader::LoadEdges(FeatureID const & featureId, RoadInfo const & roadInfo) { - ForEachEdge(roadInfo, [&featureId, &roadInfo, this](size_t i, m2::PointD const & p) + ForEachEdge(roadInfo, [&featureId, &roadInfo, this](size_t segId, m2::PointD const & endPoint, bool forward) { - ASSERT_LESS(i, roadInfo.m_points.size() - 1, ()); - m_edges.emplace_back(featureId, true /* forward */, i, p, roadInfo.m_points[i + 1]); - }, - [&featureId, &roadInfo, this](size_t i, m2::PointD const & p) - { - ASSERT_LESS(i, roadInfo.m_points.size(), ()); - if (roadInfo.m_bidirectional || m_mode == IRoadGraph::Mode::IgnoreOnewayTag) - m_edges.emplace_back(featureId, false /* forward */, i - 1, p, roadInfo.m_points[i - 1]); + if (forward || roadInfo.m_bidirectional || m_mode == IRoadGraph::Mode::IgnoreOnewayTag) + m_edges.emplace_back(featureId, forward, segId, m_cross, endPoint); }); } // IRoadGraph::CrossIngoingLoader ---------------------------------------------- void IRoadGraph::CrossIngoingLoader::LoadEdges(FeatureID const & featureId, RoadInfo const & roadInfo) { - ForEachEdge(roadInfo, - [&featureId, &roadInfo, this](size_t i, m2::PointD const & p) - { - ASSERT_LESS(i, roadInfo.m_points.size() - 1, ()); - if (roadInfo.m_bidirectional || m_mode == IRoadGraph::Mode::IgnoreOnewayTag) - m_edges.emplace_back(featureId, false /* forward */, i, roadInfo.m_points[i + 1], p); - }, - [&featureId, &roadInfo, this](size_t i, m2::PointD const & p) + ForEachEdge(roadInfo, [&featureId, &roadInfo, this](size_t segId, m2::PointD const & endPoint, bool forward) { - ASSERT_LESS(i, roadInfo.m_points.size() , ()); - m_edges.emplace_back(featureId, true /* forward */, i - 1, roadInfo.m_points[i - 1], p); + if (!forward || roadInfo.m_bidirectional || m_mode == IRoadGraph::Mode::IgnoreOnewayTag) + m_edges.emplace_back(featureId, !forward, segId, endPoint, m_cross); }); } diff --git a/routing/road_graph.hpp b/routing/road_graph.hpp index f5fdf160c7..e97a9cb0f2 100644 --- a/routing/road_graph.hpp +++ b/routing/road_graph.hpp @@ -125,27 +125,27 @@ public: virtual void LoadEdges(FeatureID const & featureId, RoadInfo const & roadInfo) = 0; protected: - template <typename THeadFn, typename TTailFn> - void ForEachEdge(RoadInfo const & roadInfo, THeadFn && headFn, TTailFn && tailFn) + template <typename TFn> + void ForEachEdge(RoadInfo const & roadInfo, TFn && fn) { for (size_t i = 0; i < roadInfo.m_points.size(); ++i) { - m2::PointD const & p = roadInfo.m_points[i]; - - if (!my::AlmostEqualAbs(m_cross, p, kPointsEqualEpsilon)) + if (!my::AlmostEqualAbs(m_cross, roadInfo.m_points[i], kPointsEqualEpsilon)) continue; - if (i > 0) + if (i < roadInfo.m_points.size() - 1) { - // p - // o------------>o - tailFn(i, p); + // Head of the edge. + // m_cross + // o------------>o + fn(i, roadInfo.m_points[i + 1], true /* forward */); } - if (i < roadInfo.m_points.size() - 1) + if (i > 0) { - // p - // o------------>o - headFn(i, p); + // Tail of the edge. + // m_cross + // o------------>o + fn(i - 1, roadInfo.m_points[i - 1], false /* backward */); } } } |