Try to use ankerl::unordered_dense::map instead of std::unordered_map in UnorderedMapStorage
This commit is contained in:
		
							parent
							
								
									fafe1d4f81
								
							
						
					
					
						commit
						0f5ffc2a84
					
				@ -300,6 +300,10 @@ include_directories(SYSTEM ${PROTOZERO_INCLUDE_DIR})
 | 
				
			|||||||
set(VTZERO_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vtzero/include")
 | 
					set(VTZERO_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/vtzero/include")
 | 
				
			||||||
include_directories(SYSTEM ${VTZERO_INCLUDE_DIR})
 | 
					include_directories(SYSTEM ${VTZERO_INCLUDE_DIR})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(ANKERL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/unordered_dense/include")
 | 
				
			||||||
 | 
					include_directories(SYSTEM ${ANKERL_INCLUDE_DIR})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "Disable the build of Flatbuffers tests and samples.")
 | 
					set(FLATBUFFERS_BUILD_TESTS OFF CACHE BOOL "Disable the build of Flatbuffers tests and samples.")
 | 
				
			||||||
set(FLATBUFFERS_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/flatbuffers")
 | 
					set(FLATBUFFERS_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/flatbuffers")
 | 
				
			||||||
set(FLATBUFFERS_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/flatbuffers/include")
 | 
					set(FLATBUFFERS_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/flatbuffers/include")
 | 
				
			||||||
@ -358,7 +362,7 @@ if(ENABLE_CONAN)
 | 
				
			|||||||
    KEEP_RPATHS
 | 
					    KEEP_RPATHS
 | 
				
			||||||
    NO_OUTPUT_DIRS
 | 
					    NO_OUTPUT_DIRS
 | 
				
			||||||
    OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake
 | 
					    OPTIONS boost:filesystem_version=3 # https://stackoverflow.com/questions/73392648/error-with-boost-filesystem-version-in-cmake
 | 
				
			||||||
            onetbb:shared=${TBB_SHARED}
 | 
					           # onetbb:shared=${TBB_SHARED}
 | 
				
			||||||
            boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
 | 
					            boost:without_stacktrace=True # Apple Silicon cross-compilation fails without it
 | 
				
			||||||
    BUILD missing
 | 
					    BUILD missing
 | 
				
			||||||
  )
 | 
					  )
 | 
				
			||||||
 | 
				
			|||||||
@ -9,54 +9,12 @@
 | 
				
			|||||||
#include <limits>
 | 
					#include <limits>
 | 
				
			||||||
#include <map>
 | 
					#include <map>
 | 
				
			||||||
#include <optional>
 | 
					#include <optional>
 | 
				
			||||||
#include <unordered_map>
 | 
					#include <ankerl/unordered_dense.h>
 | 
				
			||||||
#include <vector>
 | 
					#include <vector>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace osrm::util
 | 
					namespace osrm::util
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename NodeID, typename Key> class GenerationArrayStorage
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
    using GenerationCounter = std::uint16_t;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  public:
 | 
					 | 
				
			||||||
    explicit GenerationArrayStorage(std::size_t size)
 | 
					 | 
				
			||||||
        : positions(size, 0), generation(1), generations(size, 0)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Key &operator[](NodeID node)
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        generation[node] = generation;
 | 
					 | 
				
			||||||
        return positions[node];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    Key peek_index(const NodeID node) const
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        if (generations[node] < generation)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            return std::numeric_limits<Key>::max();
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        return positions[node];
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    void Clear()
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        generation++;
 | 
					 | 
				
			||||||
        // if generation overflows we end up at 0 again and need to clear the vector
 | 
					 | 
				
			||||||
        if (generation == 0)
 | 
					 | 
				
			||||||
        {
 | 
					 | 
				
			||||||
            generation = 1;
 | 
					 | 
				
			||||||
            std::fill(generations.begin(), generations.end(), 0);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  private:
 | 
					 | 
				
			||||||
    GenerationCounter generation;
 | 
					 | 
				
			||||||
    std::vector<GenerationCounter> generations;
 | 
					 | 
				
			||||||
    std::vector<Key> positions;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
template <typename NodeID, typename Key> class ArrayStorage
 | 
					template <typename NodeID, typename Key> class ArrayStorage
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
@ -98,7 +56,9 @@ template <typename NodeID, typename Key> class MapStorage
 | 
				
			|||||||
template <typename NodeID, typename Key> class UnorderedMapStorage
 | 
					template <typename NodeID, typename Key> class UnorderedMapStorage
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
  public:
 | 
					  public:
 | 
				
			||||||
    explicit UnorderedMapStorage(std::size_t) { nodes.rehash(1000); }
 | 
					    explicit UnorderedMapStorage(std::size_t) { 
 | 
				
			||||||
 | 
					        nodes.rehash(1000); 
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    Key &operator[](const NodeID node) { return nodes[node]; }
 | 
					    Key &operator[](const NodeID node) { return nodes[node]; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -121,7 +81,7 @@ template <typename NodeID, typename Key> class UnorderedMapStorage
 | 
				
			|||||||
    void Clear() { nodes.clear(); }
 | 
					    void Clear() { nodes.clear(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private:
 | 
					  private:
 | 
				
			||||||
    std::unordered_map<NodeID, Key> nodes;
 | 
					   ankerl::unordered_dense::map<NodeID, Key> nodes;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
template <typename NodeID,
 | 
					template <typename NodeID,
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
		Reference in New Issue
	
	Block a user