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() noexcept final = default;
92 void set(const TId
id, const TValue value) final {
93 if (
id >= m_elements.size()) {
94 m_elements.resize(
id + m_grow_size);
96 m_elements[id] = value;
99 TValue
get(
const TId id)
const final {
100 if (
id >= m_elements.size()) {
103 const TValue value = m_elements[id];
104 if (value == osmium::index::empty_value<TValue>()) {
110 TValue get_noexcept(
const TId
id)
const noexcept
final {
111 if (
id >= m_elements.size()) {
112 return osmium::index::empty_value<TValue>();
114 return m_elements[id];
117 size_t size() const final {
118 return m_elements.size();
121 size_t used_memory() const final {
124 return (m_elements.size() / 8) + (m_elements.num_nonempty() *
sizeof(TValue));
131 void dump_as_list(
const int fd)
final {
132 std::vector<std::pair<TId, TValue>> v;
133 v.reserve(m_elements.size());
135 for (
const TValue value : m_elements) {
136 if (value != osmium::index::empty_value<TValue>()) {
137 v.emplace_back(n, value);
141 osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()),
sizeof(std::pair<TId, TValue>) * v.size());
152 #ifdef OSMIUM_WANT_NODE_LOCATION_MAPS 156 #endif // OSMIUM_WITH_SPARSEHASH 158 #endif // OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP #define REGISTER_MAP(id, value, klass, name)
Definition: map.hpp:283
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
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
Definition: location.hpp:273