Libosmium  2.20.0
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
6This file is part of Osmium (https://osmcode.org/libosmium).
7
8Copyright 2013-2023 Jochen Topf <jochen@topf.org> and others (see README).
9
10Boost Software License - Version 1.0 - August 17th, 2003
11
12Permission is hereby granted, free of charge, to any person or organization
13obtaining a copy of the software and accompanying documentation covered by
14this license (the "Software") to use, reproduce, display, distribute,
15execute, and transmit the Software, and to prepare derivative works of the
16Software, and to permit third-parties to whom the Software is furnished to
17do so, all subject to the following:
18
19The copyright notices in the Software and this entire statement, including
20the above license grant, this restriction and the following disclaimer,
21must be included in all copies of the Software, in whole or in part, and
22all derivative works of the Software, unless such copies or derivative
23works are solely in the form of machine-executable object code generated by
24a source language processor.
25
26THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
29SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
30FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
31ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
32DEALINGS IN THE SOFTWARE.
33
34*/
35
38#include <osmium/osm/area.hpp>
39#include <osmium/osm/box.hpp>
43#include <osmium/osm/node.hpp>
45#include <osmium/osm/object.hpp>
47#include <osmium/osm/tag.hpp>
49#include <osmium/osm/types.hpp>
50#include <osmium/osm/way.hpp>
51
52#include <algorithm>
53#include <cassert>
54#include <cstddef>
55#include <cstdint>
56#include <cstring>
57#include <initializer_list>
58#include <limits>
59#include <new>
60#include <stdexcept>
61#include <string>
62#include <utility>
63
64namespace osmium {
65
66 namespace memory {
67 class Buffer;
68 } // namespace memory
69
70 namespace builder {
71
72 class TagListBuilder : public Builder {
73
74 public:
75
76 explicit TagListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
77 Builder(buffer, parent, sizeof(TagList)) {
78 new (&item()) TagList{};
79 }
80
81 explicit TagListBuilder(Builder& parent) :
82 Builder(parent.buffer(), &parent, sizeof(TagList)) {
83 new (&item()) TagList{};
84 }
85
88
91
94 }
95
102 void add_tag(const char* key, const char* value) {
103 if (std::strlen(key) > osmium::max_osm_string_length) {
104 throw std::length_error{"OSM tag key is too long"};
105 }
106 if (std::strlen(value) > osmium::max_osm_string_length) {
107 throw std::length_error{"OSM tag value is too long"};
108 }
109 add_size(append(key));
110 add_size(append(value));
111 }
112
121 void add_tag(const char* key, const std::size_t key_length, const char* value, const std::size_t value_length) {
122 if (key_length > osmium::max_osm_string_length) {
123 throw std::length_error{"OSM tag key is too long"};
124 }
125 if (value_length > osmium::max_osm_string_length) {
126 throw std::length_error{"OSM tag value is too long"};
127 }
128 add_size(append_with_zero(key, static_cast<osmium::memory::item_size_type>(key_length)));
129 add_size(append_with_zero(value, static_cast<osmium::memory::item_size_type>(value_length)));
130 }
131
138 void add_tag(const std::string& key, const std::string& value) {
139 if (key.size() > osmium::max_osm_string_length) {
140 throw std::length_error{"OSM tag key is too long"};
141 }
142 if (value.size() > osmium::max_osm_string_length) {
143 throw std::length_error{"OSM tag value is too long"};
144 }
145 add_size(append(key.data(), static_cast<osmium::memory::item_size_type>(key.size()) + 1));
146 add_size(append(value.data(), static_cast<osmium::memory::item_size_type>(value.size()) + 1));
147 }
148
154 void add_tag(const osmium::Tag& tag) {
155 add_size(append(tag.key()));
156 add_size(append(tag.value()));
157 }
158
164 void add_tag(const std::pair<const char* const, const char* const>& tag) {
165 add_tag(tag.first, tag.second);
166 }
167 void add_tag(const std::pair<const char* const, const char*>& tag) {
168 add_tag(tag.first, tag.second);
169 }
170 void add_tag(const std::pair<const char*, const char* const>& tag) {
171 add_tag(tag.first, tag.second);
172 }
173 void add_tag(const std::pair<const char*, const char*>& tag) {
174 add_tag(tag.first, tag.second);
175 }
176
182 void add_tag(const std::pair<const std::string&, const std::string&>& tag) {
183 add_tag(tag.first, tag.second);
184 }
185
186 }; // class TagListBuilder
187
188 template <typename T>
190
191 public:
192
193 explicit NodeRefListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
194 Builder(buffer, parent, sizeof(T)) {
195 new (&item()) T{};
196 }
197
198 explicit NodeRefListBuilder(Builder& parent) :
199 Builder(parent.buffer(), &parent, sizeof(T)) {
200 new (&item()) T{};
201 }
202
205
208
210 add_padding();
211 }
212
213 void add_node_ref(const NodeRef& node_ref) {
214 new (reserve_space_for<osmium::NodeRef>()) osmium::NodeRef{node_ref};
215 add_size(sizeof(osmium::NodeRef));
216 }
217
218 void add_node_ref(const object_id_type ref, const osmium::Location& location = Location{}) {
219 add_node_ref(NodeRef{ref, location});
220 }
221
222 }; // class NodeRefListBuilder
223
227
229
239 void add_role(osmium::RelationMember& member, const char* role, const std::size_t length) {
240 if (length > osmium::max_osm_string_length) {
241 throw std::length_error{"OSM relation member role is too long"};
242 }
243 member.set_role_size(static_cast<osmium::string_size_type>(length) + 1);
244 add_size(append_with_zero(role, static_cast<osmium::memory::item_size_type>(length)));
245 add_padding(true);
246 }
247
248 public:
249
250 explicit RelationMemberListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
251 Builder(buffer, parent, sizeof(RelationMemberList)) {
252 new (&item()) RelationMemberList{};
253 }
254
256 Builder(parent.buffer(), &parent, sizeof(RelationMemberList)) {
257 new (&item()) RelationMemberList{};
258 }
259
262
265
267 add_padding();
268 }
269
283 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) {
284 auto* member = reserve_space_for<osmium::RelationMember>();
285 new (member) osmium::RelationMember{ref, type, full_member != nullptr};
286 add_size(sizeof(RelationMember));
287 add_role(*member, role, role_length);
288 if (full_member) {
289 add_item(*full_member);
290 }
291 }
292
304 void add_member(osmium::item_type type, object_id_type ref, const char* role, const osmium::OSMObject* full_member = nullptr) {
305 add_member(type, ref, role, std::strlen(role), full_member);
306 }
307
319 void add_member(osmium::item_type type, object_id_type ref, const std::string& role, const osmium::OSMObject* full_member = nullptr) {
320 add_member(type, ref, role.data(), role.size(), full_member);
321 }
322
323 }; // class RelationMemberListBuilder
324
326
328
329 void add_user(osmium::ChangesetComment& comment, const char* user, const std::size_t length) {
330 if (length > osmium::max_osm_string_length) {
331 throw std::length_error{"OSM user name is too long"};
332 }
333 comment.set_user_size(static_cast<osmium::string_size_type>(length) + 1);
334 add_size(append_with_zero(user, static_cast<osmium::memory::item_size_type>(length)));
335 }
336
337 void add_text(osmium::ChangesetComment& comment, const char* text, const std::size_t length) {
338 if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
339 throw std::length_error{"OSM changeset comment is too long"};
340 }
341 comment.set_text_size(static_cast<osmium::changeset_comment_size_type>(length) + 1);
342 add_size(append_with_zero(text, static_cast<osmium::memory::item_size_type>(length)));
343 add_padding(true);
344 }
345
346 public:
347
348 explicit ChangesetDiscussionBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
349 Builder(buffer, parent, sizeof(ChangesetDiscussion)) {
350 new (&item()) ChangesetDiscussion{};
351 }
352
354 Builder(parent.buffer(), &parent, sizeof(ChangesetDiscussion)) {
355 new (&item()) ChangesetDiscussion{};
356 }
357
360
363
365 assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
366 add_padding();
367 }
368
369 void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char* user) {
370 assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
371 m_comment = reserve_space_for<osmium::ChangesetComment>();
372 new (m_comment) osmium::ChangesetComment{date, uid};
373 add_size(sizeof(ChangesetComment));
374 add_user(*m_comment, user, std::strlen(user));
375 }
376
377 void add_comment_text(const char* text) {
378 assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
380 m_comment = nullptr;
381 add_text(comment, text, std::strlen(text));
382 }
383
384 void add_comment_text(const std::string& text) {
385 assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
387 m_comment = nullptr;
388 add_text(comment, text.c_str(), text.size());
389 }
390
391 }; // class ChangesetDiscussionBuilder
392
393#define OSMIUM_FORWARD(setter) \
394 template <typename... TArgs> \
395 type& setter(TArgs&&... args) { \
396 object().setter(std::forward<TArgs>(args)...); \
397 return static_cast<type&>(*this); \
398 }
399
400 template <typename TDerived, typename T>
401 class OSMObjectBuilder : public Builder {
402
403 using type = TDerived;
404
405 constexpr static const std::size_t min_size_for_user = osmium::memory::padded_length(sizeof(string_size_type) + 1);
406
408 std::memcpy(item_pos() + sizeof(T), &size, sizeof(string_size_type));
409 }
410
411 public:
412
413 explicit OSMObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
414 Builder(buffer, parent, sizeof(T) + min_size_for_user) {
415 new (&item()) T{};
417 std::memset(object().data() + sizeof(T), 0, min_size_for_user);
418 set_user_size(1);
419 }
420
428 T& object() noexcept {
429 return static_cast<T&>(item());
430 }
431
439 const T& cobject() const noexcept {
440 return static_cast<const T&>(item());
441 }
442
449 TDerived& set_user(const char* user, const string_size_type length) {
450 const auto size_of_object = sizeof(T) + sizeof(string_size_type);
451 assert(cobject().user_size() == 1 && (size() <= size_of_object + osmium::memory::padded_length(1))
452 && "set_user() must be called at most once and before any sub-builders");
453 constexpr const auto available_space = min_size_for_user - sizeof(string_size_type) - 1;
454 if (length > available_space) {
455 const auto space_needed = osmium::memory::padded_length(length - available_space);
456 std::memset(reserve_space(space_needed), 0, space_needed);
457 add_size(static_cast<uint32_t>(space_needed));
458 }
459 std::memcpy(object().data() + size_of_object, user, length);
460 set_user_size(length + 1);
461
462 return static_cast<TDerived&>(*this);
463 }
464
472 TDerived& set_user(const char* user) {
473 const auto len = std::strlen(user);
474 assert(len < std::numeric_limits<string_size_type>::max());
475 return set_user(user, static_cast<string_size_type>(len));
476 }
477
485 TDerived& set_user(const std::string& user) {
486 assert(user.size() < std::numeric_limits<string_size_type>::max());
487 return set_user(user.data(), static_cast<string_size_type>(user.size()));
488 }
489
490 OSMIUM_FORWARD(set_id)
491 OSMIUM_FORWARD(set_visible)
492 OSMIUM_FORWARD(set_deleted)
493 OSMIUM_FORWARD(set_version)
494 OSMIUM_FORWARD(set_changeset)
495 OSMIUM_FORWARD(set_uid)
496 OSMIUM_FORWARD(set_uid_from_signed)
497 OSMIUM_FORWARD(set_timestamp)
498 OSMIUM_FORWARD(set_attribute)
499 OSMIUM_FORWARD(set_removed)
500
501 void add_tags(const std::initializer_list<std::pair<const char*, const char*>>& tags) {
502 osmium::builder::TagListBuilder tl_builder{buffer(), this};
503 for (const auto& p : tags) {
504 tl_builder.add_tag(p.first, p.second);
505 }
506 }
507
508 }; // class OSMObjectBuilder
509
510 class NodeBuilder : public OSMObjectBuilder<NodeBuilder, Node> {
511
513
514 public:
515
516 explicit NodeBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
518 }
519
520 explicit NodeBuilder(Builder& parent) :
521 OSMObjectBuilder<NodeBuilder, Node>(parent.buffer(), &parent) {
522 }
523
524 OSMIUM_FORWARD(set_location)
525
526 }; // class NodeBuilder
527
528 class WayBuilder : public OSMObjectBuilder<WayBuilder, Way> {
529
531
532 public:
533
534 explicit WayBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
536 }
537
538 explicit WayBuilder(Builder& parent) :
539 OSMObjectBuilder<WayBuilder, Way>(parent.buffer(), &parent) {
540 }
541
542 void add_node_refs(const std::initializer_list<osmium::NodeRef>& nodes) {
544 for (const auto& node_ref : nodes) {
545 builder.add_node_ref(node_ref);
546 }
547 }
548
549 }; // class WayBuilder
550
551 class RelationBuilder : public OSMObjectBuilder<RelationBuilder, Relation> {
552
554
555 public:
556
557 explicit RelationBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
559 }
560
561 explicit RelationBuilder(Builder& parent) :
562 OSMObjectBuilder<RelationBuilder, Relation>(parent.buffer(), &parent) {
563 }
564
565 }; // class RelationBuilder
566
567 class AreaBuilder : public OSMObjectBuilder<AreaBuilder, Area> {
568
570
571 public:
572
573 explicit AreaBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
575 }
576
577 explicit AreaBuilder(Builder& parent) :
578 OSMObjectBuilder<AreaBuilder, Area>(parent.buffer(), &parent) {
579 }
580
585 set_id(osmium::object_id_to_area_id(source.id(), source.type()));
586 set_version(source.version());
587 set_changeset(source.changeset());
588 set_timestamp(source.timestamp());
589 set_visible(source.visible());
590 set_uid(source.uid());
591 set_user(source.user());
592 }
593
594 }; // class AreaBuilder
595
596 class ChangesetBuilder : public Builder {
597
599
600 constexpr static const std::size_t min_size_for_user = osmium::memory::padded_length(1);
601
602 public:
603
604 explicit ChangesetBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
605 Builder(buffer, parent, sizeof(Changeset) + min_size_for_user) {
606 new (&item()) Changeset{};
608 std::memset(object().data() + sizeof(Changeset), 0, min_size_for_user);
610 }
611
619 Changeset& object() noexcept {
620 return static_cast<Changeset&>(item());
621 }
622
630 const Changeset& cobject() const noexcept {
631 return static_cast<const Changeset&>(item());
632 }
633
634 OSMIUM_FORWARD(set_id)
635 OSMIUM_FORWARD(set_uid)
636 OSMIUM_FORWARD(set_uid_from_signed)
637 OSMIUM_FORWARD(set_created_at)
638 OSMIUM_FORWARD(set_closed_at)
639 OSMIUM_FORWARD(set_num_changes)
640 OSMIUM_FORWARD(set_num_comments)
641 OSMIUM_FORWARD(set_attribute)
642 OSMIUM_FORWARD(set_removed)
643
644 ChangesetBuilder& set_bounds(const osmium::Box& box) noexcept {
645 object().bounds() = box;
646 return *this;
647 }
648
655 ChangesetBuilder& set_user(const char* user, const string_size_type length) {
656 assert(cobject().user_size() == 1 && (size() <= sizeof(Changeset) + osmium::memory::padded_length(1))
657 && "set_user() must be called at most once and before any sub-builders");
658 constexpr const auto available_space = min_size_for_user - 1;
659 if (length > available_space) {
660 const auto space_needed = osmium::memory::padded_length(length - available_space);
661 std::memset(reserve_space(space_needed), 0, space_needed);
662 add_size(static_cast<uint32_t>(space_needed));
663 }
664 std::memcpy(object().data() + sizeof(Changeset), user, length);
665 object().set_user_size(length + 1);
666
667 return *this;
668 }
669
677 ChangesetBuilder& set_user(const char* user) {
678 const auto len = std::strlen(user);
679 assert(len <= std::numeric_limits<string_size_type>::max());
680 return set_user(user, static_cast<string_size_type>(len));
681 }
682
690 ChangesetBuilder& set_user(const std::string& user) {
691 assert(user.size() < std::numeric_limits<string_size_type>::max());
692 return set_user(user.data(), static_cast<string_size_type>(user.size()));
693 }
694
695 }; // class ChangesetBuilder
696
697#undef OSMIUM_FORWARD
698
699 } // namespace builder
700
701} // namespace osmium
702
703#endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
Definition: area.hpp:125
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:130
An OSM Changeset, a group of changes made by a single user over a short period of time.
Definition: changeset.hpp:146
void set_user_size(string_size_type size) noexcept
Definition: changeset.hpp:165
osmium::Box & bounds() noexcept
Definition: changeset.hpp:348
Definition: location.hpp:271
Definition: node_ref.hpp:50
Definition: node.hpp:48
Definition: object.hpp:64
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:319
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
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:118
Definition: relation.hpp:147
Definition: relation.hpp:56
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:90
Definition: relation.hpp:161
Definition: tag.hpp:119
Definition: tag.hpp:48
const char * key() const noexcept
Definition: tag.hpp:86
const char * value() const noexcept
Definition: tag.hpp:95
Definition: timestamp.hpp:175
Definition: way.hpp:72
Definition: osm_object_builder.hpp:567
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:573
void initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:584
AreaBuilder(Builder &parent)
Definition: osm_object_builder.hpp:577
Definition: builder.hpp:56
unsigned char * reserve_space(std::size_t size)
Definition: builder.hpp:97
osmium::memory::item_size_type append(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:159
uint32_t size() const noexcept
Definition: builder.hpp:136
void add_padding(bool self=false)
Definition: builder.hpp:114
void add_size(osmium::memory::item_size_type size)
Definition: builder.hpp:129
unsigned char * item_pos() const noexcept
Definition: builder.hpp:89
osmium::memory::Buffer & buffer() noexcept
Return the buffer this builder is using.
Definition: builder.hpp:198
osmium::memory::Item & item() const noexcept
Definition: builder.hpp:93
osmium::memory::item_size_type append_with_zero(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:172
void add_item(const osmium::memory::Item &item)
Definition: builder.hpp:206
Definition: osm_object_builder.hpp:596
ChangesetBuilder & set_user(const char *user)
Definition: osm_object_builder.hpp:677
Changeset & object() noexcept
Definition: osm_object_builder.hpp:619
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:604
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition: osm_object_builder.hpp:644
ChangesetBuilder & set_user(const std::string &user)
Definition: osm_object_builder.hpp:690
static constexpr const std::size_t min_size_for_user
Definition: osm_object_builder.hpp:600
const Changeset & cobject() const noexcept
Definition: osm_object_builder.hpp:630
ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:655
Definition: osm_object_builder.hpp:325
void add_user(osmium::ChangesetComment &comment, const char *user, const std::size_t length)
Definition: osm_object_builder.hpp:329
ChangesetDiscussionBuilder(const ChangesetDiscussionBuilder &)=delete
ChangesetDiscussionBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:348
ChangesetDiscussionBuilder & operator=(ChangesetDiscussionBuilder &&)=delete
ChangesetDiscussionBuilder(ChangesetDiscussionBuilder &&)=delete
void add_text(osmium::ChangesetComment &comment, const char *text, const std::size_t length)
Definition: osm_object_builder.hpp:337
ChangesetDiscussionBuilder(Builder &parent)
Definition: osm_object_builder.hpp:353
~ChangesetDiscussionBuilder()
Definition: osm_object_builder.hpp:364
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition: osm_object_builder.hpp:369
void add_comment_text(const char *text)
Definition: osm_object_builder.hpp:377
void add_comment_text(const std::string &text)
Definition: osm_object_builder.hpp:384
ChangesetDiscussionBuilder & operator=(const ChangesetDiscussionBuilder &)=delete
osmium::ChangesetComment * m_comment
Definition: osm_object_builder.hpp:327
Definition: osm_object_builder.hpp:510
NodeBuilder(Builder &parent)
Definition: osm_object_builder.hpp:520
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:516
Definition: osm_object_builder.hpp:189
NodeRefListBuilder(NodeRefListBuilder &&)=delete
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:209
NodeRefListBuilder & operator=(const NodeRefListBuilder &)=delete
NodeRefListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:198
NodeRefListBuilder & operator=(NodeRefListBuilder &&)=delete
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:213
NodeRefListBuilder(const NodeRefListBuilder &)=delete
void add_node_ref(const object_id_type ref, const osmium::Location &location=Location{})
Definition: osm_object_builder.hpp:218
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:193
Definition: osm_object_builder.hpp:401
const T & cobject() const noexcept
Definition: osm_object_builder.hpp:439
T & object() noexcept
Definition: osm_object_builder.hpp:428
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:413
void set_user_size(string_size_type size) noexcept
Definition: osm_object_builder.hpp:407
static constexpr const std::size_t min_size_for_user
Definition: osm_object_builder.hpp:405
TDerived type
Definition: osm_object_builder.hpp:403
TDerived & set_user(const std::string &user)
Definition: osm_object_builder.hpp:485
void add_tags(const std::initializer_list< std::pair< const char *, const char * > > &tags)
Definition: osm_object_builder.hpp:501
TDerived & set_user(const char *user)
Definition: osm_object_builder.hpp:472
TDerived & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:449
Definition: osm_object_builder.hpp:551
RelationBuilder(Builder &parent)
Definition: osm_object_builder.hpp:561
RelationBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:557
Definition: osm_object_builder.hpp:228
RelationMemberListBuilder(RelationMemberListBuilder &&)=delete
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:266
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:283
RelationMemberListBuilder & operator=(RelationMemberListBuilder &&)=delete
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:250
void add_role(osmium::RelationMember &member, const char *role, const std::size_t length)
Definition: osm_object_builder.hpp:239
RelationMemberListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:255
RelationMemberListBuilder(const RelationMemberListBuilder &)=delete
RelationMemberListBuilder & operator=(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:304
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:319
Definition: osm_object_builder.hpp:72
TagListBuilder & operator=(TagListBuilder &&)=delete
void add_tag(const std::pair< const std::string &, const std::string & > &tag)
Definition: osm_object_builder.hpp:182
~TagListBuilder()
Definition: osm_object_builder.hpp:92
void add_tag(const std::pair< const char *, const char *const > &tag)
Definition: osm_object_builder.hpp:170
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:121
TagListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:76
void add_tag(const std::pair< const char *, const char * > &tag)
Definition: osm_object_builder.hpp:173
TagListBuilder(const TagListBuilder &)=delete
TagListBuilder & operator=(const TagListBuilder &)=delete
void add_tag(const std::pair< const char *const, const char * > &tag)
Definition: osm_object_builder.hpp:167
void add_tag(const std::pair< const char *const, const char *const > &tag)
Definition: osm_object_builder.hpp:164
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:138
TagListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:81
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:102
TagListBuilder(TagListBuilder &&)=delete
void add_tag(const osmium::Tag &tag)
Definition: osm_object_builder.hpp:154
Definition: osm_object_builder.hpp:528
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:542
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:534
WayBuilder(Builder &parent)
Definition: osm_object_builder.hpp:538
item_type type() const noexcept
Definition: item.hpp:171
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:104
item_type
Definition: item_type.hpp:45
Definition: location.hpp:555
#define OSMIUM_FORWARD(setter)
Definition: osm_object_builder.hpp:393