Merge commit '879f7eb04200d7d2c28af565229bf6e3d54274fd' into retry/libosmium
This commit is contained in:
+28
-25
@@ -39,13 +39,12 @@ DEALINGS IN THE SOFTWARE.
|
||||
#include <cstdint>
|
||||
#include <functional>
|
||||
#include <iomanip>
|
||||
//#include <iostream>
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
|
||||
#include <osmium/fwd.hpp>
|
||||
#include <osmium/osm/item_type.hpp>
|
||||
#include <osmium/osm/object.hpp>
|
||||
#include <osmium/osm/relation.hpp> // IWYU pragma: keep
|
||||
#include <osmium/osm/relation.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
#include <osmium/handler.hpp>
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
@@ -57,6 +56,9 @@ DEALINGS IN THE SOFTWARE.
|
||||
|
||||
namespace osmium {
|
||||
|
||||
class Node;
|
||||
class Way;
|
||||
|
||||
/**
|
||||
* @brief Code related to the assembly of OSM relations
|
||||
*/
|
||||
@@ -64,13 +66,6 @@ namespace osmium {
|
||||
|
||||
namespace detail {
|
||||
|
||||
template <typename R>
|
||||
inline typename std::iterator_traits<typename R::iterator>::difference_type count_not_removed(const R& range) {
|
||||
return std::count_if(range.begin(), range.end(), [](MemberMeta& mm) {
|
||||
return !mm.removed();
|
||||
});
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
/**
|
||||
@@ -113,7 +108,7 @@ namespace osmium {
|
||||
|
||||
public:
|
||||
|
||||
HandlerPass1(TCollector& collector) noexcept :
|
||||
explicit HandlerPass1(TCollector& collector) noexcept :
|
||||
m_collector(collector) {
|
||||
}
|
||||
|
||||
@@ -136,7 +131,7 @@ namespace osmium {
|
||||
|
||||
public:
|
||||
|
||||
HandlerPass2(TCollector& collector) noexcept :
|
||||
explicit HandlerPass2(TCollector& collector) noexcept :
|
||||
m_collector(collector) {
|
||||
}
|
||||
|
||||
@@ -193,14 +188,14 @@ namespace osmium {
|
||||
|
||||
int m_count_complete = 0;
|
||||
|
||||
typedef std::function<void(osmium::memory::Buffer&&)> callback_func_type;
|
||||
using callback_func_type = std::function<void(osmium::memory::Buffer&&)>;
|
||||
callback_func_type m_callback;
|
||||
|
||||
static constexpr size_t initial_buffer_size = 1024 * 1024;
|
||||
|
||||
iterator_range<mm_iterator> find_member_meta(osmium::item_type type, osmium::object_id_type id) {
|
||||
auto& mmv = member_meta(type);
|
||||
return iterator_range<mm_iterator>{std::equal_range(mmv.begin(), mmv.end(), MemberMeta(id))};
|
||||
return make_range(std::equal_range(mmv.begin(), mmv.end(), MemberMeta(id)));
|
||||
}
|
||||
|
||||
public:
|
||||
@@ -313,6 +308,7 @@ namespace osmium {
|
||||
}
|
||||
|
||||
const osmium::Relation& get_relation(size_t offset) const {
|
||||
assert(m_relations_buffer.committed() > offset);
|
||||
return m_relations_buffer.get<osmium::Relation>(offset);
|
||||
}
|
||||
|
||||
@@ -323,7 +319,15 @@ namespace osmium {
|
||||
return get_relation(relation_meta.relation_offset());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the relation from a member_meta.
|
||||
*/
|
||||
const osmium::Relation& get_relation(const MemberMeta& member_meta) const {
|
||||
return get_relation(m_relations[member_meta.relation_pos()]);
|
||||
}
|
||||
|
||||
osmium::OSMObject& get_member(size_t offset) const {
|
||||
assert(m_members_buffer.committed() > offset);
|
||||
return m_members_buffer.get<osmium::OSMObject>(offset);
|
||||
}
|
||||
|
||||
@@ -360,7 +364,6 @@ namespace osmium {
|
||||
} else {
|
||||
m_relations_buffer.commit();
|
||||
m_relations.push_back(std::move(relation_meta));
|
||||
// std::cerr << "added relation id=" << relation.id() << "\n";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -369,15 +372,17 @@ namespace osmium {
|
||||
* search on them.
|
||||
*/
|
||||
void sort_member_meta() {
|
||||
/* std::cerr << "relations: " << m_relations.size() << "\n";
|
||||
std::cerr << "node members: " << m_member_meta[0].size() << "\n";
|
||||
std::cerr << "way members: " << m_member_meta[1].size() << "\n";
|
||||
std::cerr << "relation members: " << m_member_meta[2].size() << "\n";*/
|
||||
std::sort(m_member_meta[0].begin(), m_member_meta[0].end());
|
||||
std::sort(m_member_meta[1].begin(), m_member_meta[1].end());
|
||||
std::sort(m_member_meta[2].begin(), m_member_meta[2].end());
|
||||
}
|
||||
|
||||
static typename iterator_range<mm_iterator>::iterator::difference_type count_not_removed(const iterator_range<mm_iterator>& range) {
|
||||
return std::count_if(range.begin(), range.end(), [](MemberMeta& mm) {
|
||||
return !mm.removed();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Find this object in the member vectors and add it to all
|
||||
* relations that need it.
|
||||
@@ -388,7 +393,7 @@ namespace osmium {
|
||||
bool find_and_add_object(const osmium::OSMObject& object) {
|
||||
auto range = find_member_meta(object.type(), object.id());
|
||||
|
||||
if (detail::count_not_removed(range) == 0) {
|
||||
if (count_not_removed(range) == 0) {
|
||||
// nothing found
|
||||
return false;
|
||||
}
|
||||
@@ -409,9 +414,7 @@ namespace osmium {
|
||||
assert(member_meta.member_id() == object.id());
|
||||
assert(member_meta.relation_pos() < m_relations.size());
|
||||
RelationMeta& relation_meta = m_relations[member_meta.relation_pos()];
|
||||
// std::cerr << " => " << member_meta.member_pos() << " < " << get_relation(relation_meta).members().size() << " (id=" << get_relation(relation_meta).id() << ")\n";
|
||||
assert(member_meta.member_pos() < get_relation(relation_meta).members().size());
|
||||
// std::cerr << " add way " << member_meta.member_id() << " to rel " << get_relation(relation_meta).id() << " at pos " << member_meta.member_pos() << "\n";
|
||||
relation_meta.got_one_member();
|
||||
if (relation_meta.has_all_members()) {
|
||||
const size_t relation_offset = member_meta.relation_pos();
|
||||
@@ -429,17 +432,17 @@ namespace osmium {
|
||||
const osmium::Relation& relation = get_relation(relation_meta);
|
||||
for (const auto& member : relation.members()) {
|
||||
if (member.ref() != 0) {
|
||||
auto range = find_member_meta(member.type(), member.ref());
|
||||
const auto range = find_member_meta(member.type(), member.ref());
|
||||
assert(!range.empty());
|
||||
|
||||
// if this is the last time this object was needed
|
||||
// then mark it as removed
|
||||
if (detail::count_not_removed(range) == 1) {
|
||||
if (count_not_removed(range) == 1) {
|
||||
get_member(range.begin()->buffer_offset()).set_removed(true);
|
||||
}
|
||||
|
||||
for (auto& member_meta : range) {
|
||||
if (!member_meta.removed() && relation.id() == get_relation(member_meta.relation_pos()).id()) {
|
||||
if (!member_meta.removed() && relation.id() == get_relation(member_meta).id()) {
|
||||
member_meta.remove();
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -33,10 +33,8 @@ DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <algorithm>
|
||||
#include <cstddef>
|
||||
#include <iosfwd>
|
||||
#include <iterator>
|
||||
|
||||
#include <osmium/osm/types.hpp>
|
||||
|
||||
@@ -132,7 +130,7 @@ namespace osmium {
|
||||
|
||||
template <typename TChar, typename TTraits>
|
||||
inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const MemberMeta& mm) {
|
||||
out << "MemberMeta(member_id=" << mm.member_id() << " relation_pos=" << mm.relation_pos() << " member_pos=" << mm.member_pos() << " buffer_offset=" << mm.buffer_offset() << ")";
|
||||
out << "MemberMeta(member_id=" << mm.member_id() << " relation_pos=" << mm.relation_pos() << " member_pos=" << mm.member_pos() << " buffer_offset=" << mm.buffer_offset() << " removed=" << (mm.removed() ? "yes" : "no") << ")";
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
@@ -117,8 +117,8 @@ namespace osmium {
|
||||
*/
|
||||
struct has_all_members {
|
||||
|
||||
typedef RelationMeta& argument_type;
|
||||
typedef bool result_type;
|
||||
using argument_type = RelationMeta&;
|
||||
using result_type = bool;
|
||||
|
||||
/**
|
||||
* @returns true if this relation is complete, false otherwise.
|
||||
|
||||
Reference in New Issue
Block a user