1 #ifndef OSMIUM_INDEX_MAP_HPP
2 #define OSMIUM_INDEX_MAP_HPP
43 #include <type_traits>
84 template <
typename TId,
typename TValue>
106 virtual ~Map() =
default;
113 virtual void set(
const TId
id,
const TValue value) = 0;
116 virtual const TValue
get(
const TId id)
const = 0;
124 virtual size_t size()
const = 0;
139 virtual void clear() = 0;
150 throw std::runtime_error(
"can't dump as list");
154 throw std::runtime_error(
"can't dump as array");
161 template <
typename TId,
typename TValue>
184 std::string error_message {
"Support for map type '"};
185 error_message += map_type_name;
186 error_message +=
"' not compiled into this binary.";
187 throw std::runtime_error(error_message);
198 return m_callbacks.emplace(map_type_name, func).second;
202 return m_callbacks.count(map_type_name);
206 std::vector<std::string> result;
208 for (
const auto& cb : m_callbacks) {
209 result.push_back(cb.first);
212 std::sort(result.begin(), result.end());
217 std::unique_ptr<map_type>
create_map(
const std::string& config_string)
const {
220 if (config.empty()) {
221 throw std::runtime_error(
"Need non-empty map type name.");
224 auto it = m_callbacks.find(config[0]);
225 if (it != m_callbacks.end()) {
226 return std::unique_ptr<map_type>((it->second)(config));
236 template <
typename TId,
typename TValue,
template<
typename,
typename>
class TMap>
238 TMap<TId, TValue>*
operator()(
const std::vector<std::string>&) {
239 return new TMap<TId, TValue>();
245 template <
typename TId,
typename TValue,
template<
typename,
typename>
class TMap>
252 #define OSMIUM_CONCATENATE_DETAIL_(x, y) x##y
253 #define OSMIUM_CONCATENATE_(x, y) OSMIUM_CONCATENATE_DETAIL_(x, y)
254 #define OSMIUM_MAKE_UNIQUE_(x) OSMIUM_CONCATENATE_(x, __COUNTER__)
256 #define REGISTER_MAP(id, value, klass, name) \
258 const bool OSMIUM_MAKE_UNIQUE_(registered_index_map_##name) = osmium::index::register_map<id, value, klass>(#name); \
265 #endif // OSMIUM_INDEX_MAP_HPP
osmium::index::map::Map< id_type, value_type > map_type
Definition: map.hpp:168
std::map< const std::string, create_map_func > m_callbacks
Definition: map.hpp:173
#define OSMIUM_NORETURN
Definition: compatibility.hpp:44
virtual size_t size() const =0
virtual size_t used_memory() const =0
bool register_map(const std::string &map_type_name, create_map_func func)
Definition: map.hpp:197
TMap< TId, TValue > * operator()(const std::vector< std::string > &)
Definition: map.hpp:238
bool register_map(const std::string &name)
Definition: map.hpp:246
virtual void reserve(const size_t)
Definition: map.hpp:108
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
virtual void dump_as_array(const int)
Definition: map.hpp:153
std::unique_ptr< map_type > create_map(const std::string &config_string) const
Definition: map.hpp:217
TId key_type
The "key" type, usually osmium::unsigned_object_id_type.
Definition: map.hpp:99
TId id_type
Definition: map.hpp:166
static OSMIUM_NORETURN void error(const std::string &map_type_name)
Definition: map.hpp:183
virtual void dump_as_list(const int)
Definition: map.hpp:149
virtual void sort()
Definition: map.hpp:145
bool has_map_type(const std::string &map_type_name) const
Definition: map.hpp:201
static MapFactory< id_type, value_type > & instance()
Definition: map.hpp:192
Map & operator=(const Map &)=delete
TValue value_type
The "value" type, usually a Location or size_t.
Definition: map.hpp:102
std::vector< std::string > map_types() const
Definition: map.hpp:205
TValue value_type
Definition: map.hpp:167
MapFactory & operator=(const MapFactory &)=delete
std::vector< std::string > split_string(const std::string &str, const char sep, bool compact=false)
Definition: string.hpp:50
virtual void set(const TId id, const TValue value)=0
Set the field with id to value.
std::function< map_type *(const std::vector< std::string > &)> create_map_func
Definition: map.hpp:169