Fix shared memory encoding for node-ids
This commit is contained in:
@@ -12,26 +12,6 @@ namespace osrm
|
||||
namespace util
|
||||
{
|
||||
|
||||
const constexpr std::size_t BITSIZE = 33;
|
||||
const constexpr std::size_t ELEMSIZE = 64;
|
||||
const constexpr std::size_t PACKSIZE = BITSIZE * ELEMSIZE;
|
||||
|
||||
/**
|
||||
* Returns the size of the packed vector datastructure with `elements` packed elements (the size of
|
||||
* its underlying vector)
|
||||
*/
|
||||
inline std::size_t PackedVectorSize(std::size_t elements)
|
||||
{
|
||||
return ceil(float(elements) / ELEMSIZE) * BITSIZE;
|
||||
};
|
||||
|
||||
/**
|
||||
* Returns the capacity of a packed vector with underlying vector size `vec_size`
|
||||
*/
|
||||
inline std::size_t PackedVectorCapacity(std::size_t vec_size)
|
||||
{
|
||||
return floor(float(vec_size) / BITSIZE) * ELEMSIZE;
|
||||
}
|
||||
|
||||
/**
|
||||
* Since OSM node IDs are (at the time of writing) not quite yet overflowing 32 bits, and
|
||||
@@ -41,9 +21,23 @@ inline std::size_t PackedVectorCapacity(std::size_t vec_size)
|
||||
* NOTE: this type is templated for future use, but will require a slight refactor to
|
||||
* configure BITSIZE and ELEMSIZE
|
||||
*/
|
||||
template <typename T, bool UseSharedMemory> class PackedVector
|
||||
template <typename T, bool UseSharedMemory=false> class PackedVector
|
||||
{
|
||||
static const constexpr std::size_t BITSIZE = 33;
|
||||
static const constexpr std::size_t ELEMSIZE = 64;
|
||||
static const constexpr std::size_t PACKSIZE = BITSIZE * ELEMSIZE;
|
||||
|
||||
public:
|
||||
|
||||
/**
|
||||
* Returns the size of the packed vector datastructure with `elements` packed elements (the size of
|
||||
* its underlying uint64 vector)
|
||||
*/
|
||||
inline static std::size_t elements_to_blocks(std::size_t elements)
|
||||
{
|
||||
return std::ceil(static_cast<double>(elements) * BITSIZE / ELEMSIZE);
|
||||
}
|
||||
|
||||
void push_back(T incoming_node_id)
|
||||
{
|
||||
std::uint64_t node_id = static_cast<std::uint64_t>(incoming_node_id);
|
||||
@@ -130,14 +124,14 @@ template <typename T, bool UseSharedMemory> class PackedVector
|
||||
template <bool enabled = UseSharedMemory>
|
||||
void reserve(typename std::enable_if<!enabled, std::size_t>::type capacity)
|
||||
{
|
||||
vec.reserve(PackedVectorSize(capacity));
|
||||
vec.reserve(elements_to_blocks(capacity));
|
||||
}
|
||||
|
||||
template <bool enabled = UseSharedMemory>
|
||||
void reset(typename std::enable_if<enabled, T>::type *ptr,
|
||||
void reset(typename std::enable_if<enabled, std::uint64_t>::type *ptr,
|
||||
typename std::enable_if<enabled, std::size_t>::type size)
|
||||
{
|
||||
vec.reset(reinterpret_cast<std::uint64_t *>(ptr), size);
|
||||
vec.reset(ptr, size);
|
||||
}
|
||||
|
||||
template <bool enabled = UseSharedMemory>
|
||||
@@ -146,7 +140,10 @@ template <typename T, bool UseSharedMemory> class PackedVector
|
||||
num_elements = count;
|
||||
}
|
||||
|
||||
std::size_t capacity() const { return PackedVectorCapacity(vec.capacity()); }
|
||||
std::size_t capacity() const
|
||||
{
|
||||
return std::floor(static_cast<double>(vec.capacity()) * ELEMSIZE / BITSIZE);
|
||||
}
|
||||
|
||||
private:
|
||||
typename util::ShM<std::uint64_t, UseSharedMemory>::vector vec;
|
||||
|
||||
Reference in New Issue
Block a user