1 #ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP 2 #define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP 58 #include <initializer_list> 103 void add_tag(
const char* key,
const char* value) {
105 throw std::length_error{
"OSM tag key is too long"};
108 throw std::length_error{
"OSM tag value is too long"};
122 void add_tag(
const char* key,
const std::size_t key_length,
const char* value,
const std::size_t value_length) {
124 throw std::length_error{
"OSM tag key is too long"};
127 throw std::length_error{
"OSM tag value is too long"};
139 void add_tag(
const std::string& key,
const std::string& value) {
141 throw std::length_error{
"OSM tag key is too long"};
144 throw std::length_error{
"OSM tag value is too long"};
165 void add_tag(
const std::pair<const char* const, const char* const>& tag) {
166 add_tag(tag.first, tag.second);
168 void add_tag(
const std::pair<const char* const, const char*>& tag) {
169 add_tag(tag.first, tag.second);
171 void add_tag(
const std::pair<const char*, const char* const>& tag) {
172 add_tag(tag.first, tag.second);
174 void add_tag(
const std::pair<const char*, const char*>& tag) {
175 add_tag(tag.first, tag.second);
183 void add_tag(
const std::pair<const std::string&, const std::string&>& tag) {
184 add_tag(tag.first, tag.second);
189 template <
typename T>
242 throw std::length_error{
"OSM relation member role is too long"};
285 auto* member = reserve_space_for<osmium::RelationMember>();
288 add_role(*member, role, role_length);
332 throw std::length_error{
"OSM user name is too long"};
339 if (length > std::numeric_limits<osmium::changeset_comment_size_type>::max() - 1) {
340 throw std::length_error{
"OSM changeset comment is too long"};
366 assert(!
m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
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>();
379 assert(
m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
382 add_text(comment, text, std::strlen(text));
386 assert(
m_comment &&
"You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
389 add_text(comment, text.c_str(), text.size());
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); \ 401 template <
typename TDerived,
typename T>
415 object().set_user_size(1);
426 return static_cast<T&>(
item());
437 return static_cast<const T&>(
item());
449 &&
"set_user() must be called at most once and before any sub-builders");
451 if (length > available_space) {
454 add_size(static_cast<uint32_t>(space_needed));
456 std::copy_n(user, length,
object().data() + size_of_object);
457 object().set_user_size(length + 1);
459 return static_cast<TDerived&>(*
this);
470 const auto len = std::strlen(user);
471 assert(len < std::numeric_limits<string_size_type>::max());
472 return set_user(user, static_cast<string_size_type>(len));
483 assert(user.size() < std::numeric_limits<string_size_type>::max());
484 return set_user(user.data(), static_cast<string_size_type>(user.size()));
488 template <
typename... TArgs>
490 set_user(std::forward<TArgs>(args)...);
504 void
add_tags(const
std::initializer_list<
std::pair<const
char*, const
char*>>& tags) {
506 for (
const auto& p : tags) {
507 tl_builder.add_tag(p.first, p.second);
547 for (
const auto& node_ref : nodes) {
548 builder.add_node_ref(node_ref);
593 set_uid(source.
uid());
623 return static_cast<Changeset&>(
item());
634 return static_cast<const Changeset&>(
item());
665 &&
"set_user() must be called at most once and before any sub-builders");
667 if (length > available_space) {
670 add_size(static_cast<uint32_t>(space_needed));
672 std::copy_n(user, length,
object().data() +
sizeof(
Changeset));
686 const auto len = std::strlen(user);
687 assert(len <= std::numeric_limits<string_size_type>::max());
688 return set_user(user, static_cast<string_size_type>(len));
699 assert(user.size() < std::numeric_limits<string_size_type>::max());
700 return set_user(user.data(), static_cast<string_size_type>(user.size()));
704 template <
typename... TArgs>
706 set_user(std::forward<TArgs>(args)...);
711 #undef OSMIUM_FORWARD 717 #endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP ChangesetBuilder & set_user(const char *user, const string_size_type length)
Definition: osm_object_builder.hpp:663
uint32_t user_id_type
Type for OSM user IDs.
Definition: types.hpp:49
Definition: osm_object_builder.hpp:402
~TagListBuilder()
Definition: osm_object_builder.hpp:93
Definition: changeset.hpp:132
ChangesetBuilder & set_bounds(const osmium::Box &box) noexcept
Definition: osm_object_builder.hpp:652
#define OSMIUM_DEPRECATED
Definition: compatibility.hpp:50
TagListBuilder & operator=(const TagListBuilder &)=delete
osmium::memory::Buffer & buffer() noexcept
Return the buffer this builder is using.
Definition: builder.hpp:207
TDerived & set_user(const char *user)
Definition: osm_object_builder.hpp:469
void add_item(const osmium::memory::Item &item)
Definition: builder.hpp:215
type
Definition: entity_bits.hpp:63
void add_size(osmium::memory::item_size_type size)
Definition: builder.hpp:126
uint32_t item_size_type
Definition: item.hpp:57
osmium::Box & bounds() noexcept
Definition: changeset.hpp:350
RelationBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:560
TagListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:82
NodeBuilder(Builder &parent)
Definition: osm_object_builder.hpp:523
WayBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:537
AreaBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:576
osmium::memory::item_size_type append_with_zero(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:169
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:705
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 initialize_from_object(const osmium::OSMObject &source)
Definition: osm_object_builder.hpp:587
ChangesetBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:607
RelationBuilder(Builder &parent)
Definition: osm_object_builder.hpp:564
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
item_type
Definition: item_type.hpp:43
Definition: relation.hpp:168
void add_tag(const osmium::Tag &tag)
Definition: osm_object_builder.hpp:155
uint16_t string_size_type
Definition: types.hpp:59
~RelationMemberListBuilder()
Definition: osm_object_builder.hpp:267
OSMIUM_DEPRECATED void add_user(TArgs &&... args)
Definition: osm_object_builder.hpp:489
Definition: location.hpp:550
uint32_t changeset_comment_size_type
Definition: types.hpp:66
Definition: relation.hpp:154
NodeRefListBuilder & operator=(const NodeRefListBuilder &)=delete
Changeset & object() noexcept
Definition: osm_object_builder.hpp:622
RelationMemberListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:251
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:62
Definition: osm_object_builder.hpp:326
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:330
static constexpr const std::size_t min_size_for_user
Definition: osm_object_builder.hpp:406
Definition: osm_object_builder.hpp:190
void add_tag(const std::pair< const std::string &, const std::string & > &tag)
Definition: osm_object_builder.hpp:183
AreaBuilder(Builder &parent)
Definition: osm_object_builder.hpp:580
Definition: relation.hpp:57
void add_tag(const std::pair< const char *const, const char * > &tag)
Definition: osm_object_builder.hpp:168
Namespace for everything in the Osmium library.
Definition: assembler.hpp:53
#define OSMIUM_FORWARD(setter)
Definition: osm_object_builder.hpp:394
void add_node_refs(const std::initializer_list< osmium::NodeRef > &nodes)
Definition: osm_object_builder.hpp:545
void set_user_size(string_size_type size) noexcept
Definition: changeset.hpp:167
static constexpr const std::size_t min_size_for_user
Definition: osm_object_builder.hpp:603
unsigned char * reserve_space(std::size_t size)
Definition: builder.hpp:94
void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char *user)
Definition: osm_object_builder.hpp:370
Definition: timestamp.hpp:145
void add_tag(const std::pair< const char *, const char * > &tag)
Definition: osm_object_builder.hpp:174
RelationMemberListBuilder & operator=(const RelationMemberListBuilder &)=delete
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:648
void add_text(osmium::ChangesetComment &comment, const char *text, const std::size_t length)
Definition: osm_object_builder.hpp:338
void add_role(osmium::RelationMember &member, const char *role, const std::size_t length)
Definition: osm_object_builder.hpp:240
void add_tags(const std::initializer_list< std::pair< const char *, const char * >> &tags)
Definition: osm_object_builder.hpp:504
user_id_type uid() const noexcept
Get user id of this object.
Definition: object.hpp:246
changeset_id_type changeset() const noexcept
Get changeset id of this object.
Definition: object.hpp:222
ChangesetBuilder & set_user(const char *user)
Definition: osm_object_builder.hpp:685
T & object() noexcept
Definition: osm_object_builder.hpp:425
NodeBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:519
Definition: location.hpp:273
osmium::ChangesetComment * m_comment
Definition: osm_object_builder.hpp:328
Definition: osm_object_builder.hpp:531
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:122
ChangesetDiscussionBuilder & operator=(const ChangesetDiscussionBuilder &)=delete
object_version_type version() const noexcept
Get version of this object.
Definition: object.hpp:198
void set_role_size(string_size_type size) noexcept
Definition: relation.hpp:91
void add_tag(const std::pair< const char *, const char *const > &tag)
Definition: osm_object_builder.hpp:171
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
NodeRefListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:199
NodeRefListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:194
void add_comment_text(const char *text)
Definition: osm_object_builder.hpp:378
Definition: buffer.hpp:97
const char * key() const noexcept
Definition: tag.hpp:81
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
WayBuilder(Builder &parent)
Definition: osm_object_builder.hpp:541
~NodeRefListBuilder()
Definition: osm_object_builder.hpp:210
const T & cobject() const noexcept
Definition: osm_object_builder.hpp:436
osmium::memory::item_size_type append(const char *data, const osmium::memory::item_size_type length)
Definition: builder.hpp:156
void add_comment_text(const std::string &text)
Definition: osm_object_builder.hpp:385
uint32_t size() const noexcept
Definition: builder.hpp:133
Definition: osm_object_builder.hpp:513
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:156
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:446
void add_node_ref(const object_id_type ref, const osmium::Location &location=Location{})
Definition: osm_object_builder.hpp:219
~ChangesetDiscussionBuilder()
Definition: osm_object_builder.hpp:365
Definition: osm_object_builder.hpp:599
void add_tag(const std::string &key, const std::string &value)
Definition: osm_object_builder.hpp:139
Definition: node_ref.hpp:50
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:317
void add_tag(const std::pair< const char *const, const char *const > &tag)
Definition: osm_object_builder.hpp:165
item_type type() const noexcept
Definition: item.hpp:169
const Changeset & cobject() const noexcept
Definition: osm_object_builder.hpp:633
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:287
Definition: builder.hpp:57
RelationMemberListBuilder(Builder &parent)
Definition: osm_object_builder.hpp:256
Definition: osm_object_builder.hpp:229
ChangesetBuilder & set_user(const std::string &user)
Definition: osm_object_builder.hpp:698
TDerived & set_user(const std::string &user)
Definition: osm_object_builder.hpp:482
constexpr const int max_osm_string_length
Definition: types.hpp:69
TagListBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:77
void add_tag(const char *key, const char *value)
Definition: osm_object_builder.hpp:103
ChangesetDiscussionBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:349
OSMObjectBuilder(osmium::memory::Buffer &buffer, Builder *parent=nullptr)
Definition: osm_object_builder.hpp:410
Definition: object.hpp:64
Definition: osm_object_builder.hpp:73
Definition: osm_object_builder.hpp:554
void add_node_ref(const NodeRef &node_ref)
Definition: osm_object_builder.hpp:214
Definition: osm_object_builder.hpp:570
const char * value() const
Definition: tag.hpp:85
void add_padding(bool self=false)
Definition: builder.hpp:111
osmium::memory::Item & item() const
Definition: builder.hpp:90
ChangesetDiscussionBuilder(Builder &parent)
Definition: osm_object_builder.hpp:354