From 73a2a938b41606d8b13ab3e0441575bb639dc24f Mon Sep 17 00:00:00 2001 From: Dennis Luxen Date: Mon, 2 Mar 2015 11:55:55 +0100 Subject: [PATCH] use CRTP instead of virtual functions in routing plugins --- data_structures/search_engine_data.cpp | 36 ++++++++--------- data_structures/search_engine_data.hpp | 14 +++---- routing_algorithms/alternative_path.hpp | 25 ++++++------ routing_algorithms/many_to_many.hpp | 7 ++-- routing_algorithms/routing_base.hpp | 52 ++++++++++++------------- routing_algorithms/shortest_path.hpp | 13 ++++--- 6 files changed, 75 insertions(+), 72 deletions(-) diff --git a/data_structures/search_engine_data.cpp b/data_structures/search_engine_data.cpp index fbdbc06ce..3282a0ccb 100644 --- a/data_structures/search_engine_data.cpp +++ b/data_structures/search_engine_data.cpp @@ -31,63 +31,63 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes) { - if (forwardHeap.get()) + if (forward_heap_1.get()) { - forwardHeap->Clear(); + forward_heap_1->Clear(); } else { - forwardHeap.reset(new QueryHeap(number_of_nodes)); + forward_heap_1.reset(new QueryHeap(number_of_nodes)); } - if (backwardHeap.get()) + if (reverse_heap_1.get()) { - backwardHeap->Clear(); + reverse_heap_1->Clear(); } else { - backwardHeap.reset(new QueryHeap(number_of_nodes)); + reverse_heap_1.reset(new QueryHeap(number_of_nodes)); } } void SearchEngineData::InitializeOrClearSecondThreadLocalStorage(const unsigned number_of_nodes) { - if (forwardHeap2.get()) + if (forward_heap_2.get()) { - forwardHeap2->Clear(); + forward_heap_2->Clear(); } else { - forwardHeap2.reset(new QueryHeap(number_of_nodes)); + forward_heap_2.reset(new QueryHeap(number_of_nodes)); } - if (backwardHeap2.get()) + if (reverse_heap_2.get()) { - backwardHeap2->Clear(); + reverse_heap_2->Clear(); } else { - backwardHeap2.reset(new QueryHeap(number_of_nodes)); + reverse_heap_2.reset(new QueryHeap(number_of_nodes)); } } void SearchEngineData::InitializeOrClearThirdThreadLocalStorage(const unsigned number_of_nodes) { - if (forwardHeap3.get()) + if (forward_heap_3.get()) { - forwardHeap3->Clear(); + forward_heap_3->Clear(); } else { - forwardHeap3.reset(new QueryHeap(number_of_nodes)); + forward_heap_3.reset(new QueryHeap(number_of_nodes)); } - if (backwardHeap3.get()) + if (reverse_heap_3.get()) { - backwardHeap3->Clear(); + reverse_heap_3->Clear(); } else { - backwardHeap3.reset(new QueryHeap(number_of_nodes)); + reverse_heap_3.reset(new QueryHeap(number_of_nodes)); } } diff --git a/data_structures/search_engine_data.hpp b/data_structures/search_engine_data.hpp index 82ee706c7..8c1c1619e 100644 --- a/data_structures/search_engine_data.hpp +++ b/data_structures/search_engine_data.hpp @@ -1,6 +1,6 @@ /* -Copyright (c) 2014, Project OSRM contributors +Copyright (c) 2015, Project OSRM contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, @@ -44,12 +44,12 @@ struct SearchEngineData using QueryHeap = BinaryHeap>; using SearchEngineHeapPtr = boost::thread_specific_ptr; - static SearchEngineHeapPtr forwardHeap; - static SearchEngineHeapPtr backwardHeap; - static SearchEngineHeapPtr forwardHeap2; - static SearchEngineHeapPtr backwardHeap2; - static SearchEngineHeapPtr forwardHeap3; - static SearchEngineHeapPtr backwardHeap3; + static SearchEngineHeapPtr forward_heap_1; + static SearchEngineHeapPtr reverse_heap_1; + static SearchEngineHeapPtr forward_heap_2; + static SearchEngineHeapPtr reverse_heap_2; + static SearchEngineHeapPtr forward_heap_3; + static SearchEngineHeapPtr reverse_heap_3; void InitializeOrClearFirstThreadLocalStorage(const unsigned number_of_nodes); diff --git a/routing_algorithms/alternative_path.hpp b/routing_algorithms/alternative_path.hpp index 7dd15b533..3b509573a 100644 --- a/routing_algorithms/alternative_path.hpp +++ b/routing_algorithms/alternative_path.hpp @@ -45,9 +45,10 @@ const double VIAPATH_EPSILON = 0.15; // alternative at most 15% longer const double VIAPATH_GAMMA = 0.75; // alternative shares at most 75% with the shortest. template -class AlternativeRouting final : private BasicRoutingInterface +class AlternativeRouting final + : private BasicRoutingInterface> { - using super = BasicRoutingInterface; + using super = BasicRoutingInterface>; using EdgeData = typename DataFacadeT::EdgeData; using QueryHeap = SearchEngineData::QueryHeap; using SearchSpaceEdge = std::pair; @@ -94,10 +95,10 @@ class AlternativeRouting final : private BasicRoutingInterface engine_working_data.InitializeOrClearThirdThreadLocalStorage( super::facade->GetNumberOfNodes()); - QueryHeap &forward_heap1 = *(engine_working_data.forwardHeap); - QueryHeap &reverse_heap1 = *(engine_working_data.backwardHeap); - QueryHeap &forward_heap2 = *(engine_working_data.forwardHeap2); - QueryHeap &reverse_heap2 = *(engine_working_data.backwardHeap2); + QueryHeap &forward_heap1 = *(engine_working_data.forward_heap_1); + QueryHeap &reverse_heap1 = *(engine_working_data.reverse_heap_1); + QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2); + QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2); int upper_bound_to_shortest_path_distance = INVALID_EDGE_WEIGHT; NodeID middle_node = SPECIAL_NODEID; @@ -384,10 +385,10 @@ class AlternativeRouting final : private BasicRoutingInterface engine_working_data.InitializeOrClearSecondThreadLocalStorage( super::facade->GetNumberOfNodes()); - QueryHeap &existing_forward_heap = *engine_working_data.forwardHeap; - QueryHeap &existing_reverse_heap = *engine_working_data.backwardHeap; - QueryHeap &new_forward_heap = *engine_working_data.forwardHeap2; - QueryHeap &new_reverse_heap = *engine_working_data.backwardHeap2; + QueryHeap &existing_forward_heap = *engine_working_data.forward_heap_1; + QueryHeap &existing_reverse_heap = *engine_working_data.reverse_heap_1; + QueryHeap &new_forward_heap = *engine_working_data.forward_heap_2; + QueryHeap &new_reverse_heap = *engine_working_data.reverse_heap_2; std::vector packed_s_v_path; std::vector packed_v_t_path; @@ -841,8 +842,8 @@ class AlternativeRouting final : private BasicRoutingInterface engine_working_data.InitializeOrClearThirdThreadLocalStorage( super::facade->GetNumberOfNodes()); - QueryHeap &forward_heap3 = *engine_working_data.forwardHeap3; - QueryHeap &reverse_heap3 = *engine_working_data.backwardHeap3; + QueryHeap &forward_heap3 = *engine_working_data.forward_heap_3; + QueryHeap &reverse_heap3 = *engine_working_data.reverse_heap_3; int upper_bound = INVALID_EDGE_WEIGHT; NodeID middle = SPECIAL_NODEID; diff --git a/routing_algorithms/many_to_many.hpp b/routing_algorithms/many_to_many.hpp index 48bea0250..238880471 100644 --- a/routing_algorithms/many_to_many.hpp +++ b/routing_algorithms/many_to_many.hpp @@ -40,9 +40,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include template -class ManyToManyRouting final : public BasicRoutingInterface +class ManyToManyRouting final + : public BasicRoutingInterface> { - using super = BasicRoutingInterface; + using super = BasicRoutingInterface>; using QueryHeap = SearchEngineData::QueryHeap; SearchEngineData &engine_working_data; @@ -76,7 +77,7 @@ class ManyToManyRouting final : public BasicRoutingInterface engine_working_data.InitializeOrClearFirstThreadLocalStorage( super::facade->GetNumberOfNodes()); - QueryHeap &query_heap = *(engine_working_data.forwardHeap); + QueryHeap &query_heap = *(engine_working_data.forward_heap_1); SearchSpaceWithBuckets search_space_with_buckets; diff --git a/routing_algorithms/routing_base.hpp b/routing_algorithms/routing_base.hpp index 714d903cd..e10c86a59 100644 --- a/routing_algorithms/routing_base.hpp +++ b/routing_algorithms/routing_base.hpp @@ -37,17 +37,17 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include -SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap2; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap2; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::forwardHeap3; -SearchEngineData::SearchEngineHeapPtr SearchEngineData::backwardHeap3; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_1; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_1; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_2; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_2; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_3; +SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_3; -template class BasicRoutingInterface +template class BasicRoutingInterface { private: - typedef typename DataFacadeT::EdgeData EdgeData; + using EdgeData = typename DataFacadeT::EdgeData; protected: DataFacadeT *facade; @@ -56,14 +56,14 @@ template class BasicRoutingInterface BasicRoutingInterface() = delete; BasicRoutingInterface(const BasicRoutingInterface &) = delete; explicit BasicRoutingInterface(DataFacadeT *facade) : facade(facade) {} - virtual ~BasicRoutingInterface() {} + ~BasicRoutingInterface() {} - inline void RoutingStep(SearchEngineData::QueryHeap &forward_heap, - SearchEngineData::QueryHeap &reverse_heap, - NodeID *middle_node_id, - int *upper_bound, - const int min_edge_offset, - const bool forward_direction) const + void RoutingStep(SearchEngineData::QueryHeap &forward_heap, + SearchEngineData::QueryHeap &reverse_heap, + NodeID *middle_node_id, + int *upper_bound, + const int min_edge_offset, + const bool forward_direction) const { const NodeID node = forward_heap.DeleteMin(); const int distance = forward_heap.GetKey(node); @@ -148,9 +148,9 @@ template class BasicRoutingInterface } } - inline void UnpackPath(const std::vector &packed_path, - const PhantomNodes &phantom_node_pair, - std::vector &unpacked_path) const + void UnpackPath(const std::vector &packed_path, + const PhantomNodes &phantom_node_pair, + std::vector &unpacked_path) const { const bool start_traversed_in_reverse = (packed_path.front() != phantom_node_pair.source_phantom.forward_node_id); @@ -331,7 +331,7 @@ template class BasicRoutingInterface } } - inline void UnpackEdge(const NodeID s, const NodeID t, std::vector &unpacked_path) const + void UnpackEdge(const NodeID s, const NodeID t, std::vector &unpacked_path) const { std::stack> recursion_stack; recursion_stack.emplace(s, t); @@ -388,10 +388,10 @@ template class BasicRoutingInterface unpacked_path.emplace_back(t); } - inline void RetrievePackedPathFromHeap(const SearchEngineData::QueryHeap &forward_heap, - const SearchEngineData::QueryHeap &reverse_heap, - const NodeID middle_node_id, - std::vector &packed_path) const + void RetrievePackedPathFromHeap(const SearchEngineData::QueryHeap &forward_heap, + const SearchEngineData::QueryHeap &reverse_heap, + const NodeID middle_node_id, + std::vector &packed_path) const { RetrievePackedPathFromSingleHeap(forward_heap, middle_node_id, packed_path); std::reverse(packed_path.begin(), packed_path.end()); @@ -399,9 +399,9 @@ template class BasicRoutingInterface RetrievePackedPathFromSingleHeap(reverse_heap, middle_node_id, packed_path); } - inline void RetrievePackedPathFromSingleHeap(const SearchEngineData::QueryHeap &search_heap, - const NodeID middle_node_id, - std::vector &packed_path) const + void RetrievePackedPathFromSingleHeap(const SearchEngineData::QueryHeap &search_heap, + const NodeID middle_node_id, + std::vector &packed_path) const { NodeID current_node_id = middle_node_id; while (current_node_id != search_heap.GetData(current_node_id).parent) diff --git a/routing_algorithms/shortest_path.hpp b/routing_algorithms/shortest_path.hpp index bd2084008..4b3cc49a4 100644 --- a/routing_algorithms/shortest_path.hpp +++ b/routing_algorithms/shortest_path.hpp @@ -36,9 +36,10 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "../typedefs.h" template -class ShortestPathRouting final : public BasicRoutingInterface +class ShortestPathRouting final + : public BasicRoutingInterface> { - using super = BasicRoutingInterface; + using super = BasicRoutingInterface>; using QueryHeap = SearchEngineData::QueryHeap; SearchEngineData &engine_working_data; @@ -70,10 +71,10 @@ class ShortestPathRouting final : public BasicRoutingInterface engine_working_data.InitializeOrClearThirdThreadLocalStorage( super::facade->GetNumberOfNodes()); - QueryHeap &forward_heap1 = *(engine_working_data.forwardHeap); - QueryHeap &reverse_heap1 = *(engine_working_data.backwardHeap); - QueryHeap &forward_heap2 = *(engine_working_data.forwardHeap2); - QueryHeap &reverse_heap2 = *(engine_working_data.backwardHeap2); + QueryHeap &forward_heap1 = *(engine_working_data.forward_heap_1); + QueryHeap &reverse_heap1 = *(engine_working_data.reverse_heap_1); + QueryHeap &forward_heap2 = *(engine_working_data.forward_heap_2); + QueryHeap &reverse_heap2 = *(engine_working_data.reverse_heap_2); std::size_t current_leg = 0; // Get distance to next pair of target nodes.