diff --git a/routing/base/astar_algorithm.hpp b/routing/base/astar_algorithm.hpp index 350b7f8774..08c00382cd 100644 --- a/routing/base/astar_algorithm.hpp +++ b/routing/base/astar_algorithm.hpp @@ -207,6 +207,7 @@ public: template Result FindPath(P & params, RoutingResult & result) const; + /// Fetch routes until \a emitter returns false. template Result FindPathBidirectionalEx(P & params, Emitter && emitter) const; @@ -215,6 +216,7 @@ public: { return FindPathBidirectionalEx(params, [&result](RoutingResult && res) { + // Fetch first (best) route and stop. result = std::move(res); return true; }); diff --git a/routing/index_router.cpp b/routing/index_router.cpp index e3e6dc91b6..efa9741452 100644 --- a/routing/index_router.cpp +++ b/routing/index_router.cpp @@ -834,6 +834,7 @@ RouterResultCode IndexRouter::CalculateSubrouteLeapsOnlyMode( AlgoT algorithm; auto const result = algorithm.FindPathBidirectionalEx(params, [&routes, &edges, &keys](RoutingResultT && route) { + // Routes fetching is not necessary ordered by m_distance, so continue search. if (routes.size() > kMaxNumRoutes && routes.top().m_distance <= route.m_distance) return false; @@ -858,7 +859,7 @@ RouterResultCode IndexRouter::CalculateSubrouteLeapsOnlyMode( return keys[0].size() >= maxVertices && keys[1].size() >= maxVertices; }); - if (result != AlgoT::Result::OK) + if (routes.empty() || result == AlgoT::Result::Cancelled) return ConvertResult(result); candidates = routes.move();