1 #ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
2 #define OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
36 #ifdef OSMIUM_WITH_SPARSEHASH
42 #include <google/sparsetable>
46 #include <osmium/io/detail/read_write.hpp>
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 ~SparseMemTable() override final = default;
92 void set(const TId
id, const TValue value) override final {
93 if (
id >= m_elements.size()) {
94 m_elements.resize(
id + m_grow_size);
96 m_elements[id] = value;
99 const TValue
get(
const TId id)
const override final {
100 if (
id >= m_elements.size()) {
103 if (m_elements[
id] == osmium::index::empty_value<TValue>()) {
106 return m_elements[id];
109 size_t size() const override final {
110 return m_elements.size();
113 size_t used_memory() const override final {
116 return (m_elements.size() / 8) + (m_elements.num_nonempty() *
sizeof(TValue));
119 void clear() override final {
123 void dump_as_list(
const int fd)
override final {
124 std::vector<std::pair<TId, TValue>> v;
126 for (
const TValue value : m_elements) {
127 if (value != osmium::index::empty_value<TValue>()) {
128 v.emplace_back(n, value);
132 osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()),
sizeof(std::pair<TId, TValue>) * v.size());
143 #endif // OSMIUM_WITH_SPARSEHASH
145 #endif // OSMIUM_INDEX_BYID_SPARSE_MEM_TABLE_HPP
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
OSMIUM_NORETURN void not_found_error(TKey key)
Definition: index.hpp:68