1#ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
2#define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
57#include <initializer_list>
102 void add_tag(
const char* key,
const char* value) {
104 throw std::length_error{
"OSM tag key is too long"};
107 throw std::length_error{
"OSM tag value is too long"};
121 void add_tag(
const char* key,
const std::size_t key_length,
const char* value,
const std::size_t value_length) {
123 throw std::length_error{
"OSM tag key is too long"};
126 throw std::length_error{
"OSM tag value is too long"};
138 void add_tag(
const std::string& key,
const std::string& value) {
140 throw std::length_error{
"OSM tag key is too long"};
143 throw std::length_error{
"OSM tag value is too long"};
164 void add_tag(
const std::pair<const char* const, const char* const>& tag) {
165 add_tag(tag.first, tag.second);
167 void add_tag(
const std::pair<const char* const, const char*>& tag) {
168 add_tag(tag.first, tag.second);
170 void add_tag(
const std::pair<const char*, const char* const>& tag) {
171 add_tag(tag.first, tag.second);
173 void add_tag(
const std::pair<const char*, const char*>& tag) {
174 add_tag(tag.first, tag.second);
182 void add_tag(
const std::pair<const std::string&, const std::string&>& tag) {
183 add_tag(tag.first, tag.second);
188 template <
typename T>
241 throw std::length_error{
"OSM relation member role is too long"};
284 auto* member = reserve_space_for<osmium::RelationMember>();
287 add_role(*member, role, role_length);
305 add_member(type, ref, role, std::strlen(role), full_member);
320 add_member(type, ref, role.data(), role.size(), full_member);
331 throw std::length_error{
"OSM user name is too long"};
338 if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
339 throw std::length_error{
"OSM changeset comment is too long"};
378 assert(!
has_open_comment() &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
383 assert(!
has_open_comment() &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
388 auto* comment = reserve_space_for<osmium::ChangesetComment>();
392 add_user(*comment, user, std::strlen(user));
396 assert(
has_open_comment() &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
404 add_text(*comment, text, std::strlen(text));
408 assert(
has_open_comment() &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
416 add_text(*comment, text.c_str(), text.size());
420#define OSMIUM_FORWARD(setter) \
421 template <typename... TArgs> \
422 type& setter(TArgs&&... args) { \
423 object().setter(std::forward<TArgs>(args)...); \
424 return static_cast<type&>(*this); \
427 template <
typename TDerived,
typename T>
456 return static_cast<T&
>(
item());
467 return static_cast<const T&
>(
item());
479 &&
"set_user() must be called at most once and before any sub-builders");
481 if (length > available_space) {
484 add_size(
static_cast<uint32_t
>(space_needed));
486 std::memcpy(
object().data() + size_of_object, user, length);
489 return static_cast<TDerived&
>(*this);
500 const auto len = std::strlen(user);
501 assert(len < std::numeric_limits<string_size_type>::max());
513 assert(user.size() < std::numeric_limits<string_size_type>::max());
528 void
add_tags(const
std::initializer_list<
std::pair<const
char*, const
char*>>& tags) {
530 for (
const auto& p : tags) {
531 tl_builder.
add_tag(p.first, p.second);
571 for (
const auto& node_ref : nodes) {
617 set_uid(source.
uid());
684 &&
"set_user() must be called at most once and before any sub-builders");
686 if (length > available_space) {
689 add_size(
static_cast<uint32_t
>(space_needed));
691 std::memcpy(
object().data() +
sizeof(
Changeset), user, length);
705 const auto len = std::strlen(user);
706 assert(len <= std::numeric_limits<string_size_type>::max());
718 assert(user.size() < std::numeric_limits<string_size_type>::max());
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:279
Definition node_ref.hpp:50
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
const char * key() const noexcept
Definition tag.hpp:86
const char * value() const noexcept
Definition tag.hpp:95
Definition timestamp.hpp:175
Definition osm_object_builder.hpp:594
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition osm_object_builder.hpp:600
void initialize_from_object(const osmium::OSMObject &source)
Definition osm_object_builder.hpp:611
AreaBuilder(Builder &parent)
Definition osm_object_builder.hpp:604
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:623
ChangesetBuilder & set_user(const char *user)
Definition osm_object_builder.hpp:704
Changeset & object() noexcept
Definition osm_object_builder.hpp:646
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition osm_object_builder.hpp:631
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition osm_object_builder.hpp:671
ChangesetBuilder & set_user(const std::string &user)
Definition osm_object_builder.hpp:717
static constexpr const std::size_t min_size_for_user
Definition osm_object_builder.hpp:627
const Changeset & cobject() const noexcept
Definition osm_object_builder.hpp:657
ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition osm_object_builder.hpp:682
Definition osm_object_builder.hpp:325
osmium::ChangesetComment * get_comment_ptr()
Definition osm_object_builder.hpp:351
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:361
ChangesetDiscussionBuilder & operator=(ChangesetDiscussionBuilder &&)=delete
ChangesetDiscussionBuilder(ChangesetDiscussionBuilder &&)=delete
std::size_t m_comment_offset
Definition osm_object_builder.hpp:327
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:366
bool has_open_comment() const noexcept
Definition osm_object_builder.hpp:346
~ChangesetDiscussionBuilder()
Definition osm_object_builder.hpp:377
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition osm_object_builder.hpp:382
void add_comment_text(const char *text)
Definition osm_object_builder.hpp:395
void add_comment_text(const std::string &text)
Definition osm_object_builder.hpp:407
ChangesetDiscussionBuilder & operator=(const ChangesetDiscussionBuilder &)=delete
Definition osm_object_builder.hpp:537
NodeBuilder(Builder &parent)
Definition osm_object_builder.hpp:547
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition osm_object_builder.hpp:543
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:428
const T & cobject() const noexcept
Definition osm_object_builder.hpp:466
T & object() noexcept
Definition osm_object_builder.hpp:455
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition osm_object_builder.hpp:440
void set_user_size(string_size_type size) noexcept
Definition osm_object_builder.hpp:434
static constexpr const std::size_t min_size_for_user
Definition osm_object_builder.hpp:432
TDerived type
Definition osm_object_builder.hpp:430
TDerived & set_user(const std::string &user)
Definition osm_object_builder.hpp:512
void add_tags(const std::initializer_list< std::pair< const char *, const char * > > &tags)
Definition osm_object_builder.hpp:528
TDerived & set_user(const char *user)
Definition osm_object_builder.hpp:499
TDerived & set_user(const char *user, const string_size_type length)
Definition osm_object_builder.hpp:476
Definition osm_object_builder.hpp:578
RelationBuilder(Builder &parent)
Definition osm_object_builder.hpp:588
RelationBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition osm_object_builder.hpp:584
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:555
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition osm_object_builder.hpp:569
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition osm_object_builder.hpp:561
WayBuilder(Builder &parent)
Definition osm_object_builder.hpp:565
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
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:654
#define OSMIUM_FORWARD(setter)
Definition osm_object_builder.hpp:420