Comparator fix to exclude unobvious behavior.

This commit is contained in:
Lev Dragunov 2015-06-23 17:46:21 +03:00 committed by Alex Zolotarev
parent ff30928c9c
commit 78dd5ac092
4 changed files with 18 additions and 34 deletions

View file

@ -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<CrossWeightedEdge> 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<EdgeWeight> weights;
targets[0] = FeatureGraphNode(finalNode.node, false /* isStartNode */, finalNode.mwmName);
@ -199,15 +211,7 @@ void ConvertToSingleRouterTasks(vector<BorderCross> 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;
}

View file

@ -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;
}
};

View file

@ -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)
{

View file

@ -37,30 +37,6 @@ UNIT_TEST(TestCrossRouteConverter)
("End node must be replaced by origin."));
}
UNIT_TEST(TestCrossRouteConverterEdgeCase)
{
vector<BorderCross> 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)
{