1 #ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP 2 #define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP 41 #include <initializer_list> 98 void add_tag(
const char* key,
const char* value) {
100 throw std::length_error{
"OSM tag key is too long"};
103 throw std::length_error{
"OSM tag value is too long"};
105 add_size(append(key));
106 add_size(append(value));
117 void add_tag(
const char* key,
const std::size_t key_length,
const char* value,
const std::size_t value_length) {
119 throw std::length_error{
"OSM tag key is too long"};
122 throw std::length_error{
"OSM tag value is too long"};
134 void add_tag(
const std::string& key,
const std::string& value) {
136 throw std::length_error{
"OSM tag key is too long"};
139 throw std::length_error{
"OSM tag value is too long"};
151 add_size(append(tag.
key()));
152 add_size(append(tag.
value()));
160 void add_tag(
const std::pair<const char* const, const char* const>& tag) {
161 add_tag(tag.first, tag.second);
163 void add_tag(
const std::pair<const char* const, const char*>& tag) {
164 add_tag(tag.first, tag.second);
166 void add_tag(
const std::pair<const char*, const char* const>& tag) {
167 add_tag(tag.first, tag.second);
169 void add_tag(
const std::pair<const char*, const char*>& tag) {
170 add_tag(tag.first, tag.second);
178 void add_tag(
const std::pair<const std::string&, const std::string&>& tag) {
179 add_tag(tag.first, tag.second);
184 template <
typename T>
190 Builder(buffer, parent, sizeof(T)) {
195 Builder(parent.buffer(), &parent, sizeof(T)) {
209 add_node_ref(
NodeRef{ref, location});
231 throw std::length_error{
"OSM relation member role is too long"};
271 add_role(*member, role, role_length);
273 add_item(*full_member);
289 add_member(type, ref, role, std::strlen(role), full_member);
304 add_member(type, ref, role.data(), role.size(), full_member);
315 throw std::length_error{
"OSM user name is too long"};
322 if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
323 throw std::length_error{
"OSM changeset comment is too long"};
343 assert(!m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
348 assert(!m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
349 m_comment = reserve_space_for<osmium::ChangesetComment>();
352 add_user(*m_comment, user, std::strlen(user));
356 assert(m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
359 add_text(comment, text, std::strlen(text));
363 assert(m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
366 add_text(comment, text.c_str(), text.size());
371 #define OSMIUM_FORWARD(setter) \ 372 template <typename... TArgs> \ 373 type& setter(TArgs&&... args) { \ 374 object().setter(std::forward<TArgs>(args)...); \ 375 return static_cast<type&>(*this); \ 378 template <
typename TDerived,
typename T>
388 Builder(buffer, parent, sizeof(T) + min_size_for_user) {
390 add_size(min_size_for_user);
391 std::fill_n(
object().data() +
sizeof(T), min_size_for_user, 0);
392 object().set_user_size(1);
403 return static_cast<T&
>(item());
414 return static_cast<const T&
>(item());
426 &&
"set_user() must be called at most once and before any sub-builders");
427 const auto available_space = min_size_for_user -
sizeof(
string_size_type) - 1;
428 if (length > available_space) {
430 std::fill_n(reserve_space(space_needed), space_needed, 0);
431 add_size(static_cast<uint32_t>(space_needed));
433 std::copy_n(user, length,
object().data() + size_of_object);
434 object().set_user_size(length + 1);
436 return static_cast<TDerived&
>(*this);
445 return set_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
454 return set_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
458 template <
typename... TArgs>
460 set_user(std::forward<TArgs>(args)...);
474 void add_tags(const
std::initializer_list<
std::pair<const
char*, const
char*>>& tags) {
476 for (
const auto& p : tags) {
477 tl_builder.
add_tag(p.first, p.second);
517 for (
const auto& node_ref : nodes) {
563 set_uid(source.
uid());
564 set_user(source.
user());
580 add_size(min_size_for_user);
581 std::fill_n(
object().data() +
sizeof(
Changeset), min_size_for_user, 0);
582 object().set_user_size(1);
604 return static_cast<const Changeset&
>(item());
635 &&
"set_user() must be called at most once and before any sub-builders");
636 const auto available_space = min_size_for_user - 1;
637 if (length > available_space) {
639 std::fill_n(reserve_space(space_needed), space_needed, 0);
640 add_size(static_cast<uint32_t>(space_needed));
642 std::copy_n(user, length,
object().data() +
sizeof(
Changeset));
643 object().set_user_size(length + 1);
654 return set_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
663 return set_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
667 template <
typename... TArgs>
669 set_user(std::forward<TArgs>(args)...);
674 #undef OSMIUM_FORWARD 680 #endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:633
uint32_t user_id_type
Type for OSM user IDs.
Definition: types.hpp:49
Definition: osm_object_builder.hpp:379
~TagListBuilder()
Definition: osm_object_builder.hpp:88
Definition: changeset.hpp:130
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition: osm_object_builder.hpp:622
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
TDerived & set_user(const char *user)
Definition: osm_object_builder.hpp:444
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:530
TagListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:83
NodeBuilder(Builder &parent)
Definition: osm_object_builder.hpp:493
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:507
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:546
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:668
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:288
void add_tag(const std::pair< const std::string &, const std::string &> &tag)
Definition: osm_object_builder.hpp:178
void initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:557
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:577
RelationBuilder(Builder &parent)
Definition: osm_object_builder.hpp:534
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:117
item_type
Definition: item_type.hpp:43
Definition: relation.hpp:168
void add_tag(const osmium::Tag &tag)
Definition: osm_object_builder.hpp:150
uint16_t string_size_type
Definition: types.hpp:59
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:250
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:459
Definition: reader_iterator.hpp:39
uint32_t changeset_comment_size_type
Definition: types.hpp:66
Definition: relation.hpp:152
Changeset & object() noexcept
Definition: osm_object_builder.hpp:592
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:240
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
Definition: osm_object_builder.hpp:309
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_user(osmium::ChangesetComment &comment, const char *user, const std::size_t length)
Definition: osm_object_builder.hpp:313
Definition: osm_object_builder.hpp:185
AreaBuilder(Builder &parent)
Definition: osm_object_builder.hpp:550
Definition: relation.hpp:57
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
#define OSMIUM_FORWARD(setter)
Definition: osm_object_builder.hpp:371
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:515
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition: osm_object_builder.hpp:347
Definition: timestamp.hpp:115
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
void add_text(osmium::ChangesetComment &comment, const char *text, const std::size_t length)
Definition: osm_object_builder.hpp:321
void add_role(osmium::RelationMember &member, const char *role, const std::size_t length)
Definition: osm_object_builder.hpp:229
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:653
T & object() noexcept
Definition: osm_object_builder.hpp:402
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:489
void add_user(TBuilder &builder, const TArgs &... args)
Definition: attr.hpp:619
Definition: location.hpp:273
void add_tag(const std::pair< const char *const, const char *> &tag)
Definition: osm_object_builder.hpp:163
Definition: osm_object_builder.hpp:501
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:166
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:303
NodeRefListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:194
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:189
void add_comment_text(const char *text)
Definition: osm_object_builder.hpp:355
Definition: buffer.hpp:98
const char * key() const noexcept
Definition: tag.hpp:79
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:267
WayBuilder(Builder &parent)
Definition: osm_object_builder.hpp:511
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:199
const T & cobject() const noexcept
Definition: osm_object_builder.hpp:413
void add_comment_text(const std::string &text)
Definition: osm_object_builder.hpp:362
Definition: osm_object_builder.hpp:483
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:160
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:423
void add_node_ref(const object_id_type ref, const osmium::Location &location=Location{})
Definition: osm_object_builder.hpp:208
~ChangesetDiscussionBuilder()
Definition: osm_object_builder.hpp:342
Definition: osm_object_builder.hpp:569
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:134
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:160
item_type type() const noexcept
Definition: item.hpp:169
const Changeset & cobject() const noexcept
Definition: osm_object_builder.hpp:603
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:290
Definition: builder.hpp:57
RelationMemberListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:245
Definition: osm_object_builder.hpp:218
ChangesetBuilder & set_user(const std::string &user)
Definition: osm_object_builder.hpp:662
TDerived & set_user(const std::string &user)
Definition: osm_object_builder.hpp:453
constexpr const int max_osm_string_length
Definition: types.hpp:69
TagListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:78
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:98
ChangesetDiscussionBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:332
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:387
Definition: object.hpp:64
Definition: osm_object_builder.hpp:74
Definition: osm_object_builder.hpp:524
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:203
Definition: osm_object_builder.hpp:540
const char * value() const
Definition: tag.hpp:83
void add_tag(const std::pair< const char *, const char *> &tag)
Definition: osm_object_builder.hpp:169
ChangesetDiscussionBuilder(Builder &parent)
Definition: osm_object_builder.hpp:337