Merge commit '879f7eb04200d7d2c28af565229bf6e3d54274fd' into retry/libosmium

This commit is contained in:
karenzshea
2016-10-03 13:08:59 -04:00
208 changed files with 11590 additions and 4051 deletions
+28 -25
View File
@@ -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.