1 #ifndef OSMIUM_INDEX_MAP_FLEX_MEM_HPP 2 #define OSMIUM_INDEX_MAP_FLEX_MEM_HPP 45 #define OSMIUM_HAS_INDEX_MAP_FLEX_MEM 60 template <
typename TId,
typename TValue>
113 static uint64_t
block(
const uint64_t
id) noexcept {
117 static uint64_t
offset(
const uint64_t
id) noexcept {
124 if (num >= m_dense_blocks.size()) {
125 m_dense_blocks.resize(num + 1);
127 if (m_dense_blocks[num].empty()) {
128 m_dense_blocks[num].assign(
block_size, osmium::index::empty_value<TValue>());
133 m_sparse_entries.emplace_back(
id, value);
146 const auto it = std::lower_bound(m_sparse_entries.begin(),
147 m_sparse_entries.end(),
148 entry{
id, osmium::index::empty_value<TValue>()});
149 if (it == m_sparse_entries.end() || it->id !=
id) {
150 return osmium::index::empty_value<TValue>();
161 if (m_dense_blocks.size() <=
block(
id) || m_dense_blocks[
block(
id)].empty()) {
162 return osmium::index::empty_value<TValue>();
186 std::size_t
size() const noexcept final {
190 return m_sparse_entries.size();
195 m_sparse_entries.size() *
sizeof(
entry) +
196 m_dense_blocks.size() * (
block_size *
sizeof(TValue) +
sizeof(std::vector<TValue>));
199 void set(
const TId
id,
const TValue
value)
final {
214 TValue
get(
const TId
id)
const final {
216 if (
value == osmium::index::empty_value<TValue>()) {
223 m_sparse_entries.clear();
224 m_sparse_entries.shrink_to_fit();
225 m_dense_blocks.clear();
226 m_dense_blocks.shrink_to_fit();
232 std::sort(m_sparse_entries.begin(), m_sparse_entries.end());
247 for (
const auto entry : m_sparse_entries) {
250 m_sparse_entries.clear();
251 m_sparse_entries.shrink_to_fit();
256 std::pair<std::size_t, std::size_t>
stats() const noexcept {
257 std::size_t used_blocks = 0;
258 std::size_t empty_blocks = 0;
260 for (
const auto&
block : m_dense_blocks) {
268 return std::make_pair(used_blocks, empty_blocks);
279 #ifdef OSMIUM_WANT_NODE_LOCATION_MAPS 283 #endif // OSMIUM_INDEX_MAP_FLEX_MEM_HPP bool operator<(const entry other) const noexcept
Definition: flex_mem.hpp:98
std::size_t size() const noexcept final
Definition: flex_mem.hpp:186
TValue get_noexcept(const TId id) const noexcept final
Definition: flex_mem.hpp:207
#define REGISTER_MAP(id, value, klass, name)
Definition: map.hpp:285
void set_dense(const uint64_t id, const TValue value)
Definition: flex_mem.hpp:155
TValue get_dense(const uint64_t id) const noexcept
Definition: flex_mem.hpp:160
uint64_t unsigned_object_id_type
Type for OSM object (node, way, or relation) IDs where we only allow positive IDs.
Definition: types.hpp:46
Definition: location.hpp:551
bool is_dense() const noexcept
Definition: flex_mem.hpp:182
uint64_t m_max_id
Definition: flex_mem.hpp:108
Definition: flex_mem.hpp:89
entry(uint64_t i, TValue v)
Definition: flex_mem.hpp:93
TValue get_sparse(const uint64_t id) const noexcept
Definition: flex_mem.hpp:145
std::vector< entry > m_sparse_entries
Definition: flex_mem.hpp:103
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
Definition: flex_mem.hpp:70
Definition: flex_mem.hpp:76
std::pair< std::size_t, std::size_t > stats() const noexcept
Definition: flex_mem.hpp:256
void set_sparse(const uint64_t id, const TValue value)
Definition: flex_mem.hpp:132
void assure_block(const uint64_t num)
Definition: flex_mem.hpp:123
void sort() final
Definition: flex_mem.hpp:231
Definition: flex_mem.hpp:66
TValue value
Definition: flex_mem.hpp:91
static uint64_t offset(const uint64_t id) noexcept
Definition: flex_mem.hpp:117
Definition: location.hpp:271
std::vector< std::vector< TValue > > m_dense_blocks
Definition: flex_mem.hpp:105
static uint64_t block(const uint64_t id) noexcept
Definition: flex_mem.hpp:113
std::size_t used_memory() const noexcept final
Definition: flex_mem.hpp:193
Definition: flex_mem.hpp:85
Definition: flex_mem.hpp:61
uint64_t id
Definition: flex_mem.hpp:90
bool m_dense
Definition: flex_mem.hpp:111
void clear() final
Definition: flex_mem.hpp:222
void switch_to_dense()
Definition: flex_mem.hpp:243
FlexMem(bool use_dense=false)
Definition: flex_mem.hpp:178