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>
43 #include <google/sparsetable>
49 #define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_TABLE
71 template <
typename TId,
typename TValue>
76 google::sparsetable<TValue> m_elements;
89 explicit SparseMemTable(
const TId grow_size = 10000) :
90 m_grow_size(grow_size),
91 m_elements(grow_size) {
94 void set(
const TId
id,
const TValue value)
final {
95 if (
id >= m_elements.size()) {
96 m_elements.resize(
id + m_grow_size);
98 m_elements[id] = value;
101 TValue get(
const TId
id)
const final {
102 if (
id >= m_elements.size()) {
105 const TValue value = m_elements[id];
106 if (value == osmium::index::empty_value<TValue>()) {
112 TValue get_noexcept(
const TId
id)
const noexcept
final {
113 if (
id >= m_elements.size()) {
114 return osmium::index::empty_value<TValue>();
116 return m_elements[id];
119 size_t size() const final {
120 return m_elements.size();
123 size_t used_memory() const final {
126 return (m_elements.size() / 8) + (m_elements.num_nonempty() *
sizeof(TValue));
133 void dump_as_list(
const int fd)
final {
134 std::vector<std::pair<TId, TValue>> v;
135 v.reserve(m_elements.size());
137 for (
const TValue value : m_elements) {
138 if (value != osmium::index::empty_value<TValue>()) {
139 v.emplace_back(n, value);
143 osmium::io::detail::reliable_write(fd,
reinterpret_cast<const char*
>(v.data()),
sizeof(std::pair<TId, TValue>) * v.size());
154 #ifdef OSMIUM_WANT_NODE_LOCATION_MAPS
Definition: location.hpp:271
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:51
#define REGISTER_MAP(id, value, klass, name)
Definition: map.hpp:286
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