1#ifndef OSMIUM_RELATIONS_MEMBERS_DATABASE_HPP
2#define OSMIUM_RELATIONS_MEMBERS_DATABASE_HPP
127 std::tie(other.member_id, other.member_num, other.relation_pos);
135 return a.member_id < b.member_id;
164 return std::count_if(range.begin(), range.end(), [](
const element& elem) {
165 return !elem.is_removed();
171 for (
auto& elem : range) {
172 elem.object_handle = handle;
200 std::size_t
size() const noexcept {
226 if (elem.is_removed()) {
228 }
else if (elem.object_handle.valid()) {
248 assert(
m_init_phase &&
"Can not call MembersDatabase::track() after MembersDatabase::prepare_for_lookup().");
250 m_elements.emplace_back(rel_handle.
pos(), member_id, member_num);
261 assert(
m_init_phase &&
"Can not call MembersDatabase::prepare_for_lookup() twice.");
275 assert(!
m_init_phase &&
"Call MembersDatabase::prepare_for_lookup() before calling remove().");
276 const auto range =
find(member_id);
288 for (
auto& elem : range) {
289 if (!elem.is_removed() && relation_id ==
m_relations_db[elem.relation_pos]->id()) {
307 assert(!
m_init_phase &&
"Call MembersDatabase::prepare_for_lookup() before calling get_object().");
308 const auto range =
find(
id);
312 const auto handle = range.begin()->object_handle;
313 if (handle.valid()) {
333 template <
typename TObject>
364 template <
typename TFunc>
365 bool add(
const TObject&
object, TFunc&& func) {
366 assert(!
m_init_phase &&
"Call MembersDatabase::prepare_for_lookup() before calling add().");
367 auto range =
find(
object.
id());
378 for (
auto& elem : range) {
379 assert(!elem.is_removed());
380 assert(elem.member_id ==
object.id());
383 assert(elem.member_num < rel_handle->members().size());
384 rel_handle.decrement_members();
386 if (rel_handle.has_all_members()) {
387 std::forward<TFunc>(func)(rel_handle);
405 assert(!
m_init_phase &&
"Call MembersDatabase::prepare_for_lookup() before calling get().");
406 return static_cast<const TObject*
>(
get_object(
id));
Definition: item_stash.hpp:71
Definition: item_stash.hpp:57
T & get(handle_type handle) const
Definition: item_stash.hpp:294
void remove_item(handle_type handle)
Definition: item_stash.hpp:338
handle_type add_item(const osmium::memory::Item &item)
Definition: item_stash.hpp:251
Definition: object.hpp:64
Definition: members_database.hpp:63
void prepare_for_lookup()
Definition: members_database.hpp:260
std::vector< element > m_elements
Definition: members_database.hpp:139
std::size_t size() const noexcept
Definition: members_database.hpp:200
void track(RelationHandle &rel_handle, osmium::object_id_type member_id, std::size_t member_num)
Definition: members_database.hpp:247
std::vector< element >::const_iterator const_iterator
Definition: members_database.hpp:153
bool m_init_phase
Definition: members_database.hpp:149
static std::iterator_traits< iterator >::difference_type count_not_removed(const iterator_range< iterator > &range) noexcept
Definition: members_database.hpp:163
const osmium::OSMObject * get_object(osmium::object_id_type id) const
Definition: members_database.hpp:306
osmium::relations::RelationsDatabase & m_relations_db
Definition: members_database.hpp:144
void remove(osmium::object_id_type member_id, osmium::object_id_type relation_id)
Definition: members_database.hpp:274
osmium::ItemStash & m_stash
Definition: members_database.hpp:143
std::vector< element >::iterator iterator
Definition: members_database.hpp:152
MembersDatabaseCommon(osmium::ItemStash &stash, osmium::relations::RelationsDatabase &relations_db)
Definition: members_database.hpp:176
counts count() const noexcept
Definition: members_database.hpp:222
std::size_t used_memory() const noexcept
Definition: members_database.hpp:188
void add_object(const osmium::OSMObject &object, iterator_range< iterator > &range)
Definition: members_database.hpp:169
iterator_range< const_iterator > find(osmium::object_id_type id) const
Definition: members_database.hpp:159
iterator_range< iterator > find(osmium::object_id_type id)
Definition: members_database.hpp:155
Definition: members_database.hpp:334
MembersDatabase(osmium::ItemStash &stash, osmium::relations::RelationsDatabase &relation_db)
Definition: members_database.hpp:349
const TObject * get(osmium::object_id_type id) const
Definition: members_database.hpp:404
bool add(const TObject &object, TFunc &&func)
Definition: members_database.hpp:365
Definition: relations_database.hpp:208
std::size_t pos() const noexcept
Definition: relations_database.hpp:238
RelationsDatabase * relation_database() const noexcept
Definition: relations_database.hpp:225
void increment_members() noexcept
Definition: relations_database.hpp:288
Definition: relations_database.hpp:82
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
iterator_range< It > make_range(P &&p) noexcept
Definition: iterator.hpp:68
Definition: iterator.hpp:42
Definition: members_database.hpp:133
bool operator()(const element &a, const element &b) const noexcept
Definition: members_database.hpp:134
Definition: members_database.hpp:207
std::size_t available
The number of members tracked and found already.
Definition: members_database.hpp:211
std::size_t tracked
The number of members tracked and not found yet.
Definition: members_database.hpp:209
std::size_t removed
The number of members that were tracked, found and then removed because of a completed relation.
Definition: members_database.hpp:213
Definition: members_database.hpp:65
bool is_removed() const noexcept
Definition: members_database.hpp:117
void remove() noexcept
Definition: members_database.hpp:121
element(std::size_t rel_pos, osmium::object_id_type memb_id, std::size_t memb_num) noexcept
Definition: members_database.hpp:100
@ removed_value
Definition: members_database.hpp:72
element(osmium::object_id_type m_id) noexcept
Definition: members_database.hpp:111
std::size_t relation_pos
Definition: members_database.hpp:90
osmium::object_id_type member_id
Definition: members_database.hpp:80
bool operator<(const element &other) const noexcept
Definition: members_database.hpp:125
std::size_t member_num
Definition: members_database.hpp:85
osmium::ItemStash::handle_type object_handle
Definition: members_database.hpp:98