bool needsLoopForward(const PhantomNode &source_phantom, const PhantomNode &target_phantom) { return source_phantom.IsValidForwardSource() && target_phantom.IsValidForwardTarget() && source_phantom.forward_segment_id.id == target_phantom.forward_segment_id.id && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset(); }
inline bool forceLoop(bool forward, const PhantomNode &source_phantom, const PhantomNode &target_phantom) const { if (forward) return source_phantom.forward_node_id == target_phantom.forward_node_id && source_phantom.GetForwardWeightPlusOffset() > target_phantom.GetForwardWeightPlusOffset(); else return source_phantom.reverse_node_id == target_phantom.reverse_node_id && source_phantom.GetReverseWeightPlusOffset() > target_phantom.GetReverseWeightPlusOffset(); };
// allows a uturn at the target_phantom // searches source forward/reverse -> target forward/reverse void SearchWithUTurn(QueryHeap &forward_heap, QueryHeap &reverse_heap, const bool search_from_forward_node, const bool search_from_reverse_node, const bool search_to_forward_node, const bool search_to_reverse_node, const PhantomNode &source_phantom, const PhantomNode &target_phantom, const int total_distance_to_forward, const int total_distance_to_reverse, int &new_total_distance, std::vector<NodeID> &leg_packed_path) const { forward_heap.Clear(); reverse_heap.Clear(); if (search_from_forward_node) { forward_heap.Insert(source_phantom.forward_node_id, total_distance_to_forward - source_phantom.GetForwardWeightPlusOffset(), source_phantom.forward_node_id); } if (search_from_reverse_node) { forward_heap.Insert(source_phantom.reverse_node_id, total_distance_to_reverse - source_phantom.GetReverseWeightPlusOffset(), source_phantom.reverse_node_id); } if (search_to_forward_node) { reverse_heap.Insert(target_phantom.forward_node_id, target_phantom.GetForwardWeightPlusOffset(), target_phantom.forward_node_id); } if (search_to_reverse_node) { reverse_heap.Insert(target_phantom.reverse_node_id, target_phantom.GetReverseWeightPlusOffset(), target_phantom.reverse_node_id); } BOOST_ASSERT(forward_heap.Size() > 0); BOOST_ASSERT(reverse_heap.Size() > 0); super::Search(forward_heap, reverse_heap, new_total_distance, leg_packed_path, forceLoop(FORWARD_DIRECTION, source_phantom, target_phantom), forceLoop(REVERSE_DIRECTION, source_phantom, target_phantom)); }