Libosmium  2.11.3
Fast and flexible C++ library for working with OpenStreetMap data
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-2017 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 <cassert>
37 #include <cstring>
38 #include <initializer_list>
39 #include <limits>
40 #include <new>
41 #include <stdexcept>
42 #include <string>
43 #include <utility>
44 
46 #include <osmium/osm/item_type.hpp>
47 #include <osmium/osm/location.hpp>
48 #include <osmium/osm/node.hpp>
49 #include <osmium/osm/node_ref.hpp>
50 #include <osmium/osm/object.hpp>
51 #include <osmium/osm/tag.hpp>
52 #include <osmium/osm/types.hpp>
53 #include <osmium/memory/item.hpp>
54 #include <osmium/osm/area.hpp>
55 #include <osmium/osm/changeset.hpp>
56 #include <osmium/osm/relation.hpp>
57 #include <osmium/osm/timestamp.hpp>
58 #include <osmium/osm/way.hpp>
60 
61 namespace osmium {
62 
63  class Node;
64 
65  namespace memory {
66  class Buffer;
67  } // namespace memory
68 
69  namespace builder {
70 
71  class TagListBuilder : public Builder {
72 
73  public:
74 
75  explicit TagListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
76  Builder(buffer, parent, sizeof(TagList)) {
77  new (&item()) TagList();
78  }
79 
80  explicit TagListBuilder(Builder& parent) :
81  Builder(parent.buffer(), &parent, sizeof(TagList)) {
82  new (&item()) TagList();
83  }
84 
86  add_padding();
87  }
88 
95  void add_tag(const char* key, const char* value) {
96  if (std::strlen(key) > osmium::max_osm_string_length) {
97  throw std::length_error("OSM tag key is too long");
98  }
99  if (std::strlen(value) > osmium::max_osm_string_length) {
100  throw std::length_error("OSM tag value is too long");
101  }
102  add_size(append(key));
103  add_size(append(value));
104  }
105 
114  void add_tag(const char* key, const size_t key_length, const char* value, const size_t value_length) {
115  if (key_length > osmium::max_osm_string_length) {
116  throw std::length_error("OSM tag key is too long");
117  }
118  if (value_length > osmium::max_osm_string_length) {
119  throw std::length_error("OSM tag value is too long");
120  }
121  add_size(append_with_zero(key, osmium::memory::item_size_type(key_length)));
122  add_size(append_with_zero(value, osmium::memory::item_size_type(value_length)));
123  }
124 
131  void add_tag(const std::string& key, const std::string& value) {
132  if (key.size() > osmium::max_osm_string_length) {
133  throw std::length_error("OSM tag key is too long");
134  }
135  if (value.size() > osmium::max_osm_string_length) {
136  throw std::length_error("OSM tag value is too long");
137  }
138  add_size(append(key.data(), osmium::memory::item_size_type(key.size()) + 1));
139  add_size(append(value.data(), osmium::memory::item_size_type(value.size()) + 1));
140  }
141 
147  void add_tag(const osmium::Tag& tag) {
148  add_size(append(tag.key()));
149  add_size(append(tag.value()));
150  }
151 
157  void add_tag(const std::pair<const char* const, const char* const>& tag) {
158  add_tag(tag.first, tag.second);
159  }
160  void add_tag(const std::pair<const char* const, const char*>& tag) {
161  add_tag(tag.first, tag.second);
162  }
163  void add_tag(const std::pair<const char*, const char* const>& tag) {
164  add_tag(tag.first, tag.second);
165  }
166  void add_tag(const std::pair<const char*, const char*>& tag) {
167  add_tag(tag.first, tag.second);
168  }
169 
175  void add_tag(const std::pair<const std::string&, const std::string&>& tag) {
176  add_tag(tag.first, tag.second);
177  }
178 
179  }; // class TagListBuilder
180 
181  template <typename T>
182  class NodeRefListBuilder : public Builder {
183 
184  public:
185 
186  explicit NodeRefListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
187  Builder(buffer, parent, sizeof(T)) {
188  new (&item()) T();
189  }
190 
191  explicit NodeRefListBuilder(Builder& parent) :
192  Builder(parent.buffer(), &parent, sizeof(T)) {
193  new (&item()) T();
194  }
195 
197  add_padding();
198  }
199 
200  void add_node_ref(const NodeRef& node_ref) {
201  new (reserve_space_for<osmium::NodeRef>()) osmium::NodeRef(node_ref);
202  add_size(sizeof(osmium::NodeRef));
203  }
204 
205  void add_node_ref(const object_id_type ref, const osmium::Location& location = Location{}) {
206  add_node_ref(NodeRef(ref, location));
207  }
208 
209  }; // class NodeRefListBuilder
210 
214 
216 
226  void add_role(osmium::RelationMember& member, const char* role, const size_t length) {
227  if (length > osmium::max_osm_string_length) {
228  throw std::length_error("OSM relation member role is too long");
229  }
230  member.set_role_size(osmium::string_size_type(length) + 1);
231  add_size(append_with_zero(role, osmium::memory::item_size_type(length)));
232  add_padding(true);
233  }
234 
235  public:
236 
237  explicit RelationMemberListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
238  Builder(buffer, parent, sizeof(RelationMemberList)) {
239  new (&item()) RelationMemberList();
240  }
241 
242  explicit RelationMemberListBuilder(Builder& parent) :
243  Builder(parent.buffer(), &parent, sizeof(RelationMemberList)) {
244  new (&item()) RelationMemberList();
245  }
246 
248  add_padding();
249  }
250 
264  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) {
265  osmium::RelationMember* member = reserve_space_for<osmium::RelationMember>();
266  new (member) osmium::RelationMember(ref, type, full_member != nullptr);
267  add_size(sizeof(RelationMember));
268  add_role(*member, role, role_length);
269  if (full_member) {
270  add_item(*full_member);
271  }
272  }
273 
285  void add_member(osmium::item_type type, object_id_type ref, const char* role, const osmium::OSMObject* full_member = nullptr) {
286  add_member(type, ref, role, std::strlen(role), full_member);
287  }
288 
300  void add_member(osmium::item_type type, object_id_type ref, const std::string& role, const osmium::OSMObject* full_member = nullptr) {
301  add_member(type, ref, role.data(), role.size(), full_member);
302  }
303 
304  }; // class RelationMemberListBuilder
305 
307 
308  osmium::ChangesetComment* m_comment = nullptr;
309 
310  void add_user(osmium::ChangesetComment& comment, const char* user, const size_t length) {
311  if (length > osmium::max_osm_string_length) {
312  throw std::length_error("OSM user name is too long");
313  }
314  comment.set_user_size(osmium::string_size_type(length) + 1);
315  add_size(append_with_zero(user, osmium::memory::item_size_type(length)));
316  }
317 
318  void add_text(osmium::ChangesetComment& comment, const char* text, const size_t length) {
319  // XXX There is no limit on the length of a comment text. We
320  // limit it here to 2^16-2 characters, because that's all that
321  // will fit into our internal data structure. This is not ideal,
322  // and will have to be discussed and cleared up.
323  if (length > std::numeric_limits<osmium::string_size_type>::max() - 1) {
324  throw std::length_error("OSM changeset comment is too long");
325  }
326  comment.set_text_size(osmium::string_size_type(length) + 1);
327  add_size(append_with_zero(text, osmium::memory::item_size_type(length)));
328  add_padding(true);
329  }
330 
331  public:
332 
333  explicit ChangesetDiscussionBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
334  Builder(buffer, parent, sizeof(ChangesetDiscussion)) {
335  new (&item()) ChangesetDiscussion();
336  }
337 
339  Builder(parent.buffer(), &parent, sizeof(ChangesetDiscussion)) {
340  new (&item()) ChangesetDiscussion();
341  }
342 
344  assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
345  add_padding();
346  }
347 
348  void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char* user) {
349  assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
350  m_comment = reserve_space_for<osmium::ChangesetComment>();
351  new (m_comment) osmium::ChangesetComment(date, uid);
352  add_size(sizeof(ChangesetComment));
353  add_user(*m_comment, user, std::strlen(user));
354  }
355 
356  void add_comment_text(const char* text) {
357  assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
358  add_text(*m_comment, text, std::strlen(text));
359  m_comment = nullptr;
360  }
361 
362  void add_comment_text(const std::string& text) {
363  assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
364  add_text(*m_comment, text.c_str(), text.size());
365  m_comment = nullptr;
366  }
367 
368  }; // class ChangesetDiscussionBuilder
369 
370 #define OSMIUM_FORWARD(setter) \
371  template <typename... TArgs> \
372  type& setter(TArgs&&... args) { \
373  object().setter(std::forward<TArgs>(args)...); \
374  return static_cast<type&>(*this); \
375  }
376 
377  template <typename TDerived, typename T>
378  class OSMObjectBuilder : public Builder {
379 
380  using type = TDerived;
381 
382  constexpr static const size_t min_size_for_user = osmium::memory::padded_length(sizeof(string_size_type) + 1);
383 
384  public:
385 
386  explicit OSMObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
387  Builder(buffer, parent, sizeof(T) + min_size_for_user) {
388  new (&item()) T();
389  add_size(min_size_for_user);
390  std::fill_n(object().data() + sizeof(T), min_size_for_user, 0);
391  object().set_user_size(1);
392  }
393 
401  T& object() noexcept {
402  return static_cast<T&>(item());
403  }
404 
411  TDerived& set_user(const char* user, const string_size_type length) {
412  const auto size_of_object = sizeof(T) + sizeof(string_size_type);
413  assert(object().user_size() == 1 && (size() <= size_of_object + osmium::memory::padded_length(1))
414  && "set_user() must be called at most once and before any sub-builders");
415  const auto available_space = min_size_for_user - sizeof(string_size_type) - 1;
416  if (length > available_space) {
417  const auto space_needed = osmium::memory::padded_length(length - available_space);
418  std::fill_n(reserve_space(space_needed), space_needed, 0);
419  add_size(static_cast<uint32_t>(space_needed));
420  }
421  std::copy_n(user, length, object().data() + size_of_object);
422  object().set_user_size(length + 1);
423 
424  return static_cast<TDerived&>(*this);
425  }
426 
432  TDerived& set_user(const char* user) {
433  return set_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
434  }
435 
441  TDerived& set_user(const std::string& user) {
442  return set_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
443  }
444 
446  template <typename... TArgs>
447  OSMIUM_DEPRECATED void add_user(TArgs&&... args) {
448  set_user(std::forward<TArgs>(args)...);
449  }
450 
451  OSMIUM_FORWARD(set_id)
452  OSMIUM_FORWARD(set_visible)
453  OSMIUM_FORWARD(set_deleted)
454  OSMIUM_FORWARD(set_version)
455  OSMIUM_FORWARD(set_changeset)
456  OSMIUM_FORWARD(set_uid)
457  OSMIUM_FORWARD(set_uid_from_signed)
458  OSMIUM_FORWARD(set_timestamp)
459  OSMIUM_FORWARD(set_attribute)
460  OSMIUM_FORWARD(set_removed)
461 
462  void add_tags(const std::initializer_list<std::pair<const char*, const char*>>& tags) {
463  osmium::builder::TagListBuilder tl_builder{buffer(), this};
464  for (const auto& p : tags) {
465  tl_builder.add_tag(p.first, p.second);
466  }
467  }
468 
469  }; // class OSMObjectBuilder
470 
471  class NodeBuilder : public OSMObjectBuilder<NodeBuilder, Node> {
472 
473  using type = NodeBuilder;
474 
475  public:
476 
477  explicit NodeBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
478  OSMObjectBuilder<NodeBuilder, Node>(buffer, parent) {
479  }
480 
481  explicit NodeBuilder(Builder& parent) :
482  OSMObjectBuilder<NodeBuilder, Node>(parent.buffer(), &parent) {
483  }
484 
485  OSMIUM_FORWARD(set_location)
486 
487  }; // class NodeBuilder
488 
489  class WayBuilder : public OSMObjectBuilder<WayBuilder, Way> {
490 
491  using type = WayBuilder;
492 
493  public:
494 
495  explicit WayBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
496  OSMObjectBuilder<WayBuilder, Way>(buffer, parent) {
497  }
498 
499  explicit WayBuilder(Builder& parent) :
500  OSMObjectBuilder<WayBuilder, Way>(parent.buffer(), &parent) {
501  }
502 
503  void add_node_refs(const std::initializer_list<osmium::NodeRef>& nodes) {
504  osmium::builder::WayNodeListBuilder builder{buffer(), this};
505  for (const auto& node_ref : nodes) {
506  builder.add_node_ref(node_ref);
507  }
508  }
509 
510  }; // class WayBuilder
511 
512  class RelationBuilder : public OSMObjectBuilder<RelationBuilder, Relation> {
513 
515 
516  public:
517 
518  explicit RelationBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
519  OSMObjectBuilder<RelationBuilder, Relation>(buffer, parent) {
520  }
521 
522  explicit RelationBuilder(Builder& parent) :
523  OSMObjectBuilder<RelationBuilder, Relation>(parent.buffer(), &parent) {
524  }
525 
526  }; // class RelationBuilder
527 
528  class AreaBuilder : public OSMObjectBuilder<AreaBuilder, Area> {
529 
530  using type = AreaBuilder;
531 
532  public:
533 
534  explicit AreaBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
535  OSMObjectBuilder<AreaBuilder, Area>(buffer, parent) {
536  }
537 
538  explicit AreaBuilder(Builder& parent) :
539  OSMObjectBuilder<AreaBuilder, Area>(parent.buffer(), &parent) {
540  }
541 
546  set_id(osmium::object_id_to_area_id(source.id(), source.type()));
547  set_version(source.version());
548  set_changeset(source.changeset());
549  set_timestamp(source.timestamp());
550  set_visible(source.visible());
551  set_uid(source.uid());
552  set_user(source.user());
553  }
554 
555  }; // class AreaBuilder
556 
557  class ChangesetBuilder : public Builder {
558 
560 
561  constexpr static const size_t min_size_for_user = osmium::memory::padded_length(1);
562 
563  public:
564 
565  explicit ChangesetBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
566  Builder(buffer, parent, sizeof(Changeset) + min_size_for_user) {
567  new (&item()) Changeset();
568  add_size(min_size_for_user);
569  std::fill_n(object().data() + sizeof(Changeset), min_size_for_user, 0);
570  object().set_user_size(1);
571  }
572 
580  Changeset& object() noexcept {
581  return static_cast<Changeset&>(item());
582  }
583 
584  OSMIUM_FORWARD(set_id)
585  OSMIUM_FORWARD(set_uid)
586  OSMIUM_FORWARD(set_uid_from_signed)
587  OSMIUM_FORWARD(set_created_at)
588  OSMIUM_FORWARD(set_closed_at)
589  OSMIUM_FORWARD(set_num_changes)
590  OSMIUM_FORWARD(set_num_comments)
591  OSMIUM_FORWARD(set_attribute)
592  OSMIUM_FORWARD(set_removed)
593 
594  // @deprecated Use set_bounds() instead.
595  OSMIUM_DEPRECATED osmium::Box& bounds() noexcept {
596  return object().bounds();
597  }
598 
599  ChangesetBuilder& set_bounds(const osmium::Box& box) noexcept {
600  object().bounds() = box;
601  return *this;
602  }
603 
610  ChangesetBuilder& set_user(const char* user, const string_size_type length) {
611  assert(object().user_size() == 1 && (size() <= sizeof(Changeset) + osmium::memory::padded_length(1))
612  && "set_user() must be called at most once and before any sub-builders");
613  const auto available_space = min_size_for_user - 1;
614  if (length > available_space) {
615  const auto space_needed = osmium::memory::padded_length(length - available_space);
616  std::fill_n(reserve_space(space_needed), space_needed, 0);
617  add_size(static_cast<uint32_t>(space_needed));
618  }
619  std::copy_n(user, length, object().data() + sizeof(Changeset));
620  object().set_user_size(length + 1);
621 
622  return *this;
623  }
624 
630  ChangesetBuilder& set_user(const char* user) {
631  return set_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
632  }
633 
639  ChangesetBuilder& set_user(const std::string& user) {
640  return set_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
641  }
642 
644  template <typename... TArgs>
645  OSMIUM_DEPRECATED void add_user(TArgs&&... args) {
646  set_user(std::forward<TArgs>(args)...);
647  }
648 
649  }; // class ChangesetBuilder
650 
651 #undef OSMIUM_FORWARD
652 
653  } // namespace builder
654 
655 } // namespace osmium
656 
657 #endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:610
uint32_t user_id_type
Type for OSM user IDs.
Definition: types.hpp:49
Definition: tag.hpp:48
Definition: osm_object_builder.hpp:378
~TagListBuilder()
Definition: osm_object_builder.hpp:85
Definition: changeset.hpp:130
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition: osm_object_builder.hpp:599
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
TDerived & set_user(const char *user)
Definition: osm_object_builder.hpp:432
Definition: tag.hpp:107
type
Definition: entity_bits.hpp:63
uint32_t item_size_type
Definition: item.hpp:59
RelationBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:518
TagListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:80
NodeBuilder(Builder &parent)
Definition: osm_object_builder.hpp:481
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:495
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:534
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:645
void add_user(osmium::ChangesetComment &comment, const char *user, const size_t length)
Definition: osm_object_builder.hpp:310
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:285
void add_tag(const std::pair< const std::string &, const std::string &> &tag)
Definition: osm_object_builder.hpp:175
void initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:545
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:565
RelationBuilder(Builder &parent)
Definition: osm_object_builder.hpp:522
item_type
Definition: item_type.hpp:43
Definition: relation.hpp:168
void add_tag(const osmium::Tag &tag)
Definition: osm_object_builder.hpp:147
uint16_t string_size_type
Definition: types.hpp:59
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:247
Definition: area.hpp:126
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:447
Definition: reader_iterator.hpp:39
Definition: relation.hpp:152
Changeset & object() noexcept
Definition: osm_object_builder.hpp:580
Definition: way.hpp:72
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:237
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
Definition: changeset.hpp:59
Definition: osm_object_builder.hpp:306
osmium::object_id_type object_id_to_area_id(osmium::object_id_type id, osmium::item_type type) noexcept
Definition: area.hpp:105
void add_text(osmium::ChangesetComment &comment, const char *text, const size_t length)
Definition: osm_object_builder.hpp:318
Definition: osm_object_builder.hpp:182
void add_tag(const char *key, const size_t key_length, const char *value, const size_t value_length)
Definition: osm_object_builder.hpp:114
AreaBuilder(Builder &parent)
Definition: osm_object_builder.hpp:538
Definition: relation.hpp:57
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
#define OSMIUM_FORWARD(setter)
Definition: osm_object_builder.hpp:370
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:503
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition: osm_object_builder.hpp:348
Definition: timestamp.hpp:115
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
user_id_type uid() const noexcept
Get user id of this object.
Definition: object.hpp:250
changeset_id_type changeset() const noexcept
Get changeset id of this object.
Definition: object.hpp:226
ChangesetBuilder & set_user(const char *user)
Definition: osm_object_builder.hpp:630
T & object() noexcept
Definition: osm_object_builder.hpp:401
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:477
void add_user(TBuilder &builder, const TArgs &... args)
Definition: attr.hpp:619
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:264
Definition: location.hpp:266
void add_tag(const std::pair< const char *const, const char *> &tag)
Definition: osm_object_builder.hpp:160
Definition: osm_object_builder.hpp:489
Definition: box.hpp:49
void set_text_size(string_size_type size) noexcept
Definition: changeset.hpp:97
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:126
object_version_type version() const noexcept
Get version of this object.
Definition: object.hpp:202
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:97
void add_tag(const std::pair< const char *, const char *const > &tag)
Definition: osm_object_builder.hpp:163
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:300
NodeRefListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:191
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:186
void add_comment_text(const char *text)
Definition: osm_object_builder.hpp:356
Definition: buffer.hpp:97
const char * key() const noexcept
Definition: tag.hpp:79
WayBuilder(Builder &parent)
Definition: osm_object_builder.hpp:499
void set_user_size(string_size_type size) noexcept
Definition: changeset.hpp:93
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:196
Definition: node.hpp:48
void add_comment_text(const std::string &text)
Definition: osm_object_builder.hpp:362
Definition: osm_object_builder.hpp:471
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:160
void add_role(osmium::RelationMember &member, const char *role, const size_t length)
Definition: osm_object_builder.hpp:226
An OSM Changeset, a group of changes made by a single user over a short period of time...
Definition: changeset.hpp:148
TDerived & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:411
void add_node_ref(const object_id_type ref, const osmium::Location &location=Location{})
Definition: osm_object_builder.hpp:205
~ChangesetDiscussionBuilder()
Definition: osm_object_builder.hpp:343
Definition: osm_object_builder.hpp:557
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:131
node, way, relation, or area object
Definition: entity_bits.hpp:74
Definition: node_ref.hpp:50
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:320
void add_tag(const std::pair< const char *const, const char *const > &tag)
Definition: osm_object_builder.hpp:157
item_type type() const noexcept
Definition: item.hpp:169
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:290
Definition: builder.hpp:61
RelationMemberListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:242
Definition: osm_object_builder.hpp:215
ChangesetBuilder & set_user(const std::string &user)
Definition: osm_object_builder.hpp:639
TDerived & set_user(const std::string &user)
Definition: osm_object_builder.hpp:441
constexpr const int max_osm_string_length
Definition: types.hpp:62
TagListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:75
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:95
ChangesetDiscussionBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:333
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:386
Definition: object.hpp:64
Definition: osm_object_builder.hpp:71
Definition: osm_object_builder.hpp:512
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:200
Definition: osm_object_builder.hpp:528
const char * value() const
Definition: tag.hpp:83
void add_tag(const std::pair< const char *, const char *> &tag)
Definition: osm_object_builder.hpp:166
ChangesetDiscussionBuilder(Builder &parent)
Definition: osm_object_builder.hpp:338