From 69bc8a8b2214da798ffd39f6ebd98d82a1bf5103 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Sun, 21 Feb 2016 01:38:06 +0100 Subject: [PATCH] Fix unpacking for self-loop nodes not in core. Fixes #1999 --- .../routing_algorithms/routing_base.hpp | 33 ++++++++++++------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/include/engine/routing_algorithms/routing_base.hpp b/include/engine/routing_algorithms/routing_base.hpp index 96851b357..50c4b284c 100644 --- a/include/engine/routing_algorithms/routing_base.hpp +++ b/include/engine/routing_algorithms/routing_base.hpp @@ -679,18 +679,18 @@ template class BasicRoutingInterface BOOST_ASSERT_MSG((SPECIAL_NODEID != middle && INVALID_EDGE_WEIGHT != distance), "no path found"); - if (distance != forward_core_heap.GetKey(middle) + reverse_core_heap.GetKey(middle)) + // we need to unpack sub path from core heaps + if (facade->IsCoreNode(middle)) { - // self loop - BOOST_ASSERT(forward_core_heap.GetData(middle).parent == middle && - reverse_core_heap.GetData(middle).parent == middle); - packed_leg.push_back(middle); - packed_leg.push_back(middle); - } - else - { - // we need to unpack sub path from core heaps - if (facade->IsCoreNode(middle)) + if (distance != forward_core_heap.GetKey(middle) + reverse_core_heap.GetKey(middle)) + { + // self loop + BOOST_ASSERT(forward_core_heap.GetData(middle).parent == middle && + reverse_core_heap.GetData(middle).parent == middle); + packed_leg.push_back(middle); + packed_leg.push_back(middle); + } + else { std::vector packed_core_leg; RetrievePackedPathFromHeap(forward_core_heap, reverse_core_heap, middle, @@ -701,6 +701,17 @@ template class BasicRoutingInterface packed_leg.insert(packed_leg.end(), packed_core_leg.begin(), packed_core_leg.end()); RetrievePackedPathFromSingleHeap(reverse_heap, packed_core_leg.back(), packed_leg); } + } + else + { + if (distance != forward_heap.GetKey(middle) + reverse_heap.GetKey(middle)) + { + // self loop + BOOST_ASSERT(forward_heap.GetData(middle).parent == middle && + reverse_heap.GetData(middle).parent == middle); + packed_leg.push_back(middle); + packed_leg.push_back(middle); + } else { RetrievePackedPathFromHeap(forward_heap, reverse_heap, middle, packed_leg);