Libosmium  2.3.0
Fast and flexible C++ library for working with OpenStreetMap data
relation.hpp
Go to the documentation of this file.
1 #ifndef OSMIUM_OSM_RELATION_HPP
2 #define OSMIUM_OSM_RELATION_HPP
3 
4 /*
5 
6 This file is part of Osmium (http://osmcode.org/libosmium).
7 
8 Copyright 2013-2015 Jochen Topf <jochen@topf.org> and others (see README).
9 
10 Boost Software License - Version 1.0 - August 17th, 2003
11 
12 Permission is hereby granted, free of charge, to any person or organization
13 obtaining a copy of the software and accompanying documentation covered by
14 this license (the "Software") to use, reproduce, display, distribute,
15 execute, and transmit the Software, and to prepare derivative works of the
16 Software, and to permit third-parties to whom the Software is furnished to
17 do so, all subject to the following:
18 
19 The copyright notices in the Software and this entire statement, including
20 the above license grant, this restriction and the following disclaimer,
21 must be included in all copies of the Software, in whole or in part, and
22 all derivative works of the Software, unless such copies or derivative
23 works are solely in the form of machine-executable object code generated by
24 a source language processor.
25 
26 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
29 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
30 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
31 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
32 DEALINGS IN THE SOFTWARE.
33 
34 */
35 
36 #include <cstddef>
37 #include <cstdint>
38 #include <cstdlib>
39 #include <iterator>
40 
41 #include <osmium/memory/collection.hpp> // IWYU pragma: keep
42 #include <osmium/memory/item.hpp>
43 #include <osmium/osm/item_type.hpp>
44 #include <osmium/osm/object.hpp>
45 #include <osmium/osm/types.hpp>
46 
47 namespace osmium {
48 
49  namespace builder {
50  template <class> class ObjectBuilder;
51  class RelationMemberListBuilder;
52  }
53 
54  class RelationMember : public osmium::memory::detail::ItemHelper {
55 
57 
60  uint16_t m_flags;
62 
63  RelationMember(const RelationMember&) = delete;
64  RelationMember(RelationMember&&) = delete;
65 
66  RelationMember& operator=(const RelationMember&) = delete;
68 
69  unsigned char* endpos() {
70  return data() + osmium::memory::padded_length(sizeof(RelationMember) + m_role_size);
71  }
72 
73  const unsigned char* endpos() const {
74  return data() + osmium::memory::padded_length(sizeof(RelationMember) + m_role_size);
75  }
76 
77  template <class TMember>
79 
80  unsigned char* next() {
81  if (full_member()) {
82  return endpos() + reinterpret_cast<osmium::memory::Item*>(endpos())->byte_size();
83  } else {
84  return endpos();
85  }
86  }
87 
88  unsigned const char* next() const {
89  if (full_member()) {
90  return endpos() + reinterpret_cast<const osmium::memory::Item*>(endpos())->byte_size();
91  } else {
92  return endpos();
93  }
94  }
95 
96  void set_role_size(string_size_type size) noexcept {
97  m_role_size = size;
98  }
99 
100  public:
101 
103 
104  RelationMember(const object_id_type ref = 0, const item_type type = item_type(), const bool full = false) noexcept :
105  m_ref(ref),
106  m_type(type),
107  m_flags(full ? 1 : 0) {
108  }
109 
110  object_id_type ref() const noexcept {
111  return m_ref;
112  }
113 
115  m_ref = ref;
116  return *this;
117  }
118 
120  return static_cast<unsigned_object_id_type>(std::abs(m_ref));
121  }
122 
124  m_ref = ref;
125  return *this;
126  }
127 
128  item_type type() const noexcept {
129  return m_type;
130  }
131 
132  bool full_member() const noexcept {
133  return m_flags == 1;
134  }
135 
136  const char* role() const noexcept {
137  return reinterpret_cast<const char*>(data() + sizeof(RelationMember));
138  }
139 
141  return *reinterpret_cast<OSMObject*>(endpos());
142  }
143 
144  const OSMObject& get_object() const {
145  return *reinterpret_cast<const OSMObject*>(endpos());
146  }
147 
148  }; // class RelationMember
149 
150  class RelationMemberList : public osmium::memory::Collection<RelationMember, osmium::item_type::relation_member_list> {
151 
152  public:
153 
154  typedef size_t size_type;
155 
158  }
159 
160  size_type size() const noexcept {
161  return static_cast<size_type>(std::distance(begin(), end()));
162  }
163 
164  }; // class RelationMemberList
165 
166 
167  class Relation : public OSMObject {
168 
170 
171  Relation() noexcept :
172  OSMObject(sizeof(Relation), osmium::item_type::relation) {
173  }
174 
175  public:
176 
178 
180  return osmium::detail::subitem_of_type<RelationMemberList>(begin(), end());
181  }
182 
183  const RelationMemberList& members() const {
184  return osmium::detail::subitem_of_type<const RelationMemberList>(cbegin(), cend());
185  }
186 
187  }; // class Relation
188 
189 
190 } // namespace osmium
191 
192 #endif // OSMIUM_OSM_RELATION_HPP
string_size_type m_role_size
Definition: relation.hpp:61
Definition: collection.hpp:47
RelationMember & ref(object_id_type ref) noexcept
Definition: relation.hpp:114
uint64_t unsigned_object_id_type
Type for OSM object (node, way, or relation) IDs where we only allow positive IDs.
Definition: types.hpp:46
uint16_t m_flags
Definition: relation.hpp:60
RelationMemberList & members()
Definition: relation.hpp:179
const OSMObject & get_object() const
Definition: relation.hpp:144
RelationMemberList()
Definition: relation.hpp:156
item_type
Definition: item_type.hpp:43
Definition: relation.hpp:167
const_iterator cend() const
Definition: object.hpp:346
OSMObject & get_object()
Definition: relation.hpp:140
Definition: relation.hpp:150
double distance(const osmium::geom::Coordinates &c1, const osmium::geom::Coordinates &c2)
Definition: haversine.hpp:64
const_iterator cbegin() const
Definition: object.hpp:342
T padded_length(T length) noexcept
Definition: item.hpp:56
iterator end()
Definition: object.hpp:338
const RelationMemberList & members() const
Definition: relation.hpp:183
static constexpr osmium::item_type itemtype
Definition: relation.hpp:177
Definition: item.hpp:97
Definition: relation.hpp:54
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
Namespace for everything in the Osmium library.
Definition: assembler.hpp:55
unsigned_object_id_type positive_ref() const noexcept
Definition: relation.hpp:119
Definition: collection.hpp:105
unsigned char * endpos()
Definition: relation.hpp:69
uint16_t string_size_type
Definition: types.hpp:58
unsigned const char * next() const
Definition: relation.hpp:88
item_type m_type
Definition: relation.hpp:59
item_type type() const noexcept
Definition: relation.hpp:128
RelationMember & operator=(const RelationMember &)=delete
bool full_member() const noexcept
Definition: relation.hpp:132
unsigned char * data() const noexcept
Definition: collection.hpp:85
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:96
object_id_type ref() const noexcept
Definition: relation.hpp:110
const char * role() const noexcept
Definition: relation.hpp:136
Definition: builder.hpp:186
RelationMember & set_ref(const osmium::object_id_type ref) noexcept
Definition: relation.hpp:123
object_id_type m_ref
Definition: relation.hpp:58
size_t size_type
Definition: relation.hpp:154
RelationMember(const object_id_type ref=0, const item_type type=item_type(), const bool full=false) noexcept
Definition: relation.hpp:104
static constexpr item_type collection_type
Definition: relation.hpp:102
const unsigned char * endpos() const
Definition: relation.hpp:73
unsigned char * next()
Definition: relation.hpp:80
Definition: osm_object_builder.hpp:135
RelationMember(const RelationMember &)=delete
Definition: object.hpp:58
size_type size() const noexcept
Definition: relation.hpp:160
iterator begin()
Definition: object.hpp:334