From 1626bbda3cc74457871e2318a98a1c5d6e022d91 Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Fri, 4 Mar 2016 14:05:10 +0300 Subject: [PATCH] New function for finding outgoing cross nodes. --- routing/cross_mwm_road_graph.cpp | 20 +++++++++---------- routing/cross_routing_context.cpp | 7 +++---- routing/cross_routing_context.hpp | 3 ++- routing/routing_tests/cross_routing_tests.cpp | 7 ++++--- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/routing/cross_mwm_road_graph.cpp b/routing/cross_mwm_road_graph.cpp index 516c6d1398..65cdf945ac 100644 --- a/routing/cross_mwm_road_graph.cpp +++ b/routing/cross_mwm_road_graph.cpp @@ -155,13 +155,10 @@ bool CrossMwmGraph::ConstructBorderCrossImpl(OutgoingCrossNode const & startNode return false; crosses.clear(); nextMapping->LoadCrossContext(); - nextMapping->m_crossContext.ForEachIngoingNode([&](IngoingCrossNode const & node) + nextMapping->m_crossContext.ForEachIngoingNodeNearPoint(startNode.m_point, [&](IngoingCrossNode const & node) { - if (node.m_point == startNode.m_point) - { crosses.emplace_back(CrossNode(startNode.m_nodeId, currentMapping->GetMwmId(), node.m_point), CrossNode(node.m_nodeId, nextMapping->GetMwmId(), node.m_point)); - } }); return !crosses.empty(); } @@ -188,16 +185,17 @@ void CrossMwmGraph::GetOutgoingEdgesList(BorderCross const & v, // Find income node. IngoingCrossNode ingoingNode; - CHECK(currentContext.FindIngoingNodeByPoint(v.toNode.point, ingoingNode), ()); - if (ingoingNode.m_nodeId != v.toNode.node) - { - LOG(LDEBUG, ("Several nodes stores in one border point.", v.toNode.point)); - currentContext.ForEachIngoingNode([&ingoingNode, &v](IngoingCrossNode const & node) + bool found = false; + CHECK(currentContext.ForEachIngoingNodeNearPoint(v.toNode.point, [&ingoingNode, &v, &found](IngoingCrossNode const & node) { if (node.m_nodeId == v.toNode.node) + { + found = true; ingoingNode = node; - }); - } + } + }), ()); + + CHECK(found, ()); // Find outs. Generate adjacency list. currentContext.ForEachOutgoingNode([&, this](OutgoingCrossNode const & node) diff --git a/routing/cross_routing_context.cpp b/routing/cross_routing_context.cpp index ecaededd23..f9fb4bc724 100644 --- a/routing/cross_routing_context.cpp +++ b/routing/cross_routing_context.cpp @@ -96,17 +96,16 @@ void CrossRoutingContextReader::Load(Reader const & r) } } -bool CrossRoutingContextReader::FindIngoingNodeByPoint(ms::LatLon const & point, - IngoingCrossNode & node) const +bool CrossRoutingContextReader::ForEachIngoingNodeNearPoint(ms::LatLon const & point, function && fn) const { bool found = false; m_ingoingIndex.ForEachInRect(m2::RectD(point.lat - kMwmCrossingNodeEqualityRadiusDegrees, point.lon - kMwmCrossingNodeEqualityRadiusDegrees, point.lat + kMwmCrossingNodeEqualityRadiusDegrees, point.lon + kMwmCrossingNodeEqualityRadiusDegrees), - [&found, &node](IngoingCrossNode const & nd) + [&found, &fn](IngoingCrossNode const & node) { - node = nd; + fn(node); found = true; }); return found; diff --git a/routing/cross_routing_context.hpp b/routing/cross_routing_context.hpp index c50cb7e37d..6e3a0e04b6 100644 --- a/routing/cross_routing_context.hpp +++ b/routing/cross_routing_context.hpp @@ -7,6 +7,7 @@ #include "geometry/rect2d.hpp" #include "geometry/tree4d.hpp" +#include "std/function.hpp" #include "std/string.hpp" #include "std/vector.hpp" @@ -87,7 +88,7 @@ public: const string & GetOutgoingMwmName(OutgoingCrossNode const & mwmIndex) const; - bool FindIngoingNodeByPoint(ms::LatLon const & point, IngoingCrossNode & node) const; + bool ForEachIngoingNodeNearPoint(ms::LatLon const & point, function && fn) const; TWrittenEdgeWeight GetAdjacencyCost(IngoingCrossNode const & ingoing, OutgoingCrossNode const & outgoing) const; diff --git a/routing/routing_tests/cross_routing_tests.cpp b/routing/routing_tests/cross_routing_tests.cpp index f9c591ef57..340dba8e88 100644 --- a/routing/routing_tests/cross_routing_tests.cpp +++ b/routing/routing_tests/cross_routing_tests.cpp @@ -137,10 +137,11 @@ UNIT_TEST(TestFindingByPoint) MemReader reader(buffer.data(), buffer.size()); newContext.Load(reader); IngoingCrossNode node; - TEST(newContext.FindIngoingNodeByPoint(p1, node), ()); + auto fn = [&node](IngoingCrossNode const & nd) {node = nd;}; + TEST(newContext.ForEachIngoingNodeNearPoint(p1, fn), ()); TEST_EQUAL(node.m_nodeId, 2, ()); - TEST(newContext.FindIngoingNodeByPoint(p2, node), ()); + TEST(newContext.ForEachIngoingNodeNearPoint(p2, fn), ()); TEST_EQUAL(node.m_nodeId, 3, ()); - TEST(!newContext.FindIngoingNodeByPoint(p3, node), ()); + TEST(!newContext.ForEachIngoingNodeNearPoint(p3, fn), ()); } } // namespace