From 78dd5ac09224cdb2ba6118f34cb9a096948d6597 Mon Sep 17 00:00:00 2001 From: Lev Dragunov Date: Tue, 23 Jun 2015 17:46:21 +0300 Subject: [PATCH] Comparator fix to exclude unobvious behavior. --- routing/cross_mwm_road_graph.cpp | 20 +++++++++------- routing/cross_mwm_road_graph.hpp | 7 ++++-- routing/cross_mwm_router.cpp | 1 + routing/routing_tests/cross_routing_tests.cpp | 24 ------------------- 4 files changed, 18 insertions(+), 34 deletions(-) diff --git a/routing/cross_mwm_road_graph.cpp b/routing/cross_mwm_road_graph.cpp index 06b7649856..32b6611980 100644 --- a/routing/cross_mwm_road_graph.cpp +++ b/routing/cross_mwm_road_graph.cpp @@ -74,7 +74,19 @@ IRouter::ResultCode CrossMwmGraph::SetFinalNode(CrossNode const & finalNode) return IRouter::RouteNotFound; for (auto j = mwmIngoingIter.first; j != mwmIngoingIter.second; ++j) + { + // Case with a target node at the income mwm node. + if (j->m_nodeId == finalNode.node) + { + CrossNode start(j->m_nodeId, finalNode.mwmName, + MercatorBounds::FromLatLon(j->m_point.y, j->m_point.x)); + vector dummyEdges; + dummyEdges.emplace_back(BorderCross(finalNode, finalNode), 0 /* no weight */); + m_virtualEdges.insert(make_pair(start, dummyEdges)); + return IRouter::NoError; + } sources.emplace_back(j->m_nodeId, true /* isStartNode */, finalNode.mwmName); + } vector weights; targets[0] = FeatureGraphNode(finalNode.node, false /* isStartNode */, finalNode.mwmName); @@ -199,15 +211,7 @@ void ConvertToSingleRouterTasks(vector const & graphCrosses, if (route.empty()) return; - // Starts of virtual nodes are always present because they are not compaired in A* algo. route.front().startNode = startGraphNode; - - // Stop point lays on out edge, and we have no virtual edge to unpack. - if (route.back().startNode.mwmName != finalGraphNode.mwmName) - route.emplace_back(graphCrosses.back().toNode.node, - graphCrosses.back().toNode.node, - graphCrosses.back().toNode.mwmName); - route.back().finalNode = finalGraphNode; } diff --git a/routing/cross_mwm_road_graph.hpp b/routing/cross_mwm_road_graph.hpp index 8bdebddbbe..dd57bc8309 100644 --- a/routing/cross_mwm_road_graph.hpp +++ b/routing/cross_mwm_road_graph.hpp @@ -20,9 +20,10 @@ struct CrossNode NodeID node; string mwmName; m2::PointD point; + bool isVirtual; CrossNode(NodeID node, string const & mwmName, m2::PointD const & point) - : node(node), mwmName(mwmName), point(point) + : node(node), mwmName(mwmName), point(point), isVirtual(false) { } @@ -32,13 +33,15 @@ struct CrossNode inline bool operator==(CrossNode const & a) const { - return node == a.node && mwmName == a.mwmName; + return node == a.node && mwmName == a.mwmName && isVirtual == a.isVirtual; } inline bool operator<(CrossNode const & a) const { if (a.node != node) return node < a.node; + if(isVirtual != a.isVirtual) + return isVirtual < a.isVirtual; return mwmName < a.mwmName; } }; diff --git a/routing/cross_mwm_router.cpp b/routing/cross_mwm_router.cpp index 14934f9918..7591f6bd1d 100644 --- a/routing/cross_mwm_router.cpp +++ b/routing/cross_mwm_router.cpp @@ -74,6 +74,7 @@ IRouter::ResultCode CalculateCrossMwmPath(TRoutingNodes const & startGraphNodes, for (FeatureGraphNode const & final : finalGraphNodes) { finalNode = CrossNode(final.node.reverse_node_id, final.mwmName, final.segmentPoint); + finalNode.isVirtual = true; code = roadGraph.SetFinalNode(finalNode); if (code == IRouter::NoError) { diff --git a/routing/routing_tests/cross_routing_tests.cpp b/routing/routing_tests/cross_routing_tests.cpp index db81467bd9..d5f355eb82 100644 --- a/routing/routing_tests/cross_routing_tests.cpp +++ b/routing/routing_tests/cross_routing_tests.cpp @@ -37,30 +37,6 @@ UNIT_TEST(TestCrossRouteConverter) ("End node must be replaced by origin.")); } -UNIT_TEST(TestCrossRouteConverterEdgeCase) -{ - vector graphCrosses; - CrossNode const a(1, "aMap", {0, 0}), b(2, "aMap", {2, 2}); - CrossNode const c(3, "bMap", {3, 3}); - graphCrosses.emplace_back(a, b); - graphCrosses.emplace_back(b, c); - FeatureGraphNode startGraphNode; - startGraphNode.node.forward_node_id = 5; - startGraphNode.mwmName = "aMap"; - FeatureGraphNode finalGraphNode; - finalGraphNode.node.reverse_node_id = 6; - finalGraphNode.mwmName = "bMap"; - TCheckedPath route; - ConvertToSingleRouterTasks(graphCrosses, startGraphNode, finalGraphNode, route); - TEST_EQUAL(route.size(), 2, ("We have 2 maps aMap and bMap.")); - for (auto const & r : route) - TEST_EQUAL(r.startNode.mwmName, r.finalNode.mwmName, ()); - TEST_EQUAL(route.front().startNode.node, startGraphNode.node, - ("Start node must be replaced by origin.")); - TEST_EQUAL(route.back().finalNode.node, finalGraphNode.node, - ("End node must be replaced by origin.")); -} - // Cross routing context tests. UNIT_TEST(TestContextSerialization) {