#include "engine/search_engine_data.hpp" namespace osrm::engine { // CH heaps using CH = routing_algorithms::ch::Algorithm; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_1; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_1; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_2; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_2; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_3; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_3; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::map_matching_forward_heap_1; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::map_matching_reverse_heap_1; thread_local std::vector::SearchEngineHeapPtr> SearchEngineData::map_matching_reverse_heaps; thread_local SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap; void SearchEngineData::InitializeOrClearMapMatchingThreadLocalStorage(unsigned number_of_nodes) { if (map_matching_forward_heap_1.get()) { map_matching_forward_heap_1->Clear(); } else { map_matching_forward_heap_1.reset(new QueryHeap(number_of_nodes)); } if (map_matching_reverse_heap_1.get()) { map_matching_reverse_heap_1->Clear(); } else { map_matching_reverse_heap_1.reset(new QueryHeap(number_of_nodes)); } } void SearchEngineData::InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes) { if (forward_heap_1.get()) { forward_heap_1->Clear(); } else { forward_heap_1.reset(new QueryHeap(number_of_nodes)); } if (reverse_heap_1.get()) { reverse_heap_1->Clear(); } else { reverse_heap_1.reset(new QueryHeap(number_of_nodes)); } } void SearchEngineData::InitializeOrClearSecondThreadLocalStorage(unsigned number_of_nodes) { if (forward_heap_2.get()) { forward_heap_2->Clear(); } else { forward_heap_2.reset(new QueryHeap(number_of_nodes)); } if (reverse_heap_2.get()) { reverse_heap_2->Clear(); } else { reverse_heap_2.reset(new QueryHeap(number_of_nodes)); } } void SearchEngineData::InitializeOrClearThirdThreadLocalStorage(unsigned number_of_nodes) { if (forward_heap_3.get()) { forward_heap_3->Clear(); } else { forward_heap_3.reset(new QueryHeap(number_of_nodes)); } if (reverse_heap_3.get()) { reverse_heap_3->Clear(); } else { reverse_heap_3.reset(new QueryHeap(number_of_nodes)); } } void SearchEngineData::InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes) { if (many_to_many_heap.get()) { many_to_many_heap->Clear(); } else { many_to_many_heap.reset(new ManyToManyQueryHeap(number_of_nodes)); } } // MLD using MLD = routing_algorithms::mld::Algorithm; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::forward_heap_1; thread_local SearchEngineData::SearchEngineHeapPtr SearchEngineData::reverse_heap_1; thread_local SearchEngineData::MapMatchingHeapPtr SearchEngineData::map_matching_forward_heap_1; thread_local SearchEngineData::MapMatchingHeapPtr SearchEngineData::map_matching_reverse_heap_1; thread_local SearchEngineData::ManyToManyHeapPtr SearchEngineData::many_to_many_heap; thread_local std::vector::MapMatchingHeapPtr> SearchEngineData::map_matching_reverse_heaps; void SearchEngineData::InitializeOrClearMapMatchingThreadLocalStorage( unsigned number_of_nodes, unsigned number_of_boundary_nodes, size_t max_candidates) { if (map_matching_forward_heap_1.get()) { map_matching_forward_heap_1->Clear(); } else { map_matching_forward_heap_1.reset( new MapMatchingQueryHeap(number_of_nodes, number_of_boundary_nodes)); } if (map_matching_reverse_heap_1.get()) { map_matching_reverse_heap_1->Clear(); } else { map_matching_reverse_heap_1.reset( new MapMatchingQueryHeap(number_of_nodes, number_of_boundary_nodes)); } if (max_candidates > map_matching_reverse_heaps.size()) { size_t to_add = max_candidates - map_matching_reverse_heaps.size(); for (unsigned i = 0; i < to_add; ++i) { map_matching_reverse_heaps.emplace_back( new MapMatchingQueryHeap(number_of_nodes, number_of_boundary_nodes)); } } } void SearchEngineData::InitializeOrClearFirstThreadLocalStorage( unsigned number_of_nodes, unsigned number_of_boundary_nodes) { if (forward_heap_1.get()) { forward_heap_1->Clear(); } else { forward_heap_1.reset(new QueryHeap(number_of_nodes, number_of_boundary_nodes)); } if (reverse_heap_1.get()) { reverse_heap_1->Clear(); } else { reverse_heap_1.reset(new QueryHeap(number_of_nodes, number_of_boundary_nodes)); } } void SearchEngineData::InitializeOrClearManyToManyThreadLocalStorage( unsigned number_of_nodes, unsigned number_of_boundary_nodes) { if (many_to_many_heap.get()) { many_to_many_heap->Clear(); } else { many_to_many_heap.reset(new ManyToManyQueryHeap(number_of_nodes, number_of_boundary_nodes)); } } } // namespace osrm::engine