/usr/include/osmium/storage/byid/vector.hpp is in libosmium-dev 0.0~20140910-9a069af-1+b1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | #ifndef OSMIUM_STORAGE_BYID_VECTOR_HPP
#define OSMIUM_STORAGE_BYID_VECTOR_HPP
/*
Copyright 2012 Jochen Topf <jochen@topf.org> and others (see README).
This file is part of Osmium (https://github.com/joto/osmium).
Osmium is free software: you can redistribute it and/or modify it under the
terms of the GNU Lesser General Public License or (at your option) the GNU
General Public License as published by the Free Software Foundation, either
version 3 of the Licenses, or (at your option) any later version.
Osmium is distributed in the hope that it will be useful, but WITHOUT ANY
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE. See the GNU Lesser General Public License and the GNU
General Public License for more details.
You should have received a copy of the Licenses along with Osmium. If not, see
<http://www.gnu.org/licenses/>.
*/
#include <algorithm>
#include <utility>
#include <vector>
#include <osmium/osm/types.hpp>
#include <osmium/storage/byid.hpp>
namespace Osmium {
namespace Storage {
namespace ById {
/**
* This class uses a vector of ID/Value pairs to store the
* data. The vector must be filled ordered by ID (OSM files
* are generally ordered that way, so thats usually not a
* problem). Lookup uses a binary search.
*
* This has very low memory overhead for small OSM datasets.
*/
template <typename TValue>
class Vector : public Osmium::Storage::ById::Base<TValue> {
struct item_t {
osm_object_id_t id;
TValue value;
item_t(osm_object_id_t i, TValue v = TValue()) :
id(i),
value(v) {
}
bool operator<(const item_t& other) const {
return this->id < other.id;
}
bool operator==(const item_t& other) const {
return this->id == other.id;
}
bool operator!=(const item_t& other) const {
return !(*this == other);
}
};
typedef std::vector<item_t> item_vector_t;
typedef typename item_vector_t::const_iterator item_vector_it_t;
public:
Vector() :
Base<TValue>(),
m_items() {
}
void set(const uint64_t id, const TValue value) {
m_items.push_back(item_t(id, value));
}
const TValue operator[](const uint64_t id) const {
const item_t item(id);
const item_vector_it_t result = std::lower_bound(m_items.begin(), m_items.end(), item);
if (result == m_items.end() || *result != item) {
return TValue(); // nothing found
} else {
return result->value;
}
}
uint64_t size() const {
return m_items.size();
}
uint64_t used_memory() const {
return size() * sizeof(item_t);
}
void clear() {
item_vector_t().swap(m_items);
}
private:
item_vector_t m_items;
}; // class Vector
} // namespace ById
} // namespace Storage
} // namespace Osmium
#endif // OSMIUM_STORAGE_BYID_VECTOR_HPP
|