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