Libosmium  2.11.4
Fast and flexible C++ library for working with OpenStreetMap data
object.hpp
Go to the documentation of this file.
1 #ifndef OSMIUM_OSM_OBJECT_HPP
2 #define OSMIUM_OSM_OBJECT_HPP
3 
4 /*
5 
6 This file is part of Osmium (http://osmcode.org/libosmium).
7 
8 Copyright 2013-2017 Jochen Topf <jochen@topf.org> and others (see README).
9 
10 Boost Software License - Version 1.0 - August 17th, 2003
11 
12 Permission is hereby granted, free of charge, to any person or organization
13 obtaining a copy of the software and accompanying documentation covered by
14 this license (the "Software") to use, reproduce, display, distribute,
15 execute, and transmit the Software, and to prepare derivative works of the
16 Software, and to permit third-parties to whom the Software is furnished to
17 do so, all subject to the following:
18 
19 The copyright notices in the Software and this entire statement, including
20 the above license grant, this restriction and the following disclaimer,
21 must be included in all copies of the Software, in whole or in part, and
22 all derivative works of the Software, unless such copies or derivative
23 works are solely in the form of machine-executable object code generated by
24 a source language processor.
25 
26 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
27 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
28 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
29 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
30 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
31 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
32 DEALINGS IN THE SOFTWARE.
33 
34 */
35 
36 #include <cstdlib>
37 #include <cstring>
38 #include <stdexcept>
39 #include <tuple>
40 #include <type_traits>
41 
43 #include <osmium/memory/item.hpp>
45 #include <osmium/osm/entity.hpp>
46 #include <osmium/osm/item_type.hpp>
47 #include <osmium/osm/location.hpp>
48 #include <osmium/osm/tag.hpp>
49 #include <osmium/osm/timestamp.hpp>
50 #include <osmium/osm/types.hpp>
52 #include <osmium/util/misc.hpp>
53 
54 namespace osmium {
55 
56  namespace builder {
57  template <typename TDerived, typename T>
58  class OSMObjectBuilder;
59  } // namespace builder
60 
64  class OSMObject : public osmium::OSMEntity {
65 
66  template <typename TDerived, typename T>
68 
70  bool m_deleted : 1;
75 
76  size_t sizeof_object() const noexcept {
77  return sizeof(OSMObject) + (type() == item_type::node ? sizeof(osmium::Location) : 0) + sizeof(string_size_type);
78  }
79 
80  unsigned char* user_position() noexcept {
81  return data() + sizeof_object() - sizeof(string_size_type);
82  }
83 
84  const unsigned char* user_position() const noexcept {
85  return data() + sizeof_object() - sizeof(string_size_type);
86  }
87 
88  string_size_type user_size() const noexcept {
89  return *reinterpret_cast<const string_size_type*>(user_position());
90  }
91 
92  unsigned char* subitems_position() {
93  return data() + osmium::memory::padded_length(sizeof_object() + user_size());
94  }
95 
96  const unsigned char* subitems_position() const {
97  return data() + osmium::memory::padded_length(sizeof_object() + user_size());
98  }
99 
100  protected:
101 
103  OSMEntity(size, type),
104  m_id(0),
105  m_deleted(false),
106  m_version(0),
107  m_timestamp(),
108  m_uid(0),
109  m_changeset(0) {
110  }
111 
113  *reinterpret_cast<string_size_type*>(user_position()) = size;
114  }
115 
116  public:
117 
118  constexpr static bool is_compatible_to(osmium::item_type t) noexcept {
119  return t == osmium::item_type::node ||
120  t == osmium::item_type::way ||
123  }
124 
126  object_id_type id() const noexcept {
127  return m_id;
128  }
129 
132  return static_cast<unsigned_object_id_type>(std::abs(m_id));
133  }
134 
141  m_id = id;
142  return *this;
143  }
144 
150  OSMObject& set_id(const char* id) {
151  return set_id(osmium::string_to_object_id(id));
152  }
153 
155  bool deleted() const noexcept {
156  return m_deleted;
157  }
158 
160  bool visible() const noexcept {
161  return !deleted();
162  }
163 
169  OSMObject& set_deleted(bool deleted) noexcept {
170  m_deleted = deleted;
171  return *this;
172  }
173 
179  OSMObject& set_visible(bool visible) noexcept {
180  m_deleted = !visible;
181  return *this;
182  }
183 
190  OSMObject& set_visible(const char* visible) {
191  if (!std::strcmp("true", visible)) {
192  set_visible(true);
193  } else if (!std::strcmp("false", visible)) {
194  set_visible(false);
195  } else {
196  throw std::invalid_argument("Unknown value for visible attribute (allowed is 'true' or 'false')");
197  }
198  return *this;
199  }
200 
202  object_version_type version() const noexcept {
203  return m_version;
204  }
205 
212  m_version = version;
213  return *this;
214  }
215 
221  OSMObject& set_version(const char* version) {
222  return set_version(string_to_object_version(version));
223  }
224 
226  changeset_id_type changeset() const noexcept {
227  return m_changeset;
228  }
229 
236  m_changeset = changeset;
237  return *this;
238  }
239 
245  OSMObject& set_changeset(const char* changeset) {
246  return set_changeset(string_to_changeset_id(changeset));
247  }
248 
250  user_id_type uid() const noexcept {
251  return m_uid;
252  }
253 
259  OSMObject& set_uid(user_id_type uid) noexcept {
260  m_uid = uid;
261  return *this;
262  }
263 
271  m_uid = uid < 0 ? 0 : static_cast<user_id_type>(uid);
272  return *this;
273  }
274 
280  OSMObject& set_uid(const char* uid) {
281  return set_uid_from_signed(string_to_user_id(uid));
282  }
283 
285  bool user_is_anonymous() const noexcept {
286  return m_uid == 0;
287  }
288 
290  osmium::Timestamp timestamp() const noexcept {
291  return m_timestamp;
292  }
293 
300  OSMObject& set_timestamp(const osmium::Timestamp& timestamp) noexcept {
301  m_timestamp = timestamp;
302  return *this;
303  }
304 
311  OSMObject& set_timestamp(const char* timestamp) {
312  m_timestamp = detail::parse_timestamp(timestamp);
313  if (timestamp[20] != '\0') {
314  throw std::invalid_argument{"can not parse timestamp"};
315  }
316  return *this;
317  }
318 
320  const char* user() const noexcept {
321  return reinterpret_cast<const char*>(data() + sizeof_object());
322  }
323 
325  const TagList& tags() const {
326  return osmium::detail::subitem_of_type<const TagList>(cbegin(), cend());
327  }
328 
335  const char* get_value_by_key(const char* key, const char* default_value = nullptr) const noexcept {
336  return tags().get_value_by_key(key, default_value);
337  }
338 
346  OSMObject& set_attribute(const char* attr, const char* value) {
347  if (!std::strcmp(attr, "id")) {
348  set_id(value);
349  } else if (!std::strcmp(attr, "version")) {
350  set_version(value);
351  } else if (!std::strcmp(attr, "changeset")) {
352  set_changeset(value);
353  } else if (!std::strcmp(attr, "timestamp")) {
354  set_timestamp(value);
355  } else if (!std::strcmp(attr, "uid")) {
356  set_uid(value);
357  } else if (!std::strcmp(attr, "visible")) {
358  set_visible(value);
359  }
360 
361  return *this;
362  }
363 
366 
368  return iterator(subitems_position());
369  }
370 
372  return iterator(next());
373  }
374 
376  return const_iterator(subitems_position());
377  }
378 
380  return const_iterator(next());
381  }
382 
384  return cbegin();
385  }
386 
387  const_iterator end() const {
388  return cend();
389  }
390 
396  template <typename T>
398  return osmium::memory::ItemIteratorRange<T>{subitems_position(), next()};
399  }
400 
406  template <typename T>
408  return osmium::memory::ItemIteratorRange<const T>{subitems_position(), next()};
409  }
410 
411  template <typename T>
413 
414  template <typename T>
416 
417  template <typename T>
419  return t_iterator<T>(subitems_position(), next());
420  }
421 
422  template <typename T>
424  return t_iterator<T>(next(), next());
425  }
426 
427  template <typename T>
429  return t_const_iterator<T>(subitems_position(), next());
430  }
431 
432  template <typename T>
434  return t_const_iterator<T>(next(), next());
435  }
436 
437  template <typename T>
439  return cbegin<T>();
440  }
441 
442  template <typename T>
444  return cend<T>();
445  }
446 
447  }; // class OSMObject
448 
449 
453  inline bool operator==(const OSMObject& lhs, const OSMObject& rhs) noexcept {
454  return lhs.type() == rhs.type() &&
455  lhs.id() == rhs.id() &&
456  lhs.version() == rhs.version();
457  }
458 
459  inline bool operator!=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
460  return ! (lhs == rhs);
461  }
462 
477  inline bool operator<(const OSMObject& lhs, const OSMObject& rhs) noexcept {
478  return const_tie(lhs.type(), lhs.positive_id(), lhs.id() < 0, lhs.version(), lhs.timestamp()) <
479  const_tie(rhs.type(), rhs.positive_id(), rhs.id() < 0, rhs.version(), rhs.timestamp());
480  }
481 
482  inline bool operator>(const OSMObject& lhs, const OSMObject& rhs) noexcept {
483  return rhs < lhs;
484  }
485 
486  inline bool operator<=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
487  return ! (rhs < lhs);
488  }
489 
490  inline bool operator>=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
491  return ! (lhs < rhs);
492  }
493 
494 } // namespace osmium
495 
496 #endif // OSMIUM_OSM_OBJECT_HPP
uint32_t object_version_type
Type for OSM object version number.
Definition: types.hpp:47
uint32_t user_id_type
Type for OSM user IDs.
Definition: types.hpp:49
Definition: osm_object_builder.hpp:378
object_id_type m_id
Definition: object.hpp:69
osmium::memory::ItemIteratorRange< T > subitems()
Definition: object.hpp:397
t_const_iterator< T > end() const
Definition: object.hpp:443
Definition: collection.hpp:47
unsigned char * user_position() noexcept
Definition: object.hpp:80
const TagList & tags() const
Get the list of tags for this object.
Definition: object.hpp:325
Definition: tag.hpp:107
type
Definition: entity_bits.hpp:63
Definition: item_iterator.hpp:175
bool operator<=(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:455
OSMObject & set_timestamp(const osmium::Timestamp &timestamp) noexcept
Definition: object.hpp:300
uint32_t item_size_type
Definition: item.hpp:59
bool m_deleted
Definition: object.hpp:70
OSMObject(osmium::memory::item_size_type size, osmium::item_type type)
Definition: object.hpp:102
Definition: item_iterator.hpp:59
string_size_type user_size() const noexcept
Definition: object.hpp:88
constexpr bool operator==(const Box &lhs, const Box &rhs) noexcept
Definition: box.hpp:221
item_type
Definition: item_type.hpp:43
osmium::memory::ItemIteratorRange< const T > subitems() const
Definition: object.hpp:407
uint16_t string_size_type
Definition: types.hpp:59
uint64_t unsigned_object_id_type
Type for OSM object (node, way, or relation) IDs where we only allow positive IDs.
Definition: types.hpp:46
size_t sizeof_object() const noexcept
Definition: object.hpp:76
object_version_type m_version
Definition: object.hpp:71
std::tuple< const Ts &... > const_tie(const Ts &... args) noexcept
Definition: misc.hpp:46
OSMObject & set_id(object_id_type id) noexcept
Definition: object.hpp:140
OSMEntity is the abstract base class for the OSMObject and Changeset classes.
Definition: entity.hpp:64
OSMObject & set_changeset(const char *changeset)
Definition: object.hpp:245
constexpr std::size_t padded_length(std::size_t length) noexcept
Definition: item.hpp:64
const_iterator cbegin() const
Definition: object.hpp:375
osmium::Timestamp m_timestamp
Definition: object.hpp:72
object_version_type string_to_object_version(const char *input)
Definition: types_from_string.hpp:130
bool user_is_anonymous() const noexcept
Is this user anonymous?
Definition: object.hpp:285
iterator end()
Definition: object.hpp:371
OSMObject & set_visible(const char *visible)
Definition: object.hpp:190
OSMObject & set_uid_from_signed(signed_user_id_type uid) noexcept
Definition: object.hpp:270
bool operator<(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:447
object_id_type string_to_object_id(const char *input)
Definition: types_from_string.hpp:60
t_const_iterator< T > begin() const
Definition: object.hpp:438
Namespace for everything in the Osmium library.
Definition: assembler.hpp:73
changeset_id_type m_changeset
Definition: object.hpp:74
static constexpr bool is_compatible_to(osmium::item_type t) noexcept
Definition: object.hpp:118
int32_t signed_user_id_type
Type for signed OSM user IDs.
Definition: types.hpp:50
Definition: timestamp.hpp:115
uint32_t changeset_id_type
Type for OSM changeset IDs.
Definition: types.hpp:48
int64_t object_id_type
Type for OSM object (node, way, or relation) IDs.
Definition: types.hpp:45
changeset_id_type string_to_changeset_id(const char *input)
Definition: types_from_string.hpp:144
const_iterator cend() const
Definition: object.hpp:379
user_id_type uid() const noexcept
Get user id of this object.
Definition: object.hpp:250
t_iterator< T > begin()
Definition: object.hpp:418
changeset_id_type changeset() const noexcept
Get changeset id of this object.
Definition: object.hpp:226
OSMObject & set_changeset(changeset_id_type changeset) noexcept
Definition: object.hpp:235
OSMObject & set_uid(const char *uid)
Definition: object.hpp:280
Definition: location.hpp:273
OSMObject & set_id(const char *id)
Definition: object.hpp:150
bool deleted() const noexcept
Is this object marked as deleted?
Definition: object.hpp:155
bool operator>=(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:459
object_id_type id() const noexcept
Get ID of this object.
Definition: object.hpp:126
OSMObject & set_version(object_version_type version) noexcept
Definition: object.hpp:211
signed_user_id_type string_to_user_id(const char *input)
Definition: types_from_string.hpp:158
OSMObject & set_attribute(const char *attr, const char *value)
Definition: object.hpp:346
object_version_type version() const noexcept
Get version of this object.
Definition: object.hpp:202
bool operator>(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:451
t_const_iterator< T > cend() const
Definition: object.hpp:433
OSMObject & set_visible(bool visible) noexcept
Definition: object.hpp:179
uint32_t size() const noexcept
Definition: builder.hpp:141
bool visible() const noexcept
Is this object marked visible (ie not deleted)?
Definition: object.hpp:160
t_const_iterator< T > cbegin() const
Definition: object.hpp:428
unsigned char * subitems_position()
Definition: object.hpp:92
t_iterator< T > end()
Definition: object.hpp:423
user_id_type m_uid
Definition: object.hpp:73
unsigned_object_id_type positive_id() const noexcept
Get absolute value of the ID of this object.
Definition: object.hpp:131
OSMObject & set_deleted(bool deleted) noexcept
Definition: object.hpp:169
const unsigned char * subitems_position() const
Definition: object.hpp:96
void set_user_size(string_size_type size)
Definition: object.hpp:112
const_iterator end() const
Definition: object.hpp:387
const char * get_value_by_key(const char *key, const char *default_value=nullptr) const noexcept
Definition: object.hpp:335
const unsigned char * user_position() const noexcept
Definition: object.hpp:84
const char * user() const noexcept
Get user name for this object.
Definition: object.hpp:320
const_iterator begin() const
Definition: object.hpp:383
OSMObject & set_version(const char *version)
Definition: object.hpp:221
osmium::Timestamp timestamp() const noexcept
Get timestamp when this object last changed.
Definition: object.hpp:290
OSMObject & set_uid(user_id_type uid) noexcept
Definition: object.hpp:259
bool operator!=(const Changeset &lhs, const Changeset &rhs)
Definition: changeset.hpp:440
OSMObject & set_timestamp(const char *timestamp)
Definition: object.hpp:311
Definition: object.hpp:64
iterator begin()
Definition: object.hpp:367