Libosmium  2.17.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 (https://osmcode.org/libosmium).
7 
8 Copyright 2013-2022 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 
37 #include <osmium/memory/item.hpp>
38 #include <osmium/osm/area.hpp>
39 #include <osmium/osm/box.hpp>
40 #include <osmium/osm/changeset.hpp>
41 #include <osmium/osm/item_type.hpp>
42 #include <osmium/osm/location.hpp>
43 #include <osmium/osm/node.hpp>
44 #include <osmium/osm/node_ref.hpp>
45 #include <osmium/osm/object.hpp>
46 #include <osmium/osm/relation.hpp>
47 #include <osmium/osm/tag.hpp>
48 #include <osmium/osm/timestamp.hpp>
49 #include <osmium/osm/types.hpp>
50 #include <osmium/osm/way.hpp>
52 
53 #include <algorithm>
54 #include <cassert>
55 #include <cstddef>
56 #include <cstdint>
57 #include <cstring>
58 #include <initializer_list>
59 #include <limits>
60 #include <new>
61 #include <stdexcept>
62 #include <string>
63 #include <utility>
64 
65 namespace osmium {
66 
67  namespace memory {
68  class Buffer;
69  } // namespace memory
70 
71  namespace builder {
72 
73  class TagListBuilder : public Builder {
74 
75  public:
76 
77  explicit TagListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
78  Builder(buffer, parent, sizeof(TagList)) {
79  new (&item()) TagList{};
80  }
81 
82  explicit TagListBuilder(Builder& parent) :
83  Builder(parent.buffer(), &parent, sizeof(TagList)) {
84  new (&item()) TagList{};
85  }
86 
87  TagListBuilder(const TagListBuilder&) = delete;
89 
92 
94  add_padding();
95  }
96 
103  void add_tag(const char* key, const char* value) {
104  if (std::strlen(key) > osmium::max_osm_string_length) {
105  throw std::length_error{"OSM tag key is too long"};
106  }
107  if (std::strlen(value) > osmium::max_osm_string_length) {
108  throw std::length_error{"OSM tag value is too long"};
109  }
110  add_size(append(key));
111  add_size(append(value));
112  }
113 
122  void add_tag(const char* key, const std::size_t key_length, const char* value, const std::size_t value_length) {
123  if (key_length > osmium::max_osm_string_length) {
124  throw std::length_error{"OSM tag key is too long"};
125  }
126  if (value_length > osmium::max_osm_string_length) {
127  throw std::length_error{"OSM tag value is too long"};
128  }
131  }
132 
139  void add_tag(const std::string& key, const std::string& value) {
140  if (key.size() > osmium::max_osm_string_length) {
141  throw std::length_error{"OSM tag key is too long"};
142  }
143  if (value.size() > osmium::max_osm_string_length) {
144  throw std::length_error{"OSM tag value is too long"};
145  }
146  add_size(append(key.data(), osmium::memory::item_size_type(key.size()) + 1));
147  add_size(append(value.data(), osmium::memory::item_size_type(value.size()) + 1));
148  }
149 
155  void add_tag(const osmium::Tag& tag) {
156  add_size(append(tag.key()));
157  add_size(append(tag.value()));
158  }
159 
165  void add_tag(const std::pair<const char* const, const char* const>& tag) {
166  add_tag(tag.first, tag.second);
167  }
168  void add_tag(const std::pair<const char* const, const char*>& tag) {
169  add_tag(tag.first, tag.second);
170  }
171  void add_tag(const std::pair<const char*, const char* const>& tag) {
172  add_tag(tag.first, tag.second);
173  }
174  void add_tag(const std::pair<const char*, const char*>& tag) {
175  add_tag(tag.first, tag.second);
176  }
177 
183  void add_tag(const std::pair<const std::string&, const std::string&>& tag) {
184  add_tag(tag.first, tag.second);
185  }
186 
187  }; // class TagListBuilder
188 
189  template <typename T>
190  class NodeRefListBuilder : public Builder {
191 
192  public:
193 
194  explicit NodeRefListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
195  Builder(buffer, parent, sizeof(T)) {
196  new (&item()) T{};
197  }
198 
199  explicit NodeRefListBuilder(Builder& parent) :
200  Builder(parent.buffer(), &parent, sizeof(T)) {
201  new (&item()) T{};
202  }
203 
206 
209 
211  add_padding();
212  }
213 
214  void add_node_ref(const NodeRef& node_ref) {
215  new (reserve_space_for<osmium::NodeRef>()) osmium::NodeRef{node_ref};
216  add_size(sizeof(osmium::NodeRef));
217  }
218 
219  void add_node_ref(const object_id_type ref, const osmium::Location& location = Location{}) {
220  add_node_ref(NodeRef{ref, location});
221  }
222 
223  }; // class NodeRefListBuilder
224 
228 
230 
240  void add_role(osmium::RelationMember& member, const char* role, const std::size_t length) {
241  if (length > osmium::max_osm_string_length) {
242  throw std::length_error{"OSM relation member role is too long"};
243  }
244  member.set_role_size(osmium::string_size_type(length) + 1);
246  add_padding(true);
247  }
248 
249  public:
250 
251  explicit RelationMemberListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
252  Builder(buffer, parent, sizeof(RelationMemberList)) {
253  new (&item()) RelationMemberList{};
254  }
255 
256  explicit RelationMemberListBuilder(Builder& parent) :
257  Builder(parent.buffer(), &parent, sizeof(RelationMemberList)) {
258  new (&item()) RelationMemberList{};
259  }
260 
263 
266 
268  add_padding();
269  }
270 
284  void add_member(osmium::item_type type, object_id_type ref, const char* role, const std::size_t role_length, const osmium::OSMObject* full_member = nullptr) {
285  auto* member = reserve_space_for<osmium::RelationMember>();
286  new (member) osmium::RelationMember{ref, type, full_member != nullptr};
287  add_size(sizeof(RelationMember));
288  add_role(*member, role, role_length);
289  if (full_member) {
290  add_item(*full_member);
291  }
292  }
293 
305  void add_member(osmium::item_type type, object_id_type ref, const char* role, const osmium::OSMObject* full_member = nullptr) {
306  add_member(type, ref, role, std::strlen(role), full_member);
307  }
308 
320  void add_member(osmium::item_type type, object_id_type ref, const std::string& role, const osmium::OSMObject* full_member = nullptr) {
321  add_member(type, ref, role.data(), role.size(), full_member);
322  }
323 
324  }; // class RelationMemberListBuilder
325 
327 
329 
330  void add_user(osmium::ChangesetComment& comment, const char* user, const std::size_t length) {
331  if (length > osmium::max_osm_string_length) {
332  throw std::length_error{"OSM user name is too long"};
333  }
334  comment.set_user_size(osmium::string_size_type(length) + 1);
336  }
337 
338  void add_text(osmium::ChangesetComment& comment, const char* text, const std::size_t length) {
339  if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
340  throw std::length_error{"OSM changeset comment is too long"};
341  }
344  add_padding(true);
345  }
346 
347  public:
348 
349  explicit ChangesetDiscussionBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
350  Builder(buffer, parent, sizeof(ChangesetDiscussion)) {
351  new (&item()) ChangesetDiscussion{};
352  }
353 
355  Builder(parent.buffer(), &parent, sizeof(ChangesetDiscussion)) {
356  new (&item()) ChangesetDiscussion{};
357  }
358 
361 
364 
366  assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
367  add_padding();
368  }
369 
370  void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char* user) {
371  assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
372  m_comment = reserve_space_for<osmium::ChangesetComment>();
373  new (m_comment) osmium::ChangesetComment{date, uid};
374  add_size(sizeof(ChangesetComment));
375  add_user(*m_comment, user, std::strlen(user));
376  }
377 
378  void add_comment_text(const char* text) {
379  assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
381  m_comment = nullptr;
382  add_text(comment, text, std::strlen(text));
383  }
384 
385  void add_comment_text(const std::string& text) {
386  assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
388  m_comment = nullptr;
389  add_text(comment, text.c_str(), text.size());
390  }
391 
392  }; // class ChangesetDiscussionBuilder
393 
394 #define OSMIUM_FORWARD(setter) \
395  template <typename... TArgs> \
396  type& setter(TArgs&&... args) { \
397  object().setter(std::forward<TArgs>(args)...); \
398  return static_cast<type&>(*this); \
399  }
400 
401  template <typename TDerived, typename T>
402  class OSMObjectBuilder : public Builder {
403 
404  using type = TDerived;
405 
406  constexpr static const std::size_t min_size_for_user = osmium::memory::padded_length(sizeof(string_size_type) + 1);
407 
409  std::memcpy(item_pos() + sizeof(T), &size, sizeof(string_size_type));
410  }
411 
412  public:
413 
414  explicit OSMObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
415  Builder(buffer, parent, sizeof(T) + min_size_for_user) {
416  new (&item()) T{};
418  std::memset(object().data() + sizeof(T), 0, min_size_for_user);
419  set_user_size(1);
420  }
421 
429  T& object() noexcept {
430  return static_cast<T&>(item());
431  }
432 
440  const T& cobject() const noexcept {
441  return static_cast<const T&>(item());
442  }
443 
450  TDerived& set_user(const char* user, const string_size_type length) {
451  const auto size_of_object = sizeof(T) + sizeof(string_size_type);
452  assert(cobject().user_size() == 1 && (size() <= size_of_object + osmium::memory::padded_length(1))
453  && "set_user() must be called at most once and before any sub-builders");
454  constexpr const auto available_space = min_size_for_user - sizeof(string_size_type) - 1;
455  if (length > available_space) {
456  const auto space_needed = osmium::memory::padded_length(length - available_space);
457  std::memset(reserve_space(space_needed), 0, space_needed);
458  add_size(static_cast<uint32_t>(space_needed));
459  }
460  std::memcpy(object().data() + size_of_object, user, length);
461  set_user_size(length + 1);
462 
463  return static_cast<TDerived&>(*this);
464  }
465 
473  TDerived& set_user(const char* user) {
474  const auto len = std::strlen(user);
475  assert(len < std::numeric_limits<string_size_type>::max());
476  return set_user(user, static_cast<string_size_type>(len));
477  }
478 
486  TDerived& set_user(const std::string& user) {
487  assert(user.size() < std::numeric_limits<string_size_type>::max());
488  return set_user(user.data(), static_cast<string_size_type>(user.size()));
489  }
490 
492  template <typename... TArgs>
493  OSMIUM_DEPRECATED void add_user(TArgs&&... args) {
494  set_user(std::forward<TArgs>(args)...);
495  }
496 
497  OSMIUM_FORWARD(set_id)
498  OSMIUM_FORWARD(set_visible)
499  OSMIUM_FORWARD(set_deleted)
500  OSMIUM_FORWARD(set_version)
501  OSMIUM_FORWARD(set_changeset)
502  OSMIUM_FORWARD(set_uid)
503  OSMIUM_FORWARD(set_uid_from_signed)
504  OSMIUM_FORWARD(set_timestamp)
505  OSMIUM_FORWARD(set_attribute)
506  OSMIUM_FORWARD(set_removed)
507 
508  void add_tags(const std::initializer_list<std::pair<const char*, const char*>>& tags) {
509  osmium::builder::TagListBuilder tl_builder{buffer(), this};
510  for (const auto& p : tags) {
511  tl_builder.add_tag(p.first, p.second);
512  }
513  }
514 
515  }; // class OSMObjectBuilder
516 
517  class NodeBuilder : public OSMObjectBuilder<NodeBuilder, Node> {
518 
519  using type = NodeBuilder;
520 
521  public:
522 
523  explicit NodeBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
525  }
526 
527  explicit NodeBuilder(Builder& parent) :
528  OSMObjectBuilder<NodeBuilder, Node>(parent.buffer(), &parent) {
529  }
530 
531  OSMIUM_FORWARD(set_location)
532 
533  }; // class NodeBuilder
534 
535  class WayBuilder : public OSMObjectBuilder<WayBuilder, Way> {
536 
537  using type = WayBuilder;
538 
539  public:
540 
541  explicit WayBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
543  }
544 
545  explicit WayBuilder(Builder& parent) :
546  OSMObjectBuilder<WayBuilder, Way>(parent.buffer(), &parent) {
547  }
548 
549  void add_node_refs(const std::initializer_list<osmium::NodeRef>& nodes) {
551  for (const auto& node_ref : nodes) {
552  builder.add_node_ref(node_ref);
553  }
554  }
555 
556  }; // class WayBuilder
557 
558  class RelationBuilder : public OSMObjectBuilder<RelationBuilder, Relation> {
559 
561 
562  public:
563 
564  explicit RelationBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
566  }
567 
568  explicit RelationBuilder(Builder& parent) :
569  OSMObjectBuilder<RelationBuilder, Relation>(parent.buffer(), &parent) {
570  }
571 
572  }; // class RelationBuilder
573 
574  class AreaBuilder : public OSMObjectBuilder<AreaBuilder, Area> {
575 
576  using type = AreaBuilder;
577 
578  public:
579 
580  explicit AreaBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
582  }
583 
584  explicit AreaBuilder(Builder& parent) :
585  OSMObjectBuilder<AreaBuilder, Area>(parent.buffer(), &parent) {
586  }
587 
592  set_id(osmium::object_id_to_area_id(source.id(), source.type()));
593  set_version(source.version());
594  set_changeset(source.changeset());
595  set_timestamp(source.timestamp());
596  set_visible(source.visible());
597  set_uid(source.uid());
598  set_user(source.user());
599  }
600 
601  }; // class AreaBuilder
602 
603  class ChangesetBuilder : public Builder {
604 
606 
607  constexpr static const std::size_t min_size_for_user = osmium::memory::padded_length(1);
608 
609  public:
610 
611  explicit ChangesetBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
612  Builder(buffer, parent, sizeof(Changeset) + min_size_for_user) {
613  new (&item()) Changeset{};
615  std::memset(object().data() + sizeof(Changeset), 0, min_size_for_user);
616  object().set_user_size(1);
617  }
618 
626  Changeset& object() noexcept {
627  return static_cast<Changeset&>(item());
628  }
629 
637  const Changeset& cobject() const noexcept {
638  return static_cast<const Changeset&>(item());
639  }
640 
641  OSMIUM_FORWARD(set_id)
642  OSMIUM_FORWARD(set_uid)
643  OSMIUM_FORWARD(set_uid_from_signed)
644  OSMIUM_FORWARD(set_created_at)
645  OSMIUM_FORWARD(set_closed_at)
646  OSMIUM_FORWARD(set_num_changes)
647  OSMIUM_FORWARD(set_num_comments)
648  OSMIUM_FORWARD(set_attribute)
649  OSMIUM_FORWARD(set_removed)
650 
651  // @deprecated Use set_bounds() instead.
652  OSMIUM_DEPRECATED osmium::Box& bounds() noexcept {
653  return object().bounds();
654  }
655 
656  ChangesetBuilder& set_bounds(const osmium::Box& box) noexcept {
657  object().bounds() = box;
658  return *this;
659  }
660 
667  ChangesetBuilder& set_user(const char* user, const string_size_type length) {
668  assert(cobject().user_size() == 1 && (size() <= sizeof(Changeset) + osmium::memory::padded_length(1))
669  && "set_user() must be called at most once and before any sub-builders");
670  constexpr const auto available_space = min_size_for_user - 1;
671  if (length > available_space) {
672  const auto space_needed = osmium::memory::padded_length(length - available_space);
673  std::memset(reserve_space(space_needed), 0, space_needed);
674  add_size(static_cast<uint32_t>(space_needed));
675  }
676  std::memcpy(object().data() + sizeof(Changeset), user, length);
677  object().set_user_size(length + 1);
678 
679  return *this;
680  }
681 
689  ChangesetBuilder& set_user(const char* user) {
690  const auto len = std::strlen(user);
691  assert(len <= std::numeric_limits<string_size_type>::max());
692  return set_user(user, static_cast<string_size_type>(len));
693  }
694 
702  ChangesetBuilder& set_user(const std::string& user) {
703  assert(user.size() < std::numeric_limits<string_size_type>::max());
704  return set_user(user.data(), static_cast<string_size_type>(user.size()));
705  }
706 
708  template <typename... TArgs>
709  OSMIUM_DEPRECATED void add_user(TArgs&&... args) {
710  set_user(std::forward<TArgs>(args)...);
711  }
712 
713  }; // class ChangesetBuilder
714 
715 #undef OSMIUM_FORWARD
716 
717  } // namespace builder
718 
719 } // namespace osmium
720 
721 #endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
Definition: area.hpp:126
Definition: changeset.hpp:59
void set_text_size(changeset_comment_size_type size) noexcept
Definition: changeset.hpp:91
void set_user_size(string_size_type size) noexcept
Definition: changeset.hpp:87
Definition: changeset.hpp:132
An OSM Changeset, a group of changes made by a single user over a short period of time.
Definition: changeset.hpp:148
void set_user_size(string_size_type size) noexcept
Definition: changeset.hpp:167
osmium::Box & bounds() noexcept
Definition: changeset.hpp:350
Definition: location.hpp:271
Definition: node_ref.hpp:50
Definition: node.hpp:48
Definition: object.hpp:64
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:152
object_version_type version() const noexcept
Get version of this object.
Definition: object.hpp:194
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:283
user_id_type uid() const noexcept
Get user id of this object.
Definition: object.hpp:242
changeset_id_type changeset() const noexcept
Get changeset id of this object.
Definition: object.hpp:218
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:318
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:118
Definition: relation.hpp:154
Definition: relation.hpp:57
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:91
Definition: relation.hpp:168
Definition: tag.hpp:119
Definition: tag.hpp:48
const char * value() const noexcept
Definition: tag.hpp:95
const char * key() const noexcept
Definition: tag.hpp:86
Definition: timestamp.hpp:147
Definition: way.hpp:72
Definition: osm_object_builder.hpp:574
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:580
void initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:591
AreaBuilder(Builder &parent)
Definition: osm_object_builder.hpp:584
Definition: builder.hpp:57
osmium::memory::item_size_type append(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:160
uint32_t size() const noexcept
Definition: builder.hpp:137
void add_padding(bool self=false)
Definition: builder.hpp:115
void add_size(osmium::memory::item_size_type size)
Definition: builder.hpp:130
unsigned char * reserve_space(std::size_t size)
Definition: builder.hpp:98
osmium::memory::Buffer & buffer() noexcept
Return the buffer this builder is using.
Definition: builder.hpp:211
osmium::memory::Item & item() const noexcept
Definition: builder.hpp:94
osmium::memory::item_size_type append_with_zero(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:173
void add_item(const osmium::memory::Item &item)
Definition: builder.hpp:219
unsigned char * item_pos() const noexcept
Definition: builder.hpp:90
Definition: osm_object_builder.hpp:603
const Changeset & cobject() const noexcept
Definition: osm_object_builder.hpp:637
constexpr static const std::size_t min_size_for_user
Definition: osm_object_builder.hpp:607
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:611
Changeset & object() noexcept
Definition: osm_object_builder.hpp:626
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:709
ChangesetBuilder & set_user(const char *user)
Definition: osm_object_builder.hpp:689
OSMIUM_DEPRECATED osmium::Box & bounds() noexcept
Definition: osm_object_builder.hpp:652
ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:667
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition: osm_object_builder.hpp:656
ChangesetBuilder & set_user(const std::string &user)
Definition: osm_object_builder.hpp:702
Definition: osm_object_builder.hpp:326
void add_user(osmium::ChangesetComment &comment, const char *user, const std::size_t length)
Definition: osm_object_builder.hpp:330
ChangesetDiscussionBuilder(const ChangesetDiscussionBuilder &)=delete
ChangesetDiscussionBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:349
ChangesetDiscussionBuilder & operator=(ChangesetDiscussionBuilder &&)=delete
ChangesetDiscussionBuilder & operator=(const ChangesetDiscussionBuilder &)=delete
ChangesetDiscussionBuilder(ChangesetDiscussionBuilder &&)=delete
void add_text(osmium::ChangesetComment &comment, const char *text, const std::size_t length)
Definition: osm_object_builder.hpp:338
ChangesetDiscussionBuilder(Builder &parent)
Definition: osm_object_builder.hpp:354
~ChangesetDiscussionBuilder()
Definition: osm_object_builder.hpp:365
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition: osm_object_builder.hpp:370
void add_comment_text(const char *text)
Definition: osm_object_builder.hpp:378
void add_comment_text(const std::string &text)
Definition: osm_object_builder.hpp:385
osmium::ChangesetComment * m_comment
Definition: osm_object_builder.hpp:328
Definition: osm_object_builder.hpp:517
NodeBuilder(Builder &parent)
Definition: osm_object_builder.hpp:527
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:523
Definition: osm_object_builder.hpp:190
NodeRefListBuilder(NodeRefListBuilder &&)=delete
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:210
NodeRefListBuilder & operator=(const NodeRefListBuilder &)=delete
NodeRefListBuilder & operator=(NodeRefListBuilder &&)=delete
NodeRefListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:199
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:214
NodeRefListBuilder(const NodeRefListBuilder &)=delete
void add_node_ref(const object_id_type ref, const osmium::Location &location=Location{})
Definition: osm_object_builder.hpp:219
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:194
Definition: osm_object_builder.hpp:402
void add_tags(const std::initializer_list< std::pair< const char *, const char * >> &tags)
Definition: osm_object_builder.hpp:508
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:493
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:414
void set_user_size(string_size_type size) noexcept
Definition: osm_object_builder.hpp:408
TDerived & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:450
constexpr static const std::size_t min_size_for_user
Definition: osm_object_builder.hpp:406
TDerived & set_user(const char *user)
Definition: osm_object_builder.hpp:473
const T & cobject() const noexcept
Definition: osm_object_builder.hpp:440
T & object() noexcept
Definition: osm_object_builder.hpp:429
TDerived type
Definition: osm_object_builder.hpp:404
TDerived & set_user(const std::string &user)
Definition: osm_object_builder.hpp:486
Definition: osm_object_builder.hpp:558
RelationBuilder(Builder &parent)
Definition: osm_object_builder.hpp:568
RelationBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:564
Definition: osm_object_builder.hpp:229
RelationMemberListBuilder & operator=(RelationMemberListBuilder &&)=delete
RelationMemberListBuilder(RelationMemberListBuilder &&)=delete
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:267
void add_member(osmium::item_type type, object_id_type ref, const char *role, const std::size_t role_length, const osmium::OSMObject *full_member=nullptr)
Definition: osm_object_builder.hpp:284
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:251
RelationMemberListBuilder & operator=(const RelationMemberListBuilder &)=delete
void add_role(osmium::RelationMember &member, const char *role, const std::size_t length)
Definition: osm_object_builder.hpp:240
RelationMemberListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:256
RelationMemberListBuilder(const RelationMemberListBuilder &)=delete
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:305
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:320
Definition: osm_object_builder.hpp:73
void add_tag(const std::pair< const std::string &, const std::string & > &tag)
Definition: osm_object_builder.hpp:183
~TagListBuilder()
Definition: osm_object_builder.hpp:93
TagListBuilder & operator=(const TagListBuilder &)=delete
void add_tag(const std::pair< const char *, const char *const > &tag)
Definition: osm_object_builder.hpp:171
void add_tag(const char *key, const std::size_t key_length, const char *value, const std::size_t value_length)
Definition: osm_object_builder.hpp:122
TagListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:77
void add_tag(const std::pair< const char *, const char * > &tag)
Definition: osm_object_builder.hpp:174
TagListBuilder(const TagListBuilder &)=delete
void add_tag(const std::pair< const char *const, const char * > &tag)
Definition: osm_object_builder.hpp:168
TagListBuilder & operator=(TagListBuilder &&)=delete
void add_tag(const std::pair< const char *const, const char *const > &tag)
Definition: osm_object_builder.hpp:165
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:139
TagListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:82
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:103
TagListBuilder(TagListBuilder &&)=delete
void add_tag(const osmium::Tag &tag)
Definition: osm_object_builder.hpp:155
Definition: osm_object_builder.hpp:535
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:549
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:541
WayBuilder(Builder &parent)
Definition: osm_object_builder.hpp:545
item_type type() const noexcept
Definition: item.hpp:171
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:51
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
uint32_t item_size_type
Definition: item.hpp:57
type
Definition: entity_bits.hpp:63
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
@ max_osm_string_length
Definition: types.hpp:70
uint32_t changeset_comment_size_type
Definition: types.hpp:66
uint32_t user_id_type
Type for OSM user IDs.
Definition: types.hpp:49
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
uint16_t string_size_type
Definition: types.hpp:59
osmium::object_id_type object_id_to_area_id(osmium::object_id_type id, osmium::item_type type) noexcept
Definition: area.hpp:105
item_type
Definition: item_type.hpp:45
Definition: location.hpp:555
#define OSMIUM_FORWARD(setter)
Definition: osm_object_builder.hpp:394