Merge commit '788bc67faa7738cf7c6b2a192ecf3e3567d1c20e' into develop
This commit is contained in:
+1
-1
@@ -33,7 +33,6 @@ DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstring>
|
||||
|
||||
#include <osmium/memory/collection.hpp>
|
||||
@@ -44,6 +43,7 @@ DEALINGS IN THE SOFTWARE.
|
||||
#include <osmium/osm/tag.hpp>
|
||||
#include <osmium/osm/timestamp.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
#include <osmium/osm/types_from_string.hpp>
|
||||
|
||||
namespace osmium {
|
||||
|
||||
|
||||
+223
@@ -0,0 +1,223 @@
|
||||
#ifndef OSMIUM_OSM_CRC_HPP
|
||||
#define OSMIUM_OSM_CRC_HPP
|
||||
|
||||
/*
|
||||
|
||||
This file is part of Osmium (http://osmcode.org/libosmium).
|
||||
|
||||
Copyright 2013-2015 Jochen Topf <jochen@topf.org> and others (see README).
|
||||
|
||||
Boost Software License - Version 1.0 - August 17th, 2003
|
||||
|
||||
Permission is hereby granted, free of charge, to any person or organization
|
||||
obtaining a copy of the software and accompanying documentation covered by
|
||||
this license (the "Software") to use, reproduce, display, distribute,
|
||||
execute, and transmit the Software, and to prepare derivative works of the
|
||||
Software, and to permit third-parties to whom the Software is furnished to
|
||||
do so, all subject to the following:
|
||||
|
||||
The copyright notices in the Software and this entire statement, including
|
||||
the above license grant, this restriction and the following disclaimer,
|
||||
must be included in all copies of the Software, in whole or in part, and
|
||||
all derivative works of the Software, unless such copies or derivative
|
||||
works are solely in the form of machine-executable object code generated by
|
||||
a source language processor.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
|
||||
#include <osmium/osm/area.hpp>
|
||||
#include <osmium/osm/changeset.hpp>
|
||||
#include <osmium/osm/location.hpp>
|
||||
#include <osmium/osm/node.hpp>
|
||||
#include <osmium/osm/node_ref_list.hpp>
|
||||
#include <osmium/osm/relation.hpp>
|
||||
#include <osmium/osm/way.hpp>
|
||||
#include <osmium/util/endian.hpp>
|
||||
|
||||
namespace osmium {
|
||||
|
||||
template <class TCRC>
|
||||
class CRC {
|
||||
|
||||
static inline uint16_t byte_swap_16(uint16_t value) noexcept {
|
||||
# if defined(__GNUC__) || defined(__clang__)
|
||||
return __builtin_bswap16(value);
|
||||
# else
|
||||
return (value >> 8) | (value << 8);
|
||||
# endif
|
||||
}
|
||||
|
||||
static inline uint32_t byte_swap_32(uint32_t value) noexcept {
|
||||
# if defined(__GNUC__) || defined(__clang__)
|
||||
return __builtin_bswap32(value);
|
||||
# else
|
||||
return (value >> 24) |
|
||||
((value >> 8) & 0x0000FF00) |
|
||||
((value << 8) & 0x00FF0000) |
|
||||
(value << 24);
|
||||
# endif
|
||||
}
|
||||
|
||||
static inline uint64_t byte_swap_64(uint64_t value) noexcept {
|
||||
# if defined(__GNUC__) || defined(__clang__)
|
||||
return __builtin_bswap64(value);
|
||||
# else
|
||||
uint64_t val1 = byte_swap_32(value & 0xFFFFFFFF);
|
||||
uint64_t val2 = byte_swap_32(value >> 32);
|
||||
return (val1 << 32) & val2;
|
||||
# endif
|
||||
}
|
||||
|
||||
TCRC m_crc;
|
||||
|
||||
public:
|
||||
|
||||
TCRC& operator()() {
|
||||
return m_crc;
|
||||
}
|
||||
|
||||
const TCRC& operator()() const {
|
||||
return m_crc;
|
||||
}
|
||||
|
||||
void update_bool(bool value) {
|
||||
m_crc.process_byte(value);
|
||||
}
|
||||
|
||||
void update_int8(uint8_t value) {
|
||||
m_crc.process_byte(value);
|
||||
}
|
||||
|
||||
void update_int16(uint16_t value) {
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
m_crc.process_bytes(&value, sizeof(uint16_t));
|
||||
#else
|
||||
uint16_t v = byte_swap_16(value);
|
||||
m_crc.process_bytes(&v, sizeof(uint16_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
void update_int32(uint32_t value) {
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
m_crc.process_bytes(&value, sizeof(uint32_t));
|
||||
#else
|
||||
uint32_t v = byte_swap_32(value);
|
||||
m_crc.process_bytes(&v, sizeof(uint32_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
void update_int64(uint64_t value) {
|
||||
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||
m_crc.process_bytes(&value, sizeof(uint64_t));
|
||||
#else
|
||||
uint64_t v = byte_swap_64(value);
|
||||
m_crc.process_bytes(&v, sizeof(uint64_t));
|
||||
#endif
|
||||
}
|
||||
|
||||
void update_string(const char* str) {
|
||||
while (*str) {
|
||||
m_crc.process_byte(*str++);
|
||||
}
|
||||
}
|
||||
|
||||
void update(const Timestamp& timestamp) {
|
||||
update_int32(uint32_t(timestamp));
|
||||
}
|
||||
|
||||
void update(const osmium::Location& location) {
|
||||
update_int32(location.x());
|
||||
update_int32(location.y());
|
||||
}
|
||||
|
||||
void update(const osmium::Box& box) {
|
||||
update(box.bottom_left());
|
||||
update(box.top_right());
|
||||
}
|
||||
|
||||
void update(const NodeRef& node_ref) {
|
||||
update_int64(node_ref.ref());
|
||||
}
|
||||
|
||||
void update(const NodeRefList& node_refs) {
|
||||
for (const NodeRef& node_ref : node_refs) {
|
||||
update(node_ref);
|
||||
}
|
||||
}
|
||||
|
||||
void update(const TagList& tags) {
|
||||
m_crc.process_bytes(tags.data(), tags.byte_size());
|
||||
}
|
||||
|
||||
void update(const osmium::RelationMember& member) {
|
||||
update_int64(member.ref());
|
||||
update_int16(uint16_t(member.type()));
|
||||
update_string(member.role());
|
||||
}
|
||||
|
||||
void update(const osmium::RelationMemberList& members) {
|
||||
for (const RelationMember& member : members) {
|
||||
update(member);
|
||||
}
|
||||
}
|
||||
|
||||
void update(const osmium::OSMObject& object) {
|
||||
update_int64(object.id());
|
||||
update_bool(object.visible());
|
||||
update_int32(object.version());
|
||||
update(object.timestamp());
|
||||
update_int32(object.uid());
|
||||
update_string(object.user());
|
||||
update(object.tags());
|
||||
}
|
||||
|
||||
void update(const osmium::Node& node) {
|
||||
update(static_cast<const osmium::OSMObject&>(node));
|
||||
update(node.location());
|
||||
}
|
||||
|
||||
void update(const osmium::Way& way) {
|
||||
update(static_cast<const osmium::OSMObject&>(way));
|
||||
update(way.nodes());
|
||||
}
|
||||
|
||||
void update(const osmium::Relation& relation) {
|
||||
update(static_cast<const osmium::OSMObject&>(relation));
|
||||
update(relation.members());
|
||||
}
|
||||
|
||||
void update(const osmium::Area& area) {
|
||||
update(static_cast<const osmium::OSMObject&>(area));
|
||||
for (auto it = area.cbegin(); it != area.cend(); ++it) {
|
||||
if (it->type() == osmium::item_type::outer_ring ||
|
||||
it->type() == osmium::item_type::inner_ring) {
|
||||
update(static_cast<const osmium::NodeRefList&>(*it));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void update(const osmium::Changeset& changeset) {
|
||||
update_int64(changeset.id());
|
||||
update(changeset.created_at());
|
||||
update(changeset.closed_at());
|
||||
update(changeset.bounds());
|
||||
update_int32(changeset.num_changes());
|
||||
update_int32(changeset.uid());
|
||||
update_string(changeset.user());
|
||||
}
|
||||
|
||||
}; // class CRC
|
||||
|
||||
} // namespace osmium
|
||||
|
||||
#endif // OSMIUM_OSM_CRC
|
||||
+28
-1
@@ -112,8 +112,35 @@ namespace osmium {
|
||||
return m_curr->timestamp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the timestamp when the current version of the object is
|
||||
* not valid any more, ie the time when the next version of the object
|
||||
* is valid. If this is the last version of the object, this will
|
||||
* return a special "end of time" timestamp that is guaranteed to
|
||||
* be larger than any normal timestamp.
|
||||
*/
|
||||
const osmium::Timestamp end_time() const noexcept {
|
||||
return last() ? osmium::Timestamp() : m_next->timestamp();
|
||||
return last() ? osmium::end_of_time() : m_next->timestamp();
|
||||
}
|
||||
|
||||
/**
|
||||
* Current object version is valid between time "from" (inclusive) and
|
||||
* time "to" (not inclusive).
|
||||
*
|
||||
* This is a bit more complex than you'd think, because we have to
|
||||
* handle the case properly where the start_time() == end_time().
|
||||
*/
|
||||
bool is_between(const osmium::Timestamp& from, const osmium::Timestamp& to) const noexcept {
|
||||
return start_time() < to &&
|
||||
((start_time() != end_time() && end_time() > from) ||
|
||||
(start_time() == end_time() && end_time() >= from));
|
||||
}
|
||||
|
||||
/**
|
||||
* Current object version is visible at the given timestamp.
|
||||
*/
|
||||
bool is_visible_at(const osmium::Timestamp& timestamp) const noexcept {
|
||||
return start_time() <= timestamp && end_time() > timestamp && m_curr->visible();
|
||||
}
|
||||
|
||||
}; // class DiffObject
|
||||
|
||||
@@ -35,6 +35,7 @@ DEALINGS IN THE SOFTWARE.
|
||||
|
||||
#include <osmium/memory/item.hpp>
|
||||
#include <osmium/osm/entity_bits.hpp>
|
||||
#include <osmium/osm/item_type.hpp>
|
||||
|
||||
namespace osmium {
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include <cstdint> // IWYU pragma: keep
|
||||
#include <iosfwd>
|
||||
#include <stdexcept>
|
||||
@@ -56,6 +57,25 @@ namespace osmium {
|
||||
|
||||
}; // enum class item_type
|
||||
|
||||
/**
|
||||
* Return item_type for index:
|
||||
* 0 -> node, 1 -> way, 2 -> relation
|
||||
*/
|
||||
inline item_type nwr_index_to_item_type(unsigned int i) noexcept {
|
||||
assert(i <= 2);
|
||||
return item_type(i+1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return index for item_type:
|
||||
* node -> 0, way -> 1, relation -> 2
|
||||
*/
|
||||
inline unsigned int item_type_to_nwr_index(item_type type) noexcept {
|
||||
unsigned int i = static_cast<unsigned int>(type);
|
||||
assert(i >= 1 && i <= 3);
|
||||
return i - 1;
|
||||
}
|
||||
|
||||
inline item_type char_to_item_type(const char c) noexcept {
|
||||
switch (c) {
|
||||
case 'X':
|
||||
|
||||
+1
-1
@@ -33,11 +33,11 @@ DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <iosfwd>
|
||||
|
||||
#include <osmium/memory/item.hpp>
|
||||
#include <osmium/osm/item_type.hpp>
|
||||
#include <osmium/osm/location.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ DEALINGS IN THE SOFTWARE.
|
||||
#include <osmium/osm/tag.hpp>
|
||||
#include <osmium/osm/timestamp.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
#include <osmium/osm/types_from_string.hpp>
|
||||
|
||||
namespace osmium {
|
||||
|
||||
|
||||
@@ -120,6 +120,11 @@ namespace osmium {
|
||||
return static_cast<unsigned_object_id_type>(std::abs(m_ref));
|
||||
}
|
||||
|
||||
RelationMember& set_ref(const osmium::object_id_type ref) noexcept {
|
||||
m_ref = ref;
|
||||
return *this;
|
||||
}
|
||||
|
||||
item_type type() const noexcept {
|
||||
return m_type;
|
||||
}
|
||||
|
||||
+11
-1
@@ -39,9 +39,9 @@ DEALINGS IN THE SOFTWARE.
|
||||
#include <limits>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <time.h>
|
||||
|
||||
#include <osmium/util/compatibility.hpp>
|
||||
#include <osmium/util/minmax.hpp> // IWYU pragma: keep
|
||||
|
||||
namespace osmium {
|
||||
|
||||
@@ -170,6 +170,16 @@ namespace osmium {
|
||||
return out;
|
||||
}
|
||||
|
||||
template <>
|
||||
inline osmium::Timestamp min_op_start_value<osmium::Timestamp>() {
|
||||
return end_of_time();
|
||||
}
|
||||
|
||||
template <>
|
||||
inline osmium::Timestamp max_op_start_value<osmium::Timestamp>() {
|
||||
return start_of_time();
|
||||
}
|
||||
|
||||
} // namespace osmium
|
||||
|
||||
#endif // OSMIUM_OSM_TIMESTAMP_HPP
|
||||
|
||||
@@ -34,7 +34,6 @@ DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
|
||||
namespace osmium {
|
||||
|
||||
@@ -58,26 +57,6 @@ namespace osmium {
|
||||
*/
|
||||
typedef uint16_t string_size_type;
|
||||
|
||||
inline object_id_type string_to_object_id(const char* string) {
|
||||
return std::atoll(string);
|
||||
}
|
||||
|
||||
inline object_version_type string_to_object_version(const char* string) {
|
||||
return static_cast<object_version_type>(std::atol(string));
|
||||
}
|
||||
|
||||
inline changeset_id_type string_to_changeset_id(const char* string) {
|
||||
return static_cast<changeset_id_type>(std::atol(string));
|
||||
}
|
||||
|
||||
inline signed_user_id_type string_to_user_id(const char* string) {
|
||||
return static_cast<signed_user_id_type>(std::atol(string));
|
||||
}
|
||||
|
||||
inline num_changes_type string_to_num_changes(const char* string) {
|
||||
return static_cast<num_changes_type>(std::atol(string));
|
||||
}
|
||||
|
||||
} // namespace osmium
|
||||
|
||||
#endif // OSMIUM_OSM_TYPES_HPP
|
||||
|
||||
@@ -0,0 +1,116 @@
|
||||
#ifndef OSMIUM_OSM_TYPES_FROM_STRING_HPP
|
||||
#define OSMIUM_OSM_TYPES_FROM_STRING_HPP
|
||||
|
||||
/*
|
||||
|
||||
This file is part of Osmium (http://osmcode.org/libosmium).
|
||||
|
||||
Copyright 2013-2015 Jochen Topf <jochen@topf.org> and others (see README).
|
||||
|
||||
Boost Software License - Version 1.0 - August 17th, 2003
|
||||
|
||||
Permission is hereby granted, free of charge, to any person or organization
|
||||
obtaining a copy of the software and accompanying documentation covered by
|
||||
this license (the "Software") to use, reproduce, display, distribute,
|
||||
execute, and transmit the Software, and to prepare derivative works of the
|
||||
Software, and to permit third-parties to whom the Software is furnished to
|
||||
do so, all subject to the following:
|
||||
|
||||
The copyright notices in the Software and this entire statement, including
|
||||
the above license grant, this restriction and the following disclaimer,
|
||||
must be included in all copies of the Software, in whole or in part, and
|
||||
all derivative works of the Software, unless such copies or derivative
|
||||
works are solely in the form of machine-executable object code generated by
|
||||
a source language processor.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
|
||||
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
|
||||
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
|
||||
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
#include <cassert>
|
||||
#include <cctype>
|
||||
#include <cstdint>
|
||||
#include <cstdlib>
|
||||
#include <limits>
|
||||
#include <string>
|
||||
#include <utility>
|
||||
|
||||
#include <osmium/osm/entity_bits.hpp>
|
||||
#include <osmium/osm/types.hpp>
|
||||
|
||||
namespace osmium {
|
||||
|
||||
inline object_id_type string_to_object_id(const char* input) {
|
||||
assert(input);
|
||||
if (*input != '\0' && !std::isspace(*input)) {
|
||||
char* end;
|
||||
auto id = std::strtoll(input, &end, 10);
|
||||
if (id != std::numeric_limits<long long>::min() && id != std::numeric_limits<long long>::max() && *end == '\0') {
|
||||
return id;
|
||||
}
|
||||
}
|
||||
throw std::range_error(std::string("illegal id: '") + input + "'");
|
||||
}
|
||||
|
||||
inline std::pair<osmium::item_type, osmium::object_id_type> string_to_object_id(const char* input, osmium::osm_entity_bits::type types) {
|
||||
assert(input);
|
||||
assert(types != osmium::osm_entity_bits::nothing);
|
||||
if (*input != '\0') {
|
||||
if (std::isdigit(*input)) {
|
||||
return std::make_pair(osmium::item_type::undefined, string_to_object_id(input));
|
||||
}
|
||||
osmium::item_type t = osmium::char_to_item_type(*input);
|
||||
if (osmium::osm_entity_bits::from_item_type(t) & types) {
|
||||
return std::make_pair(t, string_to_object_id(input+1));
|
||||
}
|
||||
}
|
||||
throw std::range_error(std::string("not a valid id: '") + input + "'");
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
inline long string_to_ulong(const char* input, const char *name) {
|
||||
if (*input != '\0' && *input != '-' && !std::isspace(*input)) {
|
||||
char* end;
|
||||
auto value = std::strtoul(input, &end, 10);
|
||||
if (value != std::numeric_limits<unsigned long>::max() && *end == '\0') {
|
||||
return value;
|
||||
}
|
||||
}
|
||||
throw std::range_error(std::string("illegal ") + name + ": '" + input + "'");
|
||||
}
|
||||
|
||||
} // namespace detail
|
||||
|
||||
inline object_version_type string_to_object_version(const char* input) {
|
||||
assert(input);
|
||||
return static_cast<object_version_type>(detail::string_to_ulong(input, "version"));
|
||||
}
|
||||
|
||||
inline changeset_id_type string_to_changeset_id(const char* input) {
|
||||
assert(input);
|
||||
return static_cast<changeset_id_type>(detail::string_to_ulong(input, "changeset"));
|
||||
}
|
||||
|
||||
inline signed_user_id_type string_to_user_id(const char* input) {
|
||||
assert(input);
|
||||
if (input[0] == '-' && input[1] == '1' && input[2] == '\0') {
|
||||
return -1;
|
||||
}
|
||||
return static_cast<signed_user_id_type>(detail::string_to_ulong(input, "user id"));
|
||||
}
|
||||
|
||||
inline num_changes_type string_to_num_changes(const char* input) {
|
||||
assert(input);
|
||||
return static_cast<num_changes_type>(detail::string_to_ulong(input, "value for num changes"));
|
||||
}
|
||||
|
||||
} // namespace osmium
|
||||
|
||||
#endif // OSMIUM_OSM_TYPES_FROM_STRING_HPP
|
||||
Reference in New Issue
Block a user