Libosmium  2.4.1
Fast and flexible C++ library for working with OpenStreetMap data
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
osm_object_builder.hpp
Go to the documentation of this file.
1 #ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
2 #define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_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 <cstring>
37 #include <initializer_list>
38 #include <new>
39 #include <string>
40 #include <utility>
41 
43 #include <osmium/osm.hpp>
44 #include <osmium/osm/item_type.hpp>
45 #include <osmium/osm/location.hpp>
46 #include <osmium/osm/node_ref.hpp>
47 #include <osmium/osm/object.hpp>
48 #include <osmium/osm/tag.hpp>
49 #include <osmium/osm/types.hpp>
50 #include <osmium/util/cast.hpp>
51 
52 namespace osmium {
53 
54  namespace memory {
55  class Buffer;
56  }
57 
58  namespace builder {
59 
60  class TagListBuilder : public ObjectBuilder<TagList> {
61 
62  public:
63 
64  explicit TagListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
65  ObjectBuilder<TagList>(buffer, parent) {
66  }
67 
69  add_padding();
70  }
71 
78  void add_tag(const char* key, const char* value) {
79  if (std::strlen(key) > osmium::max_osm_string_length) {
80  throw std::length_error("OSM tag key is too long");
81  }
82  if (std::strlen(value) > osmium::max_osm_string_length) {
83  throw std::length_error("OSM tag value is too long");
84  }
85  add_size(append(key) + append(value));
86  }
87 
96  void add_tag(const char* key, const size_t key_length, const char* value, const size_t value_length) {
97  if (key_length > osmium::max_osm_string_length) {
98  throw std::length_error("OSM tag key is too long");
99  }
100  if (value_length > osmium::max_osm_string_length) {
101  throw std::length_error("OSM tag value is too long");
102  }
104  append(value, osmium::memory::item_size_type(value_length)) + append_zero());
105  }
106 
113  void add_tag(const std::string& key, const std::string& value) {
114  if (key.size() > osmium::max_osm_string_length) {
115  throw std::length_error("OSM tag key is too long");
116  }
117  if (value.size() > osmium::max_osm_string_length) {
118  throw std::length_error("OSM tag value is too long");
119  }
120  add_size(append(key.data(), osmium::memory::item_size_type(key.size()) + 1) +
121  append(value.data(), osmium::memory::item_size_type(value.size()) + 1));
122  }
123 
124  }; // class TagListBuilder
125 
126  template <class T>
127  class NodeRefListBuilder : public ObjectBuilder<T> {
128 
129  public:
130 
131  explicit NodeRefListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
132  ObjectBuilder<T>(buffer, parent) {
133  }
134 
136  static_cast<Builder*>(this)->add_padding();
137  }
138 
139  void add_node_ref(const NodeRef& node_ref) {
140  new (static_cast<Builder*>(this)->reserve_space_for<osmium::NodeRef>()) osmium::NodeRef(node_ref);
141  static_cast<Builder*>(this)->add_size(sizeof(osmium::NodeRef));
142  }
143 
144  void add_node_ref(const object_id_type ref, const osmium::Location location = Location()) {
145  add_node_ref(NodeRef(ref, location));
146  }
147 
148  }; // class NodeRefListBuilder
149 
153 
154  class RelationMemberListBuilder : public ObjectBuilder<RelationMemberList> {
155 
165  void add_role(osmium::RelationMember& member, const char* role, const size_t length) {
166  if (length > osmium::max_osm_string_length) {
167  throw std::length_error("OSM relation member role is too long");
168  }
169  member.set_role_size(osmium::string_size_type(length) + 1);
171  add_padding(true);
172  }
173 
174  public:
175 
177  ObjectBuilder<RelationMemberList>(buffer, parent) {
178  }
179 
181  add_padding();
182  }
183 
197  void add_member(osmium::item_type type, object_id_type ref, const char* role, const size_t role_length, const osmium::OSMObject* full_member = nullptr) {
198  osmium::RelationMember* member = reserve_space_for<osmium::RelationMember>();
199  new (member) osmium::RelationMember(ref, type, full_member != nullptr);
200  add_size(sizeof(RelationMember));
201  add_role(*member, role, role_length);
202  if (full_member) {
203  add_item(full_member);
204  }
205  }
206 
218  void add_member(osmium::item_type type, object_id_type ref, const char* role, const osmium::OSMObject* full_member = nullptr) {
219  add_member(type, ref, role, std::strlen(role), full_member);
220  }
221 
233  void add_member(osmium::item_type type, object_id_type ref, const std::string& role, const osmium::OSMObject* full_member = nullptr) {
234  add_member(type, ref, role.data(), role.size(), full_member);
235  }
236 
237  }; // class RelationMemberListBuilder
238 
239  template <class T>
240  class OSMObjectBuilder : public ObjectBuilder<T> {
241 
242  public:
243 
244  explicit OSMObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
245  ObjectBuilder<T>(buffer, parent) {
246  static_cast<Builder*>(this)->reserve_space_for<string_size_type>();
247  static_cast<Builder*>(this)->add_size(sizeof(string_size_type));
248  }
249 
250  void add_tags(const std::initializer_list<std::pair<const char*, const char*>>& tags) {
251  osmium::builder::TagListBuilder tl_builder(static_cast<Builder*>(this)->buffer(), this);
252  for (const auto& p : tags) {
253  tl_builder.add_tag(p.first, p.second);
254  }
255  }
256 
257  }; // class OSMObjectBuilder
258 
261 
262  class WayBuilder : public OSMObjectBuilder<osmium::Way> {
263 
264  public:
265 
266  explicit WayBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
267  OSMObjectBuilder<osmium::Way>(buffer, parent) {
268  }
269 
270  void add_node_refs(const std::initializer_list<osmium::NodeRef>& nodes) {
272  for (const auto& node_ref : nodes) {
273  builder.add_node_ref(node_ref);
274  }
275  }
276 
277  }; // class WayBuilder
278 
279  class AreaBuilder : public OSMObjectBuilder<osmium::Area> {
280 
281  public:
282 
283  explicit AreaBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
284  OSMObjectBuilder<osmium::Area>(buffer, parent) {
285  }
286 
291  osmium::Area& area = object();
292  area.set_id(osmium::object_id_to_area_id(source.id(), source.type()));
293  area.set_version(source.version());
294  area.set_changeset(source.changeset());
295  area.set_timestamp(source.timestamp());
296  area.set_visible(source.visible());
297  area.set_uid(source.uid());
298 
299  add_user(source.user());
300  }
301 
302  }; // class AreaBuilder
303 
305 
306  } // namespace builder
307 
308 } // namespace osmium
309 
310 #endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
Definition: osm_object_builder.hpp:240
NodeRefListBuilder< InnerRing > InnerRingBuilder
Definition: osm_object_builder.hpp:152
~TagListBuilder()
Definition: osm_object_builder.hpp:68
osmium::memory::Buffer & buffer() noexcept
Return the buffer this builder is using.
Definition: builder.hpp:179
Definition: tag.hpp:105
type
Definition: entity_bits.hpp:60
osmium::memory::item_size_type append_zero()
Definition: builder.hpp:173
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:266
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:283
void add_member(osmium::item_type type, object_id_type ref, const char *role, const osmium::OSMObject *full_member=nullptr)
Definition: osm_object_builder.hpp:218
void initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:290
void add_user(const char *user, const string_size_type length)
Definition: builder.hpp:206
OSMObjectBuilder< osmium::Node > NodeBuilder
Definition: osm_object_builder.hpp:259
item_type
Definition: item_type.hpp:43
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:180
Definition: area.hpp:113
Definition: relation.hpp:150
OSMObject & set_id(object_id_type id) noexcept
Definition: object.hpp:124
Definition: way.hpp:65
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:176
osmium::object_id_type object_id_to_area_id(osmium::object_id_type id, osmium::item_type type) noexcept
Definition: area.hpp:92
NodeRefListBuilder< WayNodeList > WayNodeListBuilder
Definition: osm_object_builder.hpp:150
Definition: osm_object_builder.hpp:127
void add_tag(const char *key, const size_t key_length, const char *value, const size_t value_length)
Definition: osm_object_builder.hpp:96
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
void add_tags(const std::initializer_list< std::pair< const char *, const char * >> &tags)
Definition: osm_object_builder.hpp:250
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:270
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:244
uint16_t string_size_type
Definition: types.hpp:58
NodeRefListBuilder< OuterRing > OuterRingBuilder
Definition: osm_object_builder.hpp:151
OSMObject & set_timestamp(const osmium::Timestamp timestamp) noexcept
Definition: object.hpp:284
void add_node_ref(const object_id_type ref, const osmium::Location location=Location())
Definition: osm_object_builder.hpp:144
user_id_type uid() const noexcept
Get user id of this object.
Definition: object.hpp:234
changeset_id_type changeset() const noexcept
Get changeset id of this object.
Definition: object.hpp:210
OSMObject & set_changeset(changeset_id_type changeset) noexcept
Definition: object.hpp:219
void add_member(osmium::item_type type, object_id_type ref, const char *role, const size_t role_length, const osmium::OSMObject *full_member=nullptr)
Definition: osm_object_builder.hpp:197
Definition: location.hpp:79
Definition: osm_object_builder.hpp:262
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:110
OSMObject & set_version(object_version_type version) noexcept
Definition: object.hpp:195
object_version_type version() const noexcept
Get version of this object.
Definition: object.hpp:186
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:96
void add_member(osmium::item_type type, object_id_type ref, const std::string &role, const osmium::OSMObject *full_member=nullptr)
Definition: osm_object_builder.hpp:233
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:131
Definition: buffer.hpp:94
Definition: builder.hpp:186
OSMObject & set_visible(bool visible) noexcept
Definition: object.hpp:163
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:135
osmium::memory::item_size_type append(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:152
ObjectBuilder< osmium::Changeset > ChangesetBuilder
Definition: osm_object_builder.hpp:304
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:144
void add_role(osmium::RelationMember &member, const char *role, const size_t length)
Definition: osm_object_builder.hpp:165
void add_size(uint32_t size)
Definition: builder.hpp:116
uint32_t item_size_type
Definition: item.hpp:50
void add_item(const osmium::memory::Item *item)
Definition: builder.hpp:127
OSMObjectBuilder< osmium::Relation > RelationBuilder
Definition: osm_object_builder.hpp:260
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:113
Definition: node_ref.hpp:50
osmium::Area & object() noexcept
Definition: builder.hpp:196
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:290
item_type type() const noexcept
Definition: item.hpp:155
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:274
OSMObject & set_uid(user_id_type uid) noexcept
Definition: object.hpp:243
Definition: builder.hpp:57
Definition: osm_object_builder.hpp:154
constexpr const int max_osm_string_length
Definition: types.hpp:61
TagListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:64
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:78
Definition: object.hpp:58
Definition: osm_object_builder.hpp:60
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:139
Definition: osm_object_builder.hpp:279
void add_padding(bool self=false)
Definition: builder.hpp:103