1 #ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
2 #define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
38 #include <initializer_list>
95 void add_tag(
const char* key,
const char* value) {
97 throw std::length_error(
"OSM tag key is too long");
100 throw std::length_error(
"OSM tag value is too long");
113 void add_tag(
const char* key,
const size_t key_length,
const char* value,
const size_t value_length) {
115 throw std::length_error(
"OSM tag key is too long");
118 throw std::length_error(
"OSM tag value is too long");
130 void add_tag(
const std::string& key,
const std::string& value) {
132 throw std::length_error(
"OSM tag key is too long");
135 throw std::length_error(
"OSM tag value is too long");
155 void add_tag(
const std::pair<const char* const, const char* const>& tag) {
156 add_tag(tag.first, tag.second);
158 void add_tag(
const std::pair<const char* const, const char*>& tag) {
159 add_tag(tag.first, tag.second);
161 void add_tag(
const std::pair<const char*, const char* const>& tag) {
162 add_tag(tag.first, tag.second);
164 void add_tag(
const std::pair<const char*, const char*>& tag) {
165 add_tag(tag.first, tag.second);
173 void add_tag(
const std::pair<const std::string&, const std::string&>& tag) {
174 add_tag(tag.first, tag.second);
179 template <
typename T>
185 Builder(buffer, parent, sizeof(T)) {
226 throw std::length_error(
"OSM relation member role is too long");
266 add_role(*member, role, role_length);
284 add_member(type, ref, role, std::strlen(role), full_member);
299 add_member(type, ref, role.data(), role.size(), full_member);
310 throw std::length_error(
"OSM user name is too long");
321 if (length > std::numeric_limits<osmium::string_size_type>::max() - 1) {
322 throw std::length_error(
"OSM changeset comment is too long");
342 assert(!m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
347 assert(!m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
348 m_comment = reserve_space_for<osmium::ChangesetComment>();
351 add_user(*m_comment, user, std::strlen(user));
355 assert(m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
356 add_text(*m_comment, text, std::strlen(text));
361 assert(m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
362 add_text(*m_comment, text.c_str(), text.size());
368 #define OSMIUM_FORWARD(setter) \
369 template <typename... TArgs> \
370 type& setter(TArgs&&... args) { \
371 object().setter(std::forward<TArgs>(args)...); \
372 return static_cast<type&>(*this); \
375 template <
typename TDerived,
typename T>
385 Builder(buffer, parent, sizeof(T) + min_size_for_user) {
388 std::fill_n(
object().data() +
sizeof(T), min_size_for_user, 0);
389 object().set_user_size(1);
400 return static_cast<T&
>(
item());
412 &&
"set_user() must be called at most once and before any sub-builders");
413 const auto available_space = min_size_for_user -
sizeof(
string_size_type) - 1;
414 if (length > available_space) {
417 add_size(static_cast<uint32_t>(space_needed));
419 std::copy_n(user, length,
object().data() + size_of_object);
420 object().set_user_size(length + 1);
422 return static_cast<TDerived&
>(*this);
431 return set_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
440 return set_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
444 template <
typename... TArgs>
446 set_user(std::forward<TArgs>(args)...);
460 void add_tags(const
std::initializer_list<
std::pair<const
char*, const
char*>>& tags) {
462 for (
const auto& p : tags) {
463 tl_builder.add_tag(p.first, p.second);
503 for (
const auto& node_ref : nodes) {
504 builder.add_node_ref(node_ref);
549 set_uid(source.
uid());
567 std::fill_n(
object().data() +
sizeof(
Changeset), min_size_for_user, 0);
610 &&
"set_user() must be called at most once and before any sub-builders");
611 const auto available_space = min_size_for_user - 1;
612 if (length > available_space) {
615 add_size(static_cast<uint32_t>(space_needed));
617 std::copy_n(user, length,
object().data() +
sizeof(
Changeset));
629 return set_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
638 return set_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
642 template <
typename... TArgs>
644 set_user(std::forward<TArgs>(args)...);
649 #undef OSMIUM_FORWARD
655 #endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:608
osmium::memory::Item & item() const
Definition: builder.hpp:100
void add_tag(const std::pair< const char *const, const char *const > &tag)
Definition: osm_object_builder.hpp:155
uint32_t user_id_type
Type for OSM user IDs.
Definition: types.hpp:49
Definition: osm_object_builder.hpp:376
~TagListBuilder()
Definition: osm_object_builder.hpp:85
Definition: changeset.hpp:130
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition: osm_object_builder.hpp:597
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
osmium::memory::Buffer & buffer() noexcept
Return the buffer this builder is using.
Definition: builder.hpp:193
TDerived & set_user(const char *user)
Definition: osm_object_builder.hpp:430
void add_item(const osmium::memory::Item &item)
Definition: builder.hpp:201
type
Definition: entity_bits.hpp:63
osmium::memory::item_size_type append_zero()
Definition: builder.hpp:185
uint32_t item_size_type
Definition: item.hpp:59
osmium::Box & bounds() noexcept
Definition: changeset.hpp:343
const char * value() const
Definition: tag.hpp:83
RelationBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:516
TagListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:80
NodeBuilder(Builder &parent)
Definition: osm_object_builder.hpp:479
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:493
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:532
void add_user(osmium::ChangesetComment &comment, const char *user, const size_t length)
Definition: osm_object_builder.hpp:308
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:283
void initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:543
static constexpr const size_t min_size_for_user
Definition: osm_object_builder.hpp:380
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:563
RelationBuilder(Builder &parent)
Definition: osm_object_builder.hpp:520
item_type
Definition: item_type.hpp:43
Definition: relation.hpp:163
void add_tag(const osmium::Tag &tag)
Definition: osm_object_builder.hpp:146
uint16_t string_size_type
Definition: types.hpp:59
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:245
Definition: reader_iterator.hpp:39
Definition: relation.hpp:152
Changeset & object() noexcept
Definition: osm_object_builder.hpp:578
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:235
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
Definition: osm_object_builder.hpp:304
OSMIUM_DEPRECATED void add_user(TArgs &&...args)
Definition: osm_object_builder.hpp:643
osmium::object_id_type object_id_to_area_id(osmium::object_id_type id, osmium::item_type type) noexcept
Definition: area.hpp:96
OSMIUM_DEPRECATED void add_user(TArgs &&...args)
Definition: osm_object_builder.hpp:445
unsigned char * reserve_space(size_t size)
Definition: builder.hpp:104
void add_text(osmium::ChangesetComment &comment, const char *text, const size_t length)
Definition: osm_object_builder.hpp:316
Definition: osm_object_builder.hpp:180
void add_tag(const std::pair< const std::string &, const std::string & > &tag)
Definition: osm_object_builder.hpp:173
void add_tag(const char *key, const size_t key_length, const char *value, const size_t value_length)
Definition: osm_object_builder.hpp:113
AreaBuilder(Builder &parent)
Definition: osm_object_builder.hpp:536
Definition: relation.hpp:57
void add_tag(const std::pair< const char *const, const char * > &tag)
Definition: osm_object_builder.hpp:158
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
#define OSMIUM_FORWARD(setter)
Definition: osm_object_builder.hpp:368
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:501
void set_user_size(string_size_type size) noexcept
Definition: changeset.hpp:167
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition: osm_object_builder.hpp:346
Definition: timestamp.hpp:115
void add_tag(const std::pair< const char *, const char * > &tag)
Definition: osm_object_builder.hpp:164
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
OSMIUM_DEPRECATED osmium::Box & bounds() noexcept
Definition: osm_object_builder.hpp:593
void add_tags(const std::initializer_list< std::pair< const char *, const char * >> &tags)
Definition: osm_object_builder.hpp:460
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
ChangesetBuilder & set_user(const char *user)
Definition: osm_object_builder.hpp:628
T & object() noexcept
Definition: osm_object_builder.hpp:399
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:475
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:262
void add_tag(const std::pair< const char *, const char *const > &tag)
Definition: osm_object_builder.hpp:161
Definition: location.hpp:266
osmium::ChangesetComment * m_comment
Definition: osm_object_builder.hpp:306
Definition: osm_object_builder.hpp:487
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:118
object_version_type version() const noexcept
Get version of this object.
Definition: object.hpp:194
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:97
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:298
NodeRefListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:189
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:184
void add_comment_text(const char *text)
Definition: osm_object_builder.hpp:354
Definition: buffer.hpp:97
const char * key() const noexcept
Definition: tag.hpp:79
WayBuilder(Builder &parent)
Definition: osm_object_builder.hpp:497
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:194
osmium::memory::item_size_type append(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:164
void add_comment_text(const std::string &text)
Definition: osm_object_builder.hpp:360
uint32_t size() const noexcept
Definition: builder.hpp:141
Definition: osm_object_builder.hpp:469
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:152
void add_role(osmium::RelationMember &member, const char *role, const size_t length)
Definition: osm_object_builder.hpp:224
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:409
void add_size(uint32_t size)
Definition: builder.hpp:134
void add_node_ref(const object_id_type ref, const osmium::Location &location=Location{})
Definition: osm_object_builder.hpp:203
~ChangesetDiscussionBuilder()
Definition: osm_object_builder.hpp:341
Definition: osm_object_builder.hpp:555
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:130
Definition: node_ref.hpp:50
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:312
item_type type() const noexcept
Definition: item.hpp:165
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:282
Definition: builder.hpp:61
RelationMemberListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:240
Definition: osm_object_builder.hpp:213
ChangesetBuilder & set_user(const std::string &user)
Definition: osm_object_builder.hpp:637
TDerived & set_user(const std::string &user)
Definition: osm_object_builder.hpp:439
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:331
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:384
Definition: object.hpp:63
Definition: osm_object_builder.hpp:71
Definition: osm_object_builder.hpp:510
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:198
Definition: osm_object_builder.hpp:526
void add_padding(bool self=false)
Definition: builder.hpp:121
ChangesetDiscussionBuilder(Builder &parent)
Definition: osm_object_builder.hpp:336