1 #ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
2 #define OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
36 #ifdef OSMIUM_WITH_SPARSEHASH
40 #include <osmium/io/detail/read_write.hpp>
42 #include <google/sparsetable>
48 #define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_TABLE
67 template <
typename TId,
typename TValue>
72 google::sparsetable<TValue> m_elements;
85 explicit SparseMemTable(
const TId grow_size = 10000) :
86 m_grow_size(grow_size),
87 m_elements(grow_size) {
90 void set(
const TId
id,
const TValue value)
final {
91 if (
id >= m_elements.size()) {
92 m_elements.resize(
id + m_grow_size);
94 m_elements[id] = value;
97 TValue get(
const TId
id)
const final {
98 if (
id >= m_elements.size()) {
101 const TValue value = m_elements[id];
102 if (value == osmium::index::empty_value<TValue>()) {
108 TValue get_noexcept(
const TId
id)
const noexcept
final {
109 if (
id >= m_elements.size()) {
110 return osmium::index::empty_value<TValue>();
112 return m_elements[id];
115 size_t size() const final {
116 return m_elements.size();
119 size_t used_memory() const final {
122 return (m_elements.size() / 8) + (m_elements.num_nonempty() *
sizeof(TValue));
129 void dump_as_list(
const int fd)
final {
130 std::vector<std::pair<TId, TValue>> v;
131 v.reserve(m_elements.size());
133 for (
const TValue value : m_elements) {
134 if (value != osmium::index::empty_value<TValue>()) {
135 v.emplace_back(n, value);
139 osmium::io::detail::reliable_write(fd,
reinterpret_cast<const char*
>(v.data()),
sizeof(std::pair<TId, TValue>) * v.size());
150 #ifdef OSMIUM_WANT_NODE_LOCATION_MAPS
Definition: location.hpp:271
#define REGISTER_MAP(id, value, klass, name)
Definition: map.hpp:285
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
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