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")
 | 
			
		||||
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_SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/flatbuffers")
 | 
			
		||||
set(FLATBUFFERS_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/flatbuffers/include")
 | 
			
		||||
@ -358,7 +362,7 @@ if(ENABLE_CONAN)
 | 
			
		||||
    KEEP_RPATHS
 | 
			
		||||
    NO_OUTPUT_DIRS
 | 
			
		||||
    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
 | 
			
		||||
    BUILD missing
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
@ -9,54 +9,12 @@
 | 
			
		||||
#include <limits>
 | 
			
		||||
#include <map>
 | 
			
		||||
#include <optional>
 | 
			
		||||
#include <unordered_map>
 | 
			
		||||
#include <ankerl/unordered_dense.h>
 | 
			
		||||
#include <vector>
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
{
 | 
			
		||||
  public:
 | 
			
		||||
@ -98,7 +56,9 @@ template <typename NodeID, typename Key> class MapStorage
 | 
			
		||||
template <typename NodeID, typename Key> class UnorderedMapStorage
 | 
			
		||||
{
 | 
			
		||||
  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]; }
 | 
			
		||||
 | 
			
		||||
@ -121,7 +81,7 @@ template <typename NodeID, typename Key> class UnorderedMapStorage
 | 
			
		||||
    void Clear() { nodes.clear(); }
 | 
			
		||||
 | 
			
		||||
  private:
 | 
			
		||||
    std::unordered_map<NodeID, Key> nodes;
 | 
			
		||||
   ankerl::unordered_dense::map<NodeID, Key> nodes;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename NodeID,
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user