[osm2pgsql] 10/18: Imported Upstream version 0.90.0~rc1+ds
Sebastiaan Couwenberg
sebastic at moszumanska.debian.org
Sat Feb 27 15:33:46 UTC 2016
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository osm2pgsql.
commit a134b29990b3b9f8dfdc6c66b252216f8a93b7d9
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Sat Feb 27 15:08:55 2016 +0100
Imported Upstream version 0.90.0~rc1+ds
---
contrib/libosmium/LICENSE.txt | 23 -
contrib/libosmium/README.contrib | 2 -
contrib/libosmium/README.md | 108 --
contrib/libosmium/osmium/area/assembler.hpp | 787 ---------------
.../osmium/area/detail/node_ref_segment.hpp | 262 -----
.../libosmium/osmium/area/detail/proto_ring.hpp | 277 -----
.../libosmium/osmium/area/detail/segment_list.hpp | 218 ----
.../osmium/area/multipolygon_collector.hpp | 223 ----
contrib/libosmium/osmium/area/problem_reporter.hpp | 149 ---
.../osmium/area/problem_reporter_exception.hpp | 96 --
.../libosmium/osmium/area/problem_reporter_ogr.hpp | 139 ---
.../osmium/area/problem_reporter_stream.hpp | 96 --
contrib/libosmium/osmium/builder/builder.hpp | 237 -----
.../libosmium/osmium/builder/builder_helper.hpp | 103 --
.../osmium/builder/osm_object_builder.hpp | 370 -------
contrib/libosmium/osmium/diff_handler.hpp | 67 --
contrib/libosmium/osmium/diff_iterator.hpp | 129 ---
contrib/libosmium/osmium/diff_visitor.hpp | 104 --
contrib/libosmium/osmium/dynamic_handler.hpp | 190 ----
.../libosmium/osmium/experimental/flex_reader.hpp | 137 ---
contrib/libosmium/osmium/fwd.hpp | 70 --
contrib/libosmium/osmium/geom/coordinates.hpp | 96 --
contrib/libosmium/osmium/geom/factory.hpp | 419 --------
contrib/libosmium/osmium/geom/geojson.hpp | 160 ---
contrib/libosmium/osmium/geom/geos.hpp | 240 -----
contrib/libosmium/osmium/geom/haversine.hpp | 94 --
.../libosmium/osmium/geom/mercator_projection.hpp | 110 --
contrib/libosmium/osmium/geom/ogr.hpp | 178 ----
contrib/libosmium/osmium/geom/projection.hpp | 167 ---
contrib/libosmium/osmium/geom/rapid_geojson.hpp | 190 ----
contrib/libosmium/osmium/geom/relations.hpp | 57 --
contrib/libosmium/osmium/geom/tile.hpp | 101 --
contrib/libosmium/osmium/geom/util.hpp | 75 --
contrib/libosmium/osmium/geom/wkb.hpp | 273 -----
contrib/libosmium/osmium/geom/wkt.hpp | 156 ---
contrib/libosmium/osmium/handler.hpp | 94 --
contrib/libosmium/osmium/handler/chain.hpp | 128 ---
contrib/libosmium/osmium/handler/disk_store.hpp | 111 --
contrib/libosmium/osmium/handler/dump.hpp | 294 ------
.../osmium/handler/node_locations_for_ways.hpp | 180 ----
.../libosmium/osmium/handler/object_relations.hpp | 106 --
contrib/libosmium/osmium/index/bool_vector.hpp | 85 --
.../osmium/index/detail/create_map_with_fd.hpp | 71 --
.../osmium/index/detail/mmap_vector_anon.hpp | 67 --
.../osmium/index/detail/mmap_vector_base.hpp | 180 ----
.../osmium/index/detail/mmap_vector_file.hpp | 74 --
contrib/libosmium/osmium/index/detail/tmpfile.hpp | 62 --
.../libosmium/osmium/index/detail/vector_map.hpp | 246 -----
.../osmium/index/detail/vector_multimap.hpp | 186 ----
contrib/libosmium/osmium/index/index.hpp | 100 --
contrib/libosmium/osmium/index/map.hpp | 275 -----
contrib/libosmium/osmium/index/map/all.hpp | 46 -
.../osmium/index/map/dense_file_array.hpp | 67 --
.../libosmium/osmium/index/map/dense_mem_array.hpp | 57 --
.../osmium/index/map/dense_mmap_array.hpp | 60 --
contrib/libosmium/osmium/index/map/dummy.hpp | 88 --
.../osmium/index/map/sparse_file_array.hpp | 67 --
.../osmium/index/map/sparse_mem_array.hpp | 60 --
.../libosmium/osmium/index/map/sparse_mem_map.hpp | 116 ---
.../osmium/index/map/sparse_mem_table.hpp | 147 ---
.../osmium/index/map/sparse_mmap_array.hpp | 60 --
contrib/libosmium/osmium/index/multimap.hpp | 127 ---
contrib/libosmium/osmium/index/multimap/all.hpp | 41 -
contrib/libosmium/osmium/index/multimap/hybrid.hpp | 204 ----
.../osmium/index/multimap/sparse_file_array.hpp | 54 -
.../osmium/index/multimap/sparse_mem_array.hpp | 58 --
.../osmium/index/multimap/sparse_mem_multimap.hpp | 151 ---
.../osmium/index/multimap/sparse_mmap_array.hpp | 58 --
.../libosmium/osmium/index/node_locations_map.hpp | 70 --
contrib/libosmium/osmium/io/any_compression.hpp | 48 -
contrib/libosmium/osmium/io/any_input.hpp | 52 -
contrib/libosmium/osmium/io/any_output.hpp | 53 -
contrib/libosmium/osmium/io/bzip2_compression.hpp | 321 ------
contrib/libosmium/osmium/io/compression.hpp | 321 ------
contrib/libosmium/osmium/io/debug_output.hpp | 39 -
.../osmium/io/detail/debug_output_format.hpp | 485 ---------
.../libosmium/osmium/io/detail/input_format.hpp | 211 ----
.../osmium/io/detail/o5m_input_format.hpp | 633 ------------
.../osmium/io/detail/opl_output_format.hpp | 261 -----
.../libosmium/osmium/io/detail/output_format.hpp | 184 ----
contrib/libosmium/osmium/io/detail/pbf.hpp | 89 --
contrib/libosmium/osmium/io/detail/pbf_decoder.hpp | 777 --------------
.../osmium/io/detail/pbf_input_format.hpp | 242 -----
.../osmium/io/detail/pbf_output_format.hpp | 643 ------------
.../libosmium/osmium/io/detail/protobuf_tags.hpp | 170 ----
contrib/libosmium/osmium/io/detail/queue_util.hpp | 157 ---
contrib/libosmium/osmium/io/detail/read_thread.hpp | 133 ---
contrib/libosmium/osmium/io/detail/read_write.hpp | 180 ----
.../libosmium/osmium/io/detail/string_table.hpp | 265 -----
contrib/libosmium/osmium/io/detail/string_util.hpp | 206 ----
.../libosmium/osmium/io/detail/write_thread.hpp | 107 --
.../osmium/io/detail/xml_input_format.hpp | 679 -------------
.../osmium/io/detail/xml_output_format.hpp | 473 ---------
contrib/libosmium/osmium/io/detail/zlib.hpp | 115 ---
contrib/libosmium/osmium/io/error.hpp | 70 --
contrib/libosmium/osmium/io/file.hpp | 328 ------
contrib/libosmium/osmium/io/file_compression.hpp | 72 --
contrib/libosmium/osmium/io/file_format.hpp | 84 --
contrib/libosmium/osmium/io/gzip_compression.hpp | 277 -----
contrib/libosmium/osmium/io/header.hpp | 122 ---
contrib/libosmium/osmium/io/input_iterator.hpp | 178 ----
contrib/libosmium/osmium/io/o5m_input.hpp | 45 -
contrib/libosmium/osmium/io/opl_output.hpp | 39 -
contrib/libosmium/osmium/io/output_iterator.hpp | 133 ---
contrib/libosmium/osmium/io/overwrite.hpp | 39 -
contrib/libosmium/osmium/io/pbf_input.hpp | 48 -
contrib/libosmium/osmium/io/pbf_output.hpp | 48 -
contrib/libosmium/osmium/io/reader.hpp | 380 -------
contrib/libosmium/osmium/io/reader_iterator.hpp | 51 -
contrib/libosmium/osmium/io/writer.hpp | 344 -------
contrib/libosmium/osmium/io/writer_options.hpp | 60 --
contrib/libosmium/osmium/io/xml_input.hpp | 48 -
contrib/libosmium/osmium/io/xml_output.hpp | 47 -
contrib/libosmium/osmium/memory/buffer.hpp | 617 -----------
contrib/libosmium/osmium/memory/collection.hpp | 153 ---
contrib/libosmium/osmium/memory/item.hpp | 177 ----
contrib/libosmium/osmium/memory/item_iterator.hpp | 234 -----
.../libosmium/osmium/object_pointer_collection.hpp | 112 --
contrib/libosmium/osmium/osm.hpp | 48 -
contrib/libosmium/osmium/osm/area.hpp | 215 ----
contrib/libosmium/osmium/osm/box.hpp | 250 -----
contrib/libosmium/osmium/osm/changeset.hpp | 458 ---------
contrib/libosmium/osmium/osm/crc.hpp | 242 -----
contrib/libosmium/osmium/osm/diff_object.hpp | 180 ----
contrib/libosmium/osmium/osm/entity.hpp | 80 --
contrib/libosmium/osmium/osm/entity_bits.hpp | 105 --
contrib/libosmium/osmium/osm/item_type.hpp | 200 ----
contrib/libosmium/osmium/osm/location.hpp | 285 ------
contrib/libosmium/osmium/osm/node.hpp | 76 --
contrib/libosmium/osmium/osm/node_ref.hpp | 173 ----
contrib/libosmium/osmium/osm/node_ref_list.hpp | 184 ----
contrib/libosmium/osmium/osm/object.hpp | 438 --------
.../libosmium/osmium/osm/object_comparisons.hpp | 110 --
contrib/libosmium/osmium/osm/relation.hpp | 194 ----
contrib/libosmium/osmium/osm/segment.hpp | 105 --
contrib/libosmium/osmium/osm/tag.hpp | 140 ---
contrib/libosmium/osmium/osm/timestamp.hpp | 193 ----
contrib/libosmium/osmium/osm/types.hpp | 66 --
contrib/libosmium/osmium/osm/types_from_string.hpp | 122 ---
.../libosmium/osmium/osm/undirected_segment.hpp | 100 --
contrib/libosmium/osmium/osm/way.hpp | 117 ---
contrib/libosmium/osmium/relations/collector.hpp | 544 ----------
.../osmium/relations/detail/member_meta.hpp | 158 ---
.../osmium/relations/detail/relation_meta.hpp | 136 ---
contrib/libosmium/osmium/tags/filter.hpp | 162 ---
contrib/libosmium/osmium/tags/regex_filter.hpp | 58 --
contrib/libosmium/osmium/tags/taglist.hpp | 67 --
.../libosmium/osmium/thread/function_wrapper.hpp | 123 ---
contrib/libosmium/osmium/thread/pool.hpp | 190 ----
contrib/libosmium/osmium/thread/queue.hpp | 192 ----
contrib/libosmium/osmium/thread/sorted_queue.hpp | 159 ---
contrib/libosmium/osmium/thread/util.hpp | 116 ---
contrib/libosmium/osmium/util/cast.hpp | 103 --
contrib/libosmium/osmium/util/compatibility.hpp | 56 -
contrib/libosmium/osmium/util/config.hpp | 72 --
contrib/libosmium/osmium/util/data_file.hpp | 194 ----
contrib/libosmium/osmium/util/delta.hpp | 174 ----
contrib/libosmium/osmium/util/double.hpp | 93 --
contrib/libosmium/osmium/util/endian.hpp | 45 -
contrib/libosmium/osmium/util/file.hpp | 121 ---
contrib/libosmium/osmium/util/memory_mapping.hpp | 757 --------------
contrib/libosmium/osmium/util/minmax.hpp | 120 ---
contrib/libosmium/osmium/util/options.hpp | 165 ---
contrib/libosmium/osmium/util/string.hpp | 102 --
contrib/libosmium/osmium/util/verbose_output.hpp | 139 ---
contrib/libosmium/osmium/visitor.hpp | 258 -----
contrib/libosmium/protozero/byteswap.hpp | 69 --
contrib/libosmium/protozero/exception.hpp | 68 --
contrib/libosmium/protozero/pbf_builder.hpp | 137 ---
contrib/libosmium/protozero/pbf_message.hpp | 94 --
contrib/libosmium/protozero/pbf_reader.hpp | 1067 --------------------
contrib/libosmium/protozero/pbf_types.hpp | 49 -
contrib/libosmium/protozero/pbf_writer.hpp | 666 ------------
contrib/libosmium/protozero/varint.hpp | 132 ---
contrib/libosmium/protozero/version.hpp | 22 -
175 files changed, 31132 deletions(-)
diff --git a/contrib/libosmium/LICENSE.txt b/contrib/libosmium/LICENSE.txt
deleted file mode 100644
index 36b7cd9..0000000
--- a/contrib/libosmium/LICENSE.txt
+++ /dev/null
@@ -1,23 +0,0 @@
-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.
diff --git a/contrib/libosmium/README.contrib b/contrib/libosmium/README.contrib
deleted file mode 100644
index d6011be..0000000
--- a/contrib/libosmium/README.contrib
+++ /dev/null
@@ -1,2 +0,0 @@
-Source: https://github.com/osmcode/libosmium
-Revision: v2.5.1
diff --git a/contrib/libosmium/README.md b/contrib/libosmium/README.md
deleted file mode 100644
index 9ac5a70..0000000
--- a/contrib/libosmium/README.md
+++ /dev/null
@@ -1,108 +0,0 @@
-# Libosmium
-
-http://osmcode.org/libosmium
-
-A fast and flexible C++ library for working with OpenStreetMap data.
-
-[](https://travis-ci.org/osmcode/libosmium)
-[](https://ci.appveyor.com/project/Mapbox/libosmium)
-
-Libosmium is developed on Linux, but also works on OSX and Windows (with some
-limitations).
-
-There are a few applications that use the Osmium library in the examples
-directory. See the [osmium-contrib](http://github.com/osmcode/osmium-contrib)
-repository for more example code.
-
-## Prerequisites
-
-Because Libosmium uses many C++11 features you need a modern compiler and
-standard C++ library. Osmium needs at least GCC 4.8 or clang (LLVM) 3.4.
-(Some parts may work with older versions.)
-
-Different parts of Libosmium (and the applications built on top of it) need
-different libraries. You DO NOT NEED to install all of them, just install those
-you need for your programs.
-
-For details see the
-[list of dependencies](https://github.com/osmcode/libosmium/wiki/Libosmium-dependencies).
-
-The [protozero](https://github.com/mapbox/protozero) and
-[utf8-cpp](http://utfcpp.sourceforge.net/) header-only libraries are included
-in the libosmium repository.
-
-
-## Directories
-
-* benchmarks: Some benchmarks checking different parts of Libosmium.
-
-* cmake: CMake configuration scripts.
-
-* doc: Config for documentation.
-
-* examples: Osmium example applications.
-
-* include: C/C++ include files. All of Libosmium is in those header files
- which are needed for building Osmium applications.
-
-* test: Tests (see below).
-
-
-## Building
-
-Osmium is a header-only library, so there is nothing to build for the
-library itself.
-
-But there are some tests and examples that can be build. Libosmium uses
-cmake:
-
- mkdir build
- cd build
- cmake ..
- make
-
-This will build the examples and tests. Call `ctest` to run the tests.
-
-For more see the
-[Libosmium Wiki](https://github.com/osmcode/libosmium/wiki/Building-Libosmium).
-
-
-## Testing
-
-See the
-[Libosmium Wiki](https://github.com/osmcode/libosmium/wiki/Testing-Libosmium)
-for instructions.
-
-
-## Osmium on 32bit Machines
-
-Osmium works well on 64 bit machines, but on 32 bit machines there are some
-problems. Be aware that not everything will work on 32 bit architectures.
-This is mostly due to the 64 bit needed for node IDs. Also Osmium hasn't been
-tested well on 32 bit systems. Here are some issues you might run into:
-
-* Google Sparsehash does not work on 32 bit machines in our use case.
-* The `mmap` system call is called with a `size_t` argument, so it can't
- give you more than 4GByte of memory on 32 bit systems. This might be a
- problem.
-
-Please report any issues you have and we might be able to solve them.
-
-
-## Switching from the old Osmium
-
-If you have been using the old version of Osmium at
-https://github.com/joto/osmium you might want to read about the
-[changes needed](https://github.com/osmcode/libosmium/wiki/Changes-from-old-versions-of-Osmium).
-
-
-## License
-
-Libosmium is available under the Boost Software License. See LICENSE.txt.
-
-
-## Authors
-
-Libosmium was mainly written and is maintained by Jochen Topf
-(jochen at topf.org). See the git commit log for other authors.
-
diff --git a/contrib/libosmium/osmium/area/assembler.hpp b/contrib/libosmium/osmium/area/assembler.hpp
deleted file mode 100644
index 87feea2..0000000
--- a/contrib/libosmium/osmium/area/assembler.hpp
+++ /dev/null
@@ -1,787 +0,0 @@
-#ifndef OSMIUM_AREA_ASSEMBLER_HPP
-#define OSMIUM_AREA_ASSEMBLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cstring>
-#include <iostream>
-#include <iterator>
-#include <list>
-#include <set>
-#include <string>
-#include <map>
-#include <vector>
-
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/tags/filter.hpp>
-
-#include <osmium/area/detail/proto_ring.hpp>
-#include <osmium/area/detail/node_ref_segment.hpp>
-#include <osmium/area/detail/segment_list.hpp>
-#include <osmium/area/problem_reporter.hpp>
-
-namespace osmium {
-
- namespace area {
-
- using osmium::area::detail::ProtoRing;
-
- struct AssemblerConfig {
-
- osmium::area::ProblemReporter* problem_reporter;
-
- // Enables debug output to stderr
- bool debug;
-
- explicit AssemblerConfig(osmium::area::ProblemReporter* pr = nullptr, bool d = false) :
- problem_reporter(pr),
- debug(d) {
- }
-
- /**
- * Enable or disable debug output to stderr. This is for Osmium
- * developers only.
- */
- void enable_debug_output(bool d = true) {
- debug = d;
- }
-
- }; // struct AssemblerConfig
-
- /**
- * Assembles area objects from multipolygon relations and their
- * members. This is called by the MultipolygonCollector object
- * after all members have been collected.
- */
- class Assembler {
-
- const AssemblerConfig m_config;
-
- // The way segments
- osmium::area::detail::SegmentList m_segment_list;
-
- // The rings we are building from the way segments
- std::list<ProtoRing> m_rings;
-
- std::vector<ProtoRing*> m_outer_rings;
- std::vector<ProtoRing*> m_inner_rings;
-
- int m_inner_outer_mismatches { 0 };
-
- bool debug() const {
- return m_config.debug;
- }
-
- /**
- * Checks whether the given NodeRefs have the same location.
- * Uses the actual location for the test, not the id. If both
- * have the same location, but not the same id, a problem
- * point will be added to the list of problem points.
- */
- bool has_same_location(const osmium::NodeRef& nr1, const osmium::NodeRef& nr2) {
- if (nr1.location() != nr2.location()) {
- return false;
- }
- if (nr1.ref() != nr2.ref()) {
- if (m_config.problem_reporter) {
- m_config.problem_reporter->report_duplicate_node(nr1.ref(), nr2.ref(), nr1.location());
- }
- }
- return true;
- }
-
- void add_tags_to_area(osmium::builder::AreaBuilder& builder, const osmium::Way& way) const {
- osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
- for (const osmium::Tag& tag : way.tags()) {
- tl_builder.add_tag(tag.key(), tag.value());
- }
- }
-
- void add_common_tags(osmium::builder::TagListBuilder& tl_builder, std::set<const osmium::Way*>& ways) const {
- std::map<std::string, size_t> counter;
- for (const osmium::Way* way : ways) {
- for (const auto& tag : way->tags()) {
- std::string kv {tag.key()};
- kv.append(1, '\0');
- kv.append(tag.value());
- ++counter[kv];
- }
- }
-
- size_t num_ways = ways.size();
- for (const auto& t_c : counter) {
- if (debug()) {
- std::cerr << " tag " << t_c.first << " is used " << t_c.second << " times in " << num_ways << " ways\n";
- }
- if (t_c.second == num_ways) {
- size_t len = std::strlen(t_c.first.c_str());
- tl_builder.add_tag(t_c.first.c_str(), t_c.first.c_str() + len + 1);
- }
- }
- }
-
- struct MPFilter : public osmium::tags::KeyFilter {
-
- MPFilter() : osmium::tags::KeyFilter(true) {
- add(false, "type");
- add(false, "created_by");
- add(false, "source");
- add(false, "note");
- add(false, "test:id");
- add(false, "test:section");
- }
-
- }; // struct MPFilter
-
- static MPFilter& filter() {
- static MPFilter filter;
- return filter;
- }
-
- void add_tags_to_area(osmium::builder::AreaBuilder& builder, const osmium::Relation& relation) const {
- const auto count = std::count_if(relation.tags().begin(), relation.tags().end(), filter());
-
- if (debug()) {
- std::cerr << " found " << count << " tags on relation (without ignored ones)\n";
- }
-
- if (count > 0) {
- if (debug()) {
- std::cerr << " use tags from relation\n";
- }
-
- // write out all tags except type=*
- osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
- for (const osmium::Tag& tag : relation.tags()) {
- if (strcmp(tag.key(), "type")) {
- tl_builder.add_tag(tag.key(), tag.value());
- }
- }
- } else {
- if (debug()) {
- std::cerr << " use tags from outer ways\n";
- }
- std::set<const osmium::Way*> ways;
- for (const auto& ring : m_outer_rings) {
- ring->get_ways(ways);
- }
- if (ways.size() == 1) {
- if (debug()) {
- std::cerr << " only one outer way\n";
- }
- osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
- for (const osmium::Tag& tag : (*ways.begin())->tags()) {
- tl_builder.add_tag(tag.key(), tag.value());
- }
- } else {
- if (debug()) {
- std::cerr << " multiple outer ways, get common tags\n";
- }
- osmium::builder::TagListBuilder tl_builder(builder.buffer(), &builder);
- add_common_tags(tl_builder, ways);
- }
- }
- }
-
- /**
- * Go through all the rings and find rings that are not closed.
- * Problems are reported through the problem reporter.
- *
- * @returns true if any rings were not closed, false otherwise
- */
- bool check_for_open_rings() {
- bool open_rings = false;
-
- for (const auto& ring : m_rings) {
- if (!ring.closed()) {
- open_rings = true;
- if (m_config.problem_reporter) {
- m_config.problem_reporter->report_ring_not_closed(ring.get_segment_front().first().location(), ring.get_segment_back().second().location());
- }
- }
- }
-
- return open_rings;
- }
-
- /**
- * Check whether there are any rings that can be combined with the
- * given ring to one larger ring by appending the other ring to
- * the end of this ring.
- * If the rings can be combined they are and the function returns
- * true.
- */
- bool possibly_combine_rings_back(ProtoRing& ring) {
- const osmium::NodeRef& nr = ring.get_segment_back().second();
-
- if (debug()) {
- std::cerr << " possibly_combine_rings_back()\n";
- }
- for (auto it = m_rings.begin(); it != m_rings.end(); ++it) {
- if (&*it != &ring && !it->closed()) {
- if (has_same_location(nr, it->get_segment_front().first())) {
- if (debug()) {
- std::cerr << " ring.last=it->first\n";
- }
- ring.merge_ring(*it, debug());
- m_rings.erase(it);
- return true;
- }
- if (has_same_location(nr, it->get_segment_back().second())) {
- if (debug()) {
- std::cerr << " ring.last=it->last\n";
- }
- ring.merge_ring_reverse(*it, debug());
- m_rings.erase(it);
- return true;
- }
- }
- }
- return false;
- }
-
- /**
- * Check whether there are any rings that can be combined with the
- * given ring to one larger ring by prepending the other ring to
- * the start of this ring.
- * If the rings can be combined they are and the function returns
- * true.
- */
- bool possibly_combine_rings_front(ProtoRing& ring) {
- const osmium::NodeRef& nr = ring.get_segment_front().first();
-
- if (debug()) {
- std::cerr << " possibly_combine_rings_front()\n";
- }
- for (auto it = m_rings.begin(); it != m_rings.end(); ++it) {
- if (&*it != &ring && !it->closed()) {
- if (has_same_location(nr, it->get_segment_back().second())) {
- if (debug()) {
- std::cerr << " ring.first=it->last\n";
- }
- ring.swap_segments(*it);
- ring.merge_ring(*it, debug());
- m_rings.erase(it);
- return true;
- }
- if (has_same_location(nr, it->get_segment_front().first())) {
- if (debug()) {
- std::cerr << " ring.first=it->first\n";
- }
- ring.reverse();
- ring.merge_ring(*it, debug());
- m_rings.erase(it);
- return true;
- }
- }
- }
- return false;
- }
-
- void split_off_subring(osmium::area::detail::ProtoRing& ring, osmium::area::detail::ProtoRing::segments_type::iterator it, osmium::area::detail::ProtoRing::segments_type::iterator it_begin, osmium::area::detail::ProtoRing::segments_type::iterator it_end) {
- if (debug()) {
- std::cerr << " subring found at: " << *it << "\n";
- }
- ProtoRing new_ring(it_begin, it_end);
- ring.remove_segments(it_begin, it_end);
- if (debug()) {
- std::cerr << " split into two rings:\n";
- std::cerr << " " << new_ring << "\n";
- std::cerr << " " << ring << "\n";
- }
- m_rings.push_back(std::move(new_ring));
- }
-
- bool has_closed_subring_back(ProtoRing& ring, const NodeRef& nr) {
- if (ring.segments().size() < 3) {
- return false;
- }
- if (debug()) {
- std::cerr << " has_closed_subring_back()\n";
- }
- const auto end = ring.segments().end();
- for (auto it = ring.segments().begin() + 1; it != end - 1; ++it) {
- if (has_same_location(nr, it->first())) {
- split_off_subring(ring, it, it, end);
- return true;
- }
- }
- return false;
- }
-
- bool has_closed_subring_front(ProtoRing& ring, const NodeRef& nr) {
- if (ring.segments().size() < 3) {
- return false;
- }
- if (debug()) {
- std::cerr << " has_closed_subring_front()\n";
- }
- const auto end = ring.segments().end();
- for (auto it = ring.segments().begin() + 1; it != end - 1; ++it) {
- if (has_same_location(nr, it->second())) {
- split_off_subring(ring, it, ring.segments().begin(), it+1);
- return true;
- }
- }
- return false;
- }
-
- bool check_for_closed_subring(ProtoRing& ring) {
- if (debug()) {
- std::cerr << " check_for_closed_subring()\n";
- }
-
- osmium::area::detail::ProtoRing::segments_type segments(ring.segments().size());
- std::copy(ring.segments().begin(), ring.segments().end(), segments.begin());
- std::sort(segments.begin(), segments.end());
- const auto it = std::adjacent_find(segments.begin(), segments.end(), [this](const osmium::area::detail::NodeRefSegment& s1, const osmium::area::detail::NodeRefSegment& s2) {
- return has_same_location(s1.first(), s2.first());
- });
- if (it == segments.end()) {
- return false;
- }
- const auto r1 = std::find_first_of(ring.segments().begin(), ring.segments().end(), it, it+1);
- assert(r1 != ring.segments().end());
- const auto r2 = std::find_first_of(ring.segments().begin(), ring.segments().end(), it+1, it+2);
- assert(r2 != ring.segments().end());
-
- if (debug()) {
- std::cerr << " found subring in ring " << ring << " at " << it->first() << "\n";
- }
-
- const auto m = std::minmax(r1, r2);
-
- ProtoRing new_ring(m.first, m.second);
- ring.remove_segments(m.first, m.second);
-
- if (debug()) {
- std::cerr << " split ring1=" << new_ring << "\n";
- std::cerr << " split ring2=" << ring << "\n";
- }
-
- m_rings.emplace_back(new_ring);
-
- return true;
- }
-
- void combine_rings_front(const osmium::area::detail::NodeRefSegment& segment, ProtoRing& ring) {
- if (debug()) {
- std::cerr << " => match at front of ring\n";
- }
- ring.add_segment_front(segment);
- has_closed_subring_front(ring, segment.first());
- if (possibly_combine_rings_front(ring)) {
- check_for_closed_subring(ring);
- }
- }
-
- void combine_rings_back(const osmium::area::detail::NodeRefSegment& segment, ProtoRing& ring) {
- if (debug()) {
- std::cerr << " => match at back of ring\n";
- }
- ring.add_segment_back(segment);
- has_closed_subring_back(ring, segment.second());
- if (possibly_combine_rings_back(ring)) {
- check_for_closed_subring(ring);
- }
- }
-
- /**
- * Append each outer ring together with its inner rings to the
- * area in the buffer.
- */
- void add_rings_to_area(osmium::builder::AreaBuilder& builder) const {
- for (const ProtoRing* ring : m_outer_rings) {
- if (debug()) {
- std::cerr << " ring " << *ring << " is outer\n";
- }
- {
- osmium::builder::OuterRingBuilder ring_builder(builder.buffer(), &builder);
- ring_builder.add_node_ref(ring->get_segment_front().first());
- for (const auto& segment : ring->segments()) {
- ring_builder.add_node_ref(segment.second());
- }
- }
- for (ProtoRing* inner : ring->inner_rings()) {
- osmium::builder::InnerRingBuilder ring_builder(builder.buffer(), &builder);
- ring_builder.add_node_ref(inner->get_segment_front().first());
- for (const auto& segment : inner->segments()) {
- ring_builder.add_node_ref(segment.second());
- }
- }
- }
- }
-
- bool add_to_existing_ring(osmium::area::detail::NodeRefSegment segment) {
- int n = 0;
- for (auto& ring : m_rings) {
- if (debug()) {
- std::cerr << " check against ring " << n << " " << ring;
- }
- if (ring.closed()) {
- if (debug()) {
- std::cerr << " => ring CLOSED\n";
- }
- } else {
- if (has_same_location(ring.get_segment_back().second(), segment.first())) {
- combine_rings_back(segment, ring);
- return true;
- }
- if (has_same_location(ring.get_segment_back().second(), segment.second())) {
- segment.swap_locations();
- combine_rings_back(segment, ring);
- return true;
- }
- if (has_same_location(ring.get_segment_front().first(), segment.first())) {
- segment.swap_locations();
- combine_rings_front(segment, ring);
- return true;
- }
- if (has_same_location(ring.get_segment_front().first(), segment.second())) {
- combine_rings_front(segment, ring);
- return true;
- }
- if (debug()) {
- std::cerr << " => no match\n";
- }
- }
-
- ++n;
- }
- return false;
- }
-
- void check_inner_outer(ProtoRing& ring) {
- const osmium::NodeRef& min_node = ring.min_node();
- if (debug()) {
- std::cerr << " check_inner_outer min_node=" << min_node << "\n";
- }
-
- int count = 0;
- int above = 0;
-
- for (auto it = m_segment_list.begin(); it != m_segment_list.end() && it->first().location().x() <= min_node.location().x(); ++it) {
- if (!ring.contains(*it)) {
- if (debug()) {
- std::cerr << " segments for count: " << *it;
- }
- if (it->to_left_of(min_node.location())) {
- ++count;
- if (debug()) {
- std::cerr << " counted\n";
- }
- } else {
- if (debug()) {
- std::cerr << " not counted\n";
- }
- }
- if (it->first().location() == min_node.location()) {
- if (it->second().location().y() > min_node.location().y()) {
- ++above;
- }
- }
- if (it->second().location() == min_node.location()) {
- if (it->first().location().y() > min_node.location().y()) {
- ++above;
- }
- }
- }
- }
-
- if (debug()) {
- std::cerr << " count=" << count << " above=" << above << "\n";
- }
-
- count += above % 2;
-
- if (count % 2) {
- ring.set_inner();
- }
- }
-
- void check_inner_outer_roles() {
- if (debug()) {
- std::cerr << " check_inner_outer_roles\n";
- }
-
- for (const auto ringptr : m_outer_rings) {
- for (const auto& segment : ringptr->segments()) {
- if (!segment.role_outer()) {
- ++m_inner_outer_mismatches;
- if (debug()) {
- std::cerr << " segment " << segment << " from way " << segment.way()->id() << " should have role 'outer'\n";
- }
- if (m_config.problem_reporter) {
- m_config.problem_reporter->report_role_should_be_outer(segment.way()->id(), segment.first().location(), segment.second().location());
- }
- }
- }
- }
- for (const auto ringptr : m_inner_rings) {
- for (const auto& segment : ringptr->segments()) {
- if (!segment.role_inner()) {
- ++m_inner_outer_mismatches;
- if (debug()) {
- std::cerr << " segment " << segment << " from way " << segment.way()->id() << " should have role 'inner'\n";
- }
- if (m_config.problem_reporter) {
- m_config.problem_reporter->report_role_should_be_inner(segment.way()->id(), segment.first().location(), segment.second().location());
- }
- }
- }
- }
- }
-
- /**
- * Create rings from segments.
- */
- bool create_rings() {
- m_segment_list.sort();
- m_segment_list.erase_duplicate_segments();
-
- // Now we look for segments crossing each other. If there are
- // any, the multipolygon is invalid.
- // In the future this could be improved by trying to fix those
- // cases.
- if (m_segment_list.find_intersections(m_config.problem_reporter)) {
- return false;
- }
-
- // Now iterator over all segments and add them to rings. Each segment
- // is tacked on to either end of an existing ring if possible, or a
- // new ring is started with it.
- for (const auto& segment : m_segment_list) {
- if (debug()) {
- std::cerr << " checking segment " << segment << "\n";
- }
- if (!add_to_existing_ring(segment)) {
- if (debug()) {
- std::cerr << " new ring for segment " << segment << "\n";
- }
- m_rings.emplace_back(segment);
- }
- }
-
- if (debug()) {
- std::cerr << " Rings:\n";
- for (const auto& ring : m_rings) {
- std::cerr << " " << ring;
- if (ring.closed()) {
- std::cerr << " (closed)";
- }
- std::cerr << "\n";
- }
- }
-
- if (check_for_open_rings()) {
- if (debug()) {
- std::cerr << " not all rings are closed\n";
- }
- return false;
- }
-
- if (debug()) {
- std::cerr << " Find inner/outer...\n";
- }
-
- if (m_rings.size() == 1) {
- m_outer_rings.push_back(&m_rings.front());
- } else {
- for (auto& ring : m_rings) {
- check_inner_outer(ring);
- if (ring.outer()) {
- if (!ring.is_cw()) {
- ring.reverse();
- }
- m_outer_rings.push_back(&ring);
- } else {
- if (ring.is_cw()) {
- ring.reverse();
- }
- m_inner_rings.push_back(&ring);
- }
- }
-
- if (m_outer_rings.size() == 1) {
- for (auto inner : m_inner_rings) {
- m_outer_rings.front()->add_inner_ring(inner);
- }
- } else {
- // sort outer rings by size, smallest first
- std::sort(m_outer_rings.begin(), m_outer_rings.end(), [](ProtoRing* a, ProtoRing* b) {
- return a->area() < b->area();
- });
- for (auto inner : m_inner_rings) {
- for (auto outer : m_outer_rings) {
- if (inner->is_in(outer)) {
- outer->add_inner_ring(inner);
- break;
- }
- }
- }
- }
- }
-
- check_inner_outer_roles();
-
- return true;
- }
-
- public:
-
- typedef osmium::area::AssemblerConfig config_type;
-
- explicit Assembler(const config_type& config) :
- m_config(config),
- m_segment_list(config.debug) {
- }
-
- ~Assembler() = default;
-
- /**
- * Assemble an area from the given way.
- * The resulting area is put into the out_buffer.
- */
- void operator()(const osmium::Way& way, osmium::memory::Buffer& out_buffer) {
- if (m_config.problem_reporter) {
- m_config.problem_reporter->set_object(osmium::item_type::way, way.id());
- }
-
- if (!way.ends_have_same_id()) {
- if (m_config.problem_reporter) {
- m_config.problem_reporter->report_duplicate_node(way.nodes().front().ref(), way.nodes().back().ref(), way.nodes().front().location());
- }
- }
-
- m_segment_list.extract_segments_from_way(way, "outer");
-
- if (debug()) {
- std::cerr << "\nBuild way id()=" << way.id() << " segments.size()=" << m_segment_list.size() << "\n";
- }
-
- // Now create the Area object and add the attributes and tags
- // from the relation.
- {
- osmium::builder::AreaBuilder builder(out_buffer);
- builder.initialize_from_object(way);
-
- if (create_rings()) {
- add_tags_to_area(builder, way);
- add_rings_to_area(builder);
- }
- }
- out_buffer.commit();
- }
-
- /**
- * Assemble an area from the given relation and its members.
- * All members are to be found in the in_buffer at the offsets
- * given by the members parameter.
- * The resulting area is put into the out_buffer.
- */
- void operator()(const osmium::Relation& relation, const std::vector<size_t>& members, const osmium::memory::Buffer& in_buffer, osmium::memory::Buffer& out_buffer) {
- if (m_config.problem_reporter) {
- m_config.problem_reporter->set_object(osmium::item_type::relation, relation.id());
- }
-
- m_segment_list.extract_segments_from_ways(relation, members, in_buffer);
-
- if (debug()) {
- std::cerr << "\nBuild relation id()=" << relation.id() << " members.size()=" << members.size() << " segments.size()=" << m_segment_list.size() << "\n";
- }
-
- size_t area_offset = out_buffer.committed();
-
- // Now create the Area object and add the attributes and tags
- // from the relation.
- {
- osmium::builder::AreaBuilder builder(out_buffer);
- builder.initialize_from_object(relation);
-
- if (create_rings()) {
- add_tags_to_area(builder, relation);
- add_rings_to_area(builder);
- }
- }
- out_buffer.commit();
-
- const osmium::TagList& area_tags = out_buffer.get<osmium::Area>(area_offset).tags(); // tags of the area we just built
-
- // Find all closed ways that are inner rings and check their
- // tags. If they are not the same as the tags of the area we
- // just built, add them to a list and later build areas for
- // them, too.
- std::vector<const osmium::Way*> ways_that_should_be_areas;
- if (m_inner_outer_mismatches == 0) {
- auto memit = relation.members().begin();
- for (size_t offset : members) {
- if (!std::strcmp(memit->role(), "inner")) {
- const osmium::Way& way = in_buffer.get<const osmium::Way>(offset);
- if (way.is_closed() && way.tags().size() > 0) {
- auto d = std::count_if(way.tags().begin(), way.tags().end(), filter());
- if (d > 0) {
- osmium::tags::KeyFilter::iterator way_fi_begin(filter(), way.tags().begin(), way.tags().end());
- osmium::tags::KeyFilter::iterator way_fi_end(filter(), way.tags().end(), way.tags().end());
- osmium::tags::KeyFilter::iterator area_fi_begin(filter(), area_tags.begin(), area_tags.end());
- osmium::tags::KeyFilter::iterator area_fi_end(filter(), area_tags.end(), area_tags.end());
-
- if (!std::equal(way_fi_begin, way_fi_end, area_fi_begin) || d != std::distance(area_fi_begin, area_fi_end)) {
- ways_that_should_be_areas.push_back(&way);
- }
- }
- }
- }
- ++memit;
- }
- }
-
- // Now build areas for all ways found in the last step.
- for (const osmium::Way* way : ways_that_should_be_areas) {
- Assembler assembler(m_config);
- assembler(*way, out_buffer);
- }
- }
-
- }; // class Assembler
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_ASSEMBLER_HPP
diff --git a/contrib/libosmium/osmium/area/detail/node_ref_segment.hpp b/contrib/libosmium/osmium/area/detail/node_ref_segment.hpp
deleted file mode 100644
index ec7b035..0000000
--- a/contrib/libosmium/osmium/area/detail/node_ref_segment.hpp
+++ /dev/null
@@ -1,262 +0,0 @@
-#ifndef OSMIUM_AREA_DETAIL_NODE_REF_SEGMENT_HPP
-#define OSMIUM_AREA_DETAIL_NODE_REF_SEGMENT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstdint>
-#include <cstring>
-#include <iosfwd>
-#include <utility>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-
-namespace osmium {
-
- class Way;
-
- namespace area {
-
- /**
- * @brief Namespace for Osmium internal use
- */
- namespace detail {
-
- /**
- * This helper class for the Assembler class models a segment.
- * Segments are the connection between
- * two nodes and they all have their smaller coordinate at the
- * beginning of the segment. Smaller, in this case, means smaller x
- * coordinate, and if they are the same smaller y coordinate.
- */
- class NodeRefSegment {
-
- osmium::NodeRef m_first;
- osmium::NodeRef m_second;
-
- /// Role of the member this segment was from.
- const char* m_role;
-
- /// Way this segment was from.
- const osmium::Way* m_way;
-
- public:
-
- void swap_locations() {
- using std::swap;
- swap(m_first, m_second);
- }
-
- explicit NodeRefSegment() noexcept :
- m_first(),
- m_second(),
- m_role(nullptr),
- m_way(nullptr) {
- }
-
- explicit NodeRefSegment(const osmium::NodeRef& nr1, const osmium::NodeRef& nr2, const char* role, const osmium::Way* way) :
- m_first(nr1),
- m_second(nr2),
- m_role(role),
- m_way(way) {
- if (nr2.location() < nr1.location()) {
- swap_locations();
- }
- }
-
- NodeRefSegment(const NodeRefSegment&) = default;
- NodeRefSegment(NodeRefSegment&&) = default;
-
- NodeRefSegment& operator=(const NodeRefSegment&) = default;
- NodeRefSegment& operator=(NodeRefSegment&&) = default;
-
- ~NodeRefSegment() = default;
-
- /// Return first NodeRef of Segment according to sorting order (bottom left to top right).
- const osmium::NodeRef& first() const noexcept {
- return m_first;
- }
-
- /// Return second NodeRef of Segment according to sorting order (bottom left to top right).
- const osmium::NodeRef& second() const noexcept {
- return m_second;
- }
-
- bool to_left_of(const osmium::Location& location) const {
- // std::cerr << "segment " << first() << "--" << second() << " to_left_of(" << location << "\n";
-
- if (first().location() == location || second().location() == location) {
- return false;
- }
-
- const std::pair<osmium::Location, osmium::Location> mm = std::minmax(first().location(), second().location(), [](const osmium::Location a, const osmium::Location b) {
- return a.y() < b.y();
- });
-
- if (mm.first.y() >= location.y() || mm.second.y() < location.y() || first().location().x() > location.x()) {
- // std::cerr << " false\n";
- return false;
- }
-
- int64_t ax = mm.first.x();
- int64_t bx = mm.second.x();
- int64_t lx = location.x();
- int64_t ay = mm.first.y();
- int64_t by = mm.second.y();
- int64_t ly = location.y();
- return ((bx - ax)*(ly - ay) - (by - ay)*(lx - ax)) <= 0;
- }
-
- bool role_outer() const noexcept {
- return !strcmp(m_role, "outer");
- }
-
- bool role_inner() const noexcept {
- return !strcmp(m_role, "inner");
- }
-
- const osmium::Way* way() const noexcept {
- return m_way;
- }
-
- }; // class NodeRefSegment
-
- /// NodeRefSegments are equal if both their locations are equal
- inline bool operator==(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
- return lhs.first().location() == rhs.first().location() && lhs.second().location() == rhs.second().location();
- }
-
- inline bool operator!=(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
- return ! (lhs == rhs);
- }
-
- /**
- * NodeRefSegments are "smaller" if they are to the left and down of another
- * segment. The first() location is checked first() and only if they have the
- * same first() location the second() location is taken into account.
- */
- inline bool operator<(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
- return (lhs.first().location() == rhs.first().location() && lhs.second().location() < rhs.second().location()) || lhs.first().location() < rhs.first().location();
- }
-
- inline bool operator>(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
- return rhs < lhs;
- }
-
- inline bool operator<=(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
- return ! (rhs < lhs);
- }
-
- inline bool operator>=(const NodeRefSegment& lhs, const NodeRefSegment& rhs) noexcept {
- return ! (lhs < rhs);
- }
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const NodeRefSegment& segment) {
- return out << segment.first() << "--" << segment.second();
- }
-
- inline bool outside_x_range(const NodeRefSegment& s1, const NodeRefSegment& s2) noexcept {
- if (s1.first().location().x() > s2.second().location().x()) {
- return true;
- }
- return false;
- }
-
- inline bool y_range_overlap(const NodeRefSegment& s1, const NodeRefSegment& s2) {
- const std::pair<int32_t, int32_t> m1 = std::minmax(s1.first().location().y(), s1.second().location().y());
- const std::pair<int32_t, int32_t> m2 = std::minmax(s2.first().location().y(), s2.second().location().y());
- if (m1.first > m2.second || m2.first > m1.second) {
- return false;
- }
- return true;
- }
-
- /**
- * Calculate the intersection between to NodeRefSegments. The result is returned
- * as a Location. Note that because the Location uses integers with limited
- * precision internally, the result might be slightly different than the
- * numerically correct location.
- *
- * If the segments touch in one of their endpoints, it doesn't count as an
- * intersection.
- *
- * If the segments intersect not in a single point but in multiple points, ie
- * if they overlap, this is NOT detected.
- *
- * @returns Undefined osmium::Location if there is no intersection or a defined
- * Location if the segments intersect.
- */
- inline osmium::Location calculate_intersection(const NodeRefSegment& s1, const NodeRefSegment& s2) {
- if (s1.first().location() == s2.first().location() ||
- s1.first().location() == s2.second().location() ||
- s1.second().location() == s2.first().location() ||
- s1.second().location() == s2.second().location()) {
- return osmium::Location();
- }
-
- auto d = (static_cast<int64_t>(s2.second().y()) - static_cast<int64_t>(s2.first().y())) *
- (static_cast<int64_t>(s1.second().x()) - static_cast<int64_t>(s1.first().x())) -
- (static_cast<int64_t>(s2.second().x()) - static_cast<int64_t>(s2.first().x())) *
- (static_cast<int64_t>(s1.second().y()) - static_cast<int64_t>(s1.first().y()));
-
- if (d != 0) {
- double denom = ((s2.second().lat() - s2.first().lat())*(s1.second().lon() - s1.first().lon())) -
- ((s2.second().lon() - s2.first().lon())*(s1.second().lat() - s1.first().lat()));
-
- double nume_a = ((s2.second().lon() - s2.first().lon())*(s1.first().lat() - s2.first().lat())) -
- ((s2.second().lat() - s2.first().lat())*(s1.first().lon() - s2.first().lon()));
-
- double nume_b = ((s1.second().lon() - s1.first().lon())*(s1.first().lat() - s2.first().lat())) -
- ((s1.second().lat() - s1.first().lat())*(s1.first().lon() - s2.first().lon()));
-
- if ((denom > 0 && nume_a >= 0 && nume_a <= denom && nume_b >= 0 && nume_b <= denom) ||
- (denom < 0 && nume_a <= 0 && nume_a >= denom && nume_b <= 0 && nume_b >= denom)) {
- double ua = nume_a / denom;
- double ix = s1.first().lon() + ua*(s1.second().lon() - s1.first().lon());
- double iy = s1.first().lat() + ua*(s1.second().lat() - s1.first().lat());
- return osmium::Location(ix, iy);
- }
- }
-
- return osmium::Location();
- }
-
- } // namespace detail
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_DETAIL_NODE_REF_SEGMENT_HPP
diff --git a/contrib/libosmium/osmium/area/detail/proto_ring.hpp b/contrib/libosmium/osmium/area/detail/proto_ring.hpp
deleted file mode 100644
index 162e289..0000000
--- a/contrib/libosmium/osmium/area/detail/proto_ring.hpp
+++ /dev/null
@@ -1,277 +0,0 @@
-#ifndef OSMIUM_AREA_DETAIL_PROTO_RING_HPP
-#define OSMIUM_AREA_DETAIL_PROTO_RING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstdint>
-#include <cstdlib>
-#include <iostream>
-#include <iterator>
-#include <set>
-#include <vector>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/area/detail/node_ref_segment.hpp>
-
-namespace osmium {
-
- namespace area {
-
- namespace detail {
-
- /**
- * A ring in the process of being built by the Assembler object.
- */
- class ProtoRing {
-
- public:
-
- typedef std::vector<NodeRefSegment> segments_type;
-
- private:
-
- // segments in this ring
- segments_type m_segments;
-
- bool m_outer {true};
-
- // if this is an outer ring, these point to it's inner rings (if any)
- std::vector<ProtoRing*> m_inner;
-
- public:
-
- explicit ProtoRing(const NodeRefSegment& segment) noexcept :
- m_segments() {
- add_segment_back(segment);
- }
-
- explicit ProtoRing(segments_type::const_iterator sbegin, segments_type::const_iterator send) :
- m_segments(static_cast<size_t>(std::distance(sbegin, send))) {
- std::copy(sbegin, send, m_segments.begin());
- }
-
- bool outer() const noexcept {
- return m_outer;
- }
-
- void set_inner() noexcept {
- m_outer = false;
- }
-
- segments_type& segments() noexcept {
- return m_segments;
- }
-
- const segments_type& segments() const noexcept {
- return m_segments;
- }
-
- void remove_segments(segments_type::iterator sbegin, segments_type::iterator send) {
- m_segments.erase(sbegin, send);
- }
-
- void add_segment_front(const NodeRefSegment& segment) {
- m_segments.insert(m_segments.begin(), segment);
- }
-
- void add_segment_back(const NodeRefSegment& segment) {
- m_segments.push_back(segment);
- }
-
- const NodeRefSegment& get_segment_front() const {
- return m_segments.front();
- }
-
- NodeRefSegment& get_segment_front() {
- return m_segments.front();
- }
-
- const NodeRefSegment& get_segment_back() const {
- return m_segments.back();
- }
-
- NodeRefSegment& get_segment_back() {
- return m_segments.back();
- }
-
- bool closed() const {
- return m_segments.front().first().location() == m_segments.back().second().location();
- }
-
- int64_t sum() const {
- int64_t sum = 0;
-
- for (const auto& segment : m_segments) {
- sum += static_cast<int64_t>(segment.first().location().x()) * static_cast<int64_t>(segment.second().location().y()) -
- static_cast<int64_t>(segment.second().location().x()) * static_cast<int64_t>(segment.first().location().y());
- }
-
- return sum;
- }
-
- bool is_cw() const {
- return sum() <= 0;
- }
-
- int64_t area() const {
- return std::abs(sum()) / 2;
- }
-
- void swap_segments(ProtoRing& other) {
- using std::swap;
- swap(m_segments, other.m_segments);
- }
-
- void add_inner_ring(ProtoRing* ring) {
- m_inner.push_back(ring);
- }
-
- const std::vector<ProtoRing*>& inner_rings() const {
- return m_inner;
- }
-
- void print(std::ostream& out) const {
- out << "[";
- bool first = true;
- for (const auto& segment : m_segments) {
- if (first) {
- out << segment.first().ref();
- }
- out << ',' << segment.second().ref();
- first = false;
- }
- out << "]";
- }
-
- void reverse() {
- std::for_each(m_segments.begin(), m_segments.end(), [](NodeRefSegment& segment) {
- segment.swap_locations();
- });
- std::reverse(m_segments.begin(), m_segments.end());
- }
-
- /**
- * Merge other ring to end of this ring.
- */
- void merge_ring(const ProtoRing& other, bool debug) {
- if (debug) {
- std::cerr << " MERGE rings ";
- print(std::cerr);
- std::cerr << " to ";
- other.print(std::cerr);
- std::cerr << "\n";
- }
- m_segments.insert(m_segments.end(), other.m_segments.begin(), other.m_segments.end());
- if (debug) {
- std::cerr << " result ring: ";
- print(std::cerr);
- std::cerr << "\n";
- }
- }
-
- void merge_ring_reverse(const ProtoRing& other, bool debug) {
- if (debug) {
- std::cerr << " MERGE rings (reverse) ";
- print(std::cerr);
- std::cerr << " to ";
- other.print(std::cerr);
- std::cerr << "\n";
- }
- size_t n = m_segments.size();
- m_segments.resize(n + other.m_segments.size());
- std::transform(other.m_segments.rbegin(), other.m_segments.rend(), m_segments.begin() + static_cast<segments_type::difference_type>(n), [](NodeRefSegment segment) {
- segment.swap_locations();
- return segment;
- });
- if (debug) {
- std::cerr << " result ring: ";
- print(std::cerr);
- std::cerr << "\n";
- }
- }
-
- const NodeRef& min_node() const {
- auto it = std::min_element(m_segments.begin(), m_segments.end());
- if (location_less()(it->first(), it->second())) {
- return it->first();
- } else {
- return it->second();
- }
- }
-
- bool is_in(ProtoRing* outer) {
- osmium::Location testpoint = segments().front().first().location();
- bool is_in = false;
-
- for (size_t i = 0, j = outer->segments().size()-1; i < outer->segments().size(); j = i++) {
- if (((outer->segments()[i].first().location().y() > testpoint.y()) != (outer->segments()[j].first().location().y() > testpoint.y())) &&
- (testpoint.x() < (outer->segments()[j].first().location().x() - outer->segments()[i].first().location().x()) * (testpoint.y() - outer->segments()[i].first().location().y()) / (outer->segments()[j].first().location().y() - outer->segments()[i].first().location().y()) + outer->segments()[i].first().location().x()) ) {
- is_in = !is_in;
- }
- }
-
- return is_in;
- }
-
- void get_ways(std::set<const osmium::Way*>& ways) {
- for (const auto& segment : m_segments) {
- ways.insert(segment.way());
- }
- }
-
- bool contains(const NodeRefSegment& segment) const {
- for (const auto& s : m_segments) {
- if (s == segment || (s.first() == segment.second() && s.second() == segment.first())) {
- return true;
- }
- }
- return false;
- }
-
- }; // class ProtoRing
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const ProtoRing& ring) {
- ring.print(out);
- return out;
- }
-
- } // namespace detail
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_DETAIL_PROTO_RING_HPP
diff --git a/contrib/libosmium/osmium/area/detail/segment_list.hpp b/contrib/libosmium/osmium/area/detail/segment_list.hpp
deleted file mode 100644
index 289ecf0..0000000
--- a/contrib/libosmium/osmium/area/detail/segment_list.hpp
+++ /dev/null
@@ -1,218 +0,0 @@
-#ifndef OSMIUM_AREA_DETAIL_SEGMENT_LIST_HPP
-#define OSMIUM_AREA_DETAIL_SEGMENT_LIST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <iostream>
-#include <vector>
-
-#include <osmium/area/problem_reporter.hpp>
-#include <osmium/area/detail/node_ref_segment.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
- namespace area {
-
- namespace detail {
-
- /**
- * This is a helper class for the area assembler. It models
- * a list of segments.
- */
- class SegmentList {
-
- typedef std::vector<NodeRefSegment> slist_type;
-
- slist_type m_segments;
-
- bool m_debug;
-
- public:
-
- explicit SegmentList(bool debug) noexcept :
- m_debug(debug) {
- }
-
- ~SegmentList() = default;
-
- SegmentList(const SegmentList&) = delete;
- SegmentList(SegmentList&&) = delete;
-
- SegmentList& operator=(const SegmentList&) = delete;
- SegmentList& operator=(SegmentList&&) = delete;
-
- /// The number of segments in the list.
- size_t size() const noexcept {
- return m_segments.size();
- }
-
- bool empty() const noexcept {
- return m_segments.empty();
- }
-
- typedef slist_type::const_iterator const_iterator;
-
- const_iterator begin() const noexcept {
- return m_segments.begin();
- }
-
- const_iterator end() const noexcept {
- return m_segments.end();
- }
-
- /**
- * Enable or disable debug output to stderr. This is for Osmium
- * developers only.
- */
- void enable_debug_output(bool debug = true) noexcept {
- m_debug = debug;
- }
-
- /// Clear the list of segments. All segments are removed.
- void clear() {
- m_segments.clear();
- }
-
- /// Sort the list of segments.
- void sort() {
- std::sort(m_segments.begin(), m_segments.end());
- }
-
- /**
- * Extract segments from given way and add them to the list.
- *
- * Segments connecting two nodes with the same location (ie same
- * node or different node with same location) are removed.
- *
- * XXX should two nodes with same location be reported?
- */
- void extract_segments_from_way(const osmium::Way& way, const char* role) {
- osmium::NodeRef last_nr;
- for (const osmium::NodeRef& nr : way.nodes()) {
- if (last_nr.location() && last_nr.location() != nr.location()) {
- m_segments.emplace_back(last_nr, nr, role, &way);
- }
- last_nr = nr;
- }
- }
-
- /**
- * Extract all segments from all ways that make up this
- * multipolygon relation and add them to the list.
- */
- void extract_segments_from_ways(const osmium::Relation& relation, const std::vector<size_t>& members, const osmium::memory::Buffer& in_buffer) {
- auto member_it = relation.members().begin();
- for (size_t offset : members) {
- const osmium::Way& way = in_buffer.get<const osmium::Way>(offset);
- extract_segments_from_way(way, member_it->role());
- ++member_it;
- }
- }
-
- /**
- * Find duplicate segments (ie same start and end point) in the
- * list and remove them. This will always remove pairs of the same
- * segment. So if there are three, for instance, two will be
- * removed and one will be left.
- */
- void erase_duplicate_segments() {
- while (true) {
- auto it = std::adjacent_find(m_segments.begin(), m_segments.end());
- if (it == m_segments.end()) {
- return;
- }
- if (m_debug) {
- std::cerr << " erase duplicate segment: " << *it << "\n";
- }
- m_segments.erase(it, it+2);
- }
- }
-
- /**
- * Find intersection between segments.
- *
- * @param problem_reporter Any intersections found are reported to this object.
- * @returns true if there are intersections.
- */
- bool find_intersections(osmium::area::ProblemReporter* problem_reporter) const {
- if (m_segments.empty()) {
- return false;
- }
-
- bool found_intersections = false;
-
- for (auto it1 = m_segments.begin(); it1 != m_segments.end()-1; ++it1) {
- const NodeRefSegment& s1 = *it1;
- for (auto it2 = it1+1; it2 != m_segments.end(); ++it2) {
- const NodeRefSegment& s2 = *it2;
-
- assert(s1 != s2); // erase_duplicate_segments() should have made sure of that
-
- if (outside_x_range(s2, s1)) {
- break;
- }
-
- if (y_range_overlap(s1, s2)) {
- osmium::Location intersection = calculate_intersection(s1, s2);
- if (intersection) {
- found_intersections = true;
- if (m_debug) {
- std::cerr << " segments " << s1 << " and " << s2 << " intersecting at " << intersection << "\n";
- }
- if (problem_reporter) {
- problem_reporter->report_intersection(s1.way()->id(), s1.first().location(), s1.second().location(), s2.way()->id(), s2.first().location(), s2.second().location(), intersection);
- }
- }
- }
- }
- }
-
- return found_intersections;
- }
-
- }; // class SegmentList
-
- } // namespace detail
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_DETAIL_SEGMENT_LIST_HPP
diff --git a/contrib/libosmium/osmium/area/multipolygon_collector.hpp b/contrib/libosmium/osmium/area/multipolygon_collector.hpp
deleted file mode 100644
index c4155db..0000000
--- a/contrib/libosmium/osmium/area/multipolygon_collector.hpp
+++ /dev/null
@@ -1,223 +0,0 @@
-#ifndef OSMIUM_AREA_MULTIPOLYGON_COLLECTOR_HPP
-#define OSMIUM_AREA_MULTIPOLYGON_COLLECTOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstring>
-#include <vector>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/relations/collector.hpp>
-#include <osmium/relations/detail/member_meta.hpp>
-
-namespace osmium {
-
- namespace relations {
- class RelationMeta;
- }
-
- /**
- * @brief Code related to the building of areas (multipolygons) from relations.
- */
- namespace area {
-
- /**
- * This class collects all data needed for creating areas from
- * relations tagged with type=multipolygon or type=boundary.
- * Most of its functionality is derived from the parent class
- * osmium::relations::Collector.
- *
- * The actual assembling of the areas is done by the assembler
- * class given as template argument.
- *
- * @tparam TAssembler Multipolygon Assembler class.
- */
- template <typename TAssembler>
- class MultipolygonCollector : public osmium::relations::Collector<MultipolygonCollector<TAssembler>, false, true, false> {
-
- typedef typename osmium::relations::Collector<MultipolygonCollector<TAssembler>, false, true, false> collector_type;
-
- typedef typename TAssembler::config_type assembler_config_type;
- const assembler_config_type m_assembler_config;
-
- osmium::memory::Buffer m_output_buffer;
-
- static constexpr size_t initial_output_buffer_size = 1024 * 1024;
- static constexpr size_t max_buffer_size_for_flush = 100 * 1024;
-
- void flush_output_buffer() {
- if (this->callback()) {
- osmium::memory::Buffer buffer(initial_output_buffer_size);
- using std::swap;
- swap(buffer, m_output_buffer);
- this->callback()(std::move(buffer));
- }
- }
-
- void possibly_flush_output_buffer() {
- if (m_output_buffer.committed() > max_buffer_size_for_flush) {
- flush_output_buffer();
- }
- }
-
- public:
-
- explicit MultipolygonCollector(const assembler_config_type& assembler_config) :
- collector_type(),
- m_assembler_config(assembler_config),
- m_output_buffer(initial_output_buffer_size, osmium::memory::Buffer::auto_grow::yes) {
- }
-
- /**
- * We are interested in all relations tagged with type=multipolygon
- * or type=boundary.
- *
- * Overwritten from the base class.
- */
- bool keep_relation(const osmium::Relation& relation) const {
- const char* type = relation.tags().get_value_by_key("type");
-
- // ignore relations without "type" tag
- if (!type) {
- return false;
- }
-
- if ((!strcmp(type, "multipolygon")) || (!strcmp(type, "boundary"))) {
- return true;
- }
-
- return false;
- }
-
- /**
- * Overwritten from the base class.
- */
- bool keep_member(const osmium::relations::RelationMeta& /*relation_meta*/, const osmium::RelationMember& member) const {
- // We are only interested in members of type way.
- return member.type() == osmium::item_type::way;
- }
-
- /**
- * This is called when a way is not in any multipolygon
- * relation.
- *
- * Overwritten from the base class.
- */
- void way_not_in_any_relation(const osmium::Way& way) {
- // you need at least 4 nodes to make up a polygon
- if (way.nodes().size() <= 3) {
- return;
- }
- try {
- if (!way.nodes().front().location() || !way.nodes().back().location()) {
- throw osmium::invalid_location("invalid location");
- }
- if (way.ends_have_same_location()) {
- // way is closed and has enough nodes, build simple multipolygon
- TAssembler assembler(m_assembler_config);
- assembler(way, m_output_buffer);
- possibly_flush_output_buffer();
- }
- } catch (osmium::invalid_location&) {
- // XXX ignore
- }
- }
-
- void complete_relation(osmium::relations::RelationMeta& relation_meta) {
- const osmium::Relation& relation = this->get_relation(relation_meta);
- std::vector<size_t> offsets;
- for (const auto& member : relation.members()) {
- if (member.ref() != 0) {
- offsets.push_back(this->get_offset(member.type(), member.ref()));
- }
- }
- try {
- TAssembler assembler(m_assembler_config);
- assembler(relation, offsets, this->members_buffer(), m_output_buffer);
- possibly_flush_output_buffer();
- } catch (osmium::invalid_location&) {
- // XXX ignore
- }
-
- // clear member metas
- for (const auto& member : relation.members()) {
- if (member.ref() != 0) {
- auto& mmv = this->member_meta(member.type());
- auto range = std::equal_range(mmv.begin(), mmv.end(), osmium::relations::MemberMeta(member.ref()));
- assert(range.first != range.second);
-
- // if this is the last time this object was needed
- // then mark it as removed
- if (osmium::relations::count_not_removed(range.first, range.second) == 1) {
- this->get_member(range.first->buffer_offset()).set_removed(true);
- }
-
- for (auto it = range.first; it != range.second; ++it) {
- if (!it->removed() && relation.id() == this->get_relation(it->relation_pos()).id()) {
- it->remove();
- break;
- }
- }
- }
- }
- }
-
- void flush() {
- flush_output_buffer();
- }
-
- osmium::memory::Buffer read() {
- osmium::memory::Buffer buffer(initial_output_buffer_size, osmium::memory::Buffer::auto_grow::yes);
-
- using std::swap;
- swap(buffer, m_output_buffer);
-
- return buffer;
- }
-
- }; // class MultipolygonCollector
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_MULTIPOLYGON_COLLECTOR_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter.hpp b/contrib/libosmium/osmium/area/problem_reporter.hpp
deleted file mode 100644
index 4ae4bb2..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter.hpp
+++ /dev/null
@@ -1,149 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- namespace area {
-
- /**
- * When assembling a multipolygon/area from a multipolygon relation
- * or a closed way several problems can be detected. This includes
- * intersections between lines, wrong role attributes on relation
- * members etc. These problems are reported by the area::Assembler
- * class to the ProblemReporter class or one of its child classes.
- *
- * This is the parent class which does nothing with the reports.
- * Child classes are expected to implement different ways of
- * reporting the problems.
- */
- class ProblemReporter {
-
- protected:
-
- // Type of object we are currently working on
- osmium::item_type m_object_type;
-
- // ID of the relation/way we are currently working on
- osmium::object_id_type m_object_id;
-
- public:
-
- ProblemReporter() = default;
-
- virtual ~ProblemReporter() = default;
-
- /**
- * Set the object the next problem reports will be on.
- *
- * @param object_type The type of the object.
- * @param object_id The ID of the object.
- */
- void set_object(osmium::item_type object_type, osmium::object_id_type object_id) noexcept {
- m_object_type = object_type;
- m_object_id = object_id;
- }
-
-// Disable "unused-parameter" warning, so that the compiler will not complain.
-// We can't remove the parameter names, because then doxygen will complain.
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-parameter"
-
- /**
- * Report a duplicate node, ie. two nodes with the same location.
- *
- * @param node_id1 ID of the first node.
- * @param node_id2 ID of the second node.
- * @param location Location of both nodes.
- */
- virtual void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) {
- }
-
- /**
- * Report an intersection between two segments.
- *
- * @param way1_id ID of the first involved way.
- * @param way1_seg_start Location where the segment of the first way with the intersection starts
- * @param way1_seg_end Location where the segment of the first way with the intersection ends
- * @param way2_id ID of the second involved way.
- * @param way2_seg_start Location where the segment of the second way with the intersection starts
- * @param way2_seg_end Location where the segment of the second way with the intersection ends
- * @param intersection Location of the intersection. This might be slightly off the correct location due to rounding.
- */
- virtual void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
- osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) {
- }
-
- /**
- * Report an open ring.
- *
- * @param end1 Location of the first open end.
- * @param end2 Location of the second open end.
- */
- virtual void report_ring_not_closed(osmium::Location end1, osmium::Location end2) {
- }
-
- /**
- * Report a segment that should have role "outer", but has a different role.
- *
- * @param way_id ID of the way this segment is in.
- * @param seg_start Start of the segment with the wrong role.
- * @param seg_end End of the segment with the wrong role.
- */
- virtual void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) {
- }
-
- /**
- * Report a segment that should have role "inner", but has a different role.
- *
- * @param way_id ID of the way this segment is in.
- * @param seg_start Start of the segment with the wrong role.
- * @param seg_end End of the segment with the wrong role.
- */
- virtual void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) {
- }
-
-#pragma GCC diagnostic pop
-
- }; // class ProblemReporter
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter_exception.hpp b/contrib/libosmium/osmium/area/problem_reporter_exception.hpp
deleted file mode 100644
index 5e743c6..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter_exception.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_EXCEPTION_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_EXCEPTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <sstream>
-#include <stdexcept>
-
-#include <osmium/area/problem_reporter_stream.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- namespace area {
-
- class ProblemReporterException : public ProblemReporterStream {
-
- std::stringstream m_sstream;
-
- public:
-
- ProblemReporterException() :
- ProblemReporterStream(m_sstream) {
- }
-
- virtual ~ProblemReporterException() = default;
-
- void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) override {
- m_sstream.str();
- ProblemReporterStream::report_duplicate_node(node_id1, node_id2, location);
- throw std::runtime_error(m_sstream.str());
- }
-
- void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
- osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) override {
- m_sstream.str();
- ProblemReporterStream::report_intersection(way1_id, way1_seg_start, way1_seg_end, way2_id, way2_seg_start, way2_seg_end, intersection);
- throw std::runtime_error(m_sstream.str());
- }
-
- void report_ring_not_closed(osmium::Location end1, osmium::Location end2) override {
- m_sstream.str();
- ProblemReporterStream::report_ring_not_closed(end1, end2);
- throw std::runtime_error(m_sstream.str());
- }
-
- void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
- m_sstream.str();
- ProblemReporterStream::report_role_should_be_outer(way_id, seg_start, seg_end);
- throw std::runtime_error(m_sstream.str());
- }
-
- void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
- m_sstream.str();
- ProblemReporterStream::report_role_should_be_inner(way_id, seg_start, seg_end);
- throw std::runtime_error(m_sstream.str());
- }
-
- }; // class ProblemReporterException
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_EXCEPTION_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter_ogr.hpp b/contrib/libosmium/osmium/area/problem_reporter_ogr.hpp
deleted file mode 100644
index 5332997..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter_ogr.hpp
+++ /dev/null
@@ -1,139 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_OGR_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_OGR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for reporting problems through OGR when
- * assembling multipolygons.
- *
- * @attention If you include this file, you'll need to link with `libgdal`.
- */
-
-#include <memory>
-
-#include <gdalcpp.hpp>
-
-#include <osmium/area/problem_reporter.hpp>
-#include <osmium/geom/factory.hpp>
-#include <osmium/geom/ogr.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- namespace area {
-
- /**
- * Report problems when assembling areas by adding them to
- * layers in an OGR datasource.
- */
- class ProblemReporterOGR : public ProblemReporter {
-
- osmium::geom::OGRFactory<> m_ogr_factory;
-
- gdalcpp::Layer m_layer_perror;
- gdalcpp::Layer m_layer_lerror;
-
- void write_point(const char* problem_type, osmium::object_id_type id1, osmium::object_id_type id2, osmium::Location location) {
- gdalcpp::Feature feature(m_layer_perror, m_ogr_factory.create_point(location));
- feature.set_field("id1", static_cast<double>(id1));
- feature.set_field("id2", static_cast<double>(id2));
- feature.set_field("problem_type", problem_type);
- feature.add_to_layer();
- }
-
- void write_line(const char* problem_type, osmium::object_id_type id1, osmium::object_id_type id2, osmium::Location loc1, osmium::Location loc2) {
- std::unique_ptr<OGRPoint> ogr_point1 = m_ogr_factory.create_point(loc1);
- std::unique_ptr<OGRPoint> ogr_point2 = m_ogr_factory.create_point(loc2);
- std::unique_ptr<OGRLineString> ogr_linestring = std::unique_ptr<OGRLineString>(new OGRLineString());
- ogr_linestring->addPoint(ogr_point1.get());
- ogr_linestring->addPoint(ogr_point2.get());
-
- gdalcpp::Feature feature(m_layer_lerror, std::move(ogr_linestring));
- feature.set_field("id1", static_cast<double>(id1));
- feature.set_field("id2", static_cast<double>(id2));
- feature.set_field("problem_type", problem_type);
- feature.add_to_layer();
- }
-
- public:
-
- explicit ProblemReporterOGR(gdalcpp::Dataset& dataset) :
- m_layer_perror(dataset, "perrors", wkbPoint),
- m_layer_lerror(dataset, "lerrors", wkbLineString) {
-
- m_layer_perror.add_field("id1", OFTReal, 10);
- m_layer_perror.add_field("id2", OFTReal, 10);
- m_layer_perror.add_field("problem_type", OFTString, 30);
-
- m_layer_lerror.add_field("id1", OFTReal, 10);
- m_layer_lerror.add_field("id2", OFTReal, 10);
- m_layer_lerror.add_field("problem_type", OFTString, 30);
- }
-
- virtual ~ProblemReporterOGR() = default;
-
- void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) override {
- write_point("duplicate_node", node_id1, node_id2, location);
- }
-
- void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
- osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) override {
- write_point("intersection", m_object_id, 0, intersection);
- write_line("intersection", m_object_id, way1_id, way1_seg_start, way1_seg_end);
- write_line("intersection", m_object_id, way2_id, way2_seg_start, way2_seg_end);
- }
-
- void report_ring_not_closed(osmium::Location end1, osmium::Location end2) override {
- write_point("ring_not_closed", m_object_id, 0, end1);
- write_point("ring_not_closed", m_object_id, 0, end2);
- }
-
- void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
- write_line("role_should_be_outer", m_object_id, way_id, seg_start, seg_end);
- }
-
- void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
- write_line("role_should_be_inner", m_object_id, way_id, seg_start, seg_end);
- }
-
- }; // class ProblemReporterOGR
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_OGR_HPP
diff --git a/contrib/libosmium/osmium/area/problem_reporter_stream.hpp b/contrib/libosmium/osmium/area/problem_reporter_stream.hpp
deleted file mode 100644
index ddcb343..0000000
--- a/contrib/libosmium/osmium/area/problem_reporter_stream.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef OSMIUM_AREA_PROBLEM_REPORTER_STREAM_HPP
-#define OSMIUM_AREA_PROBLEM_REPORTER_STREAM_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <ostream>
-
-#include <osmium/area/problem_reporter.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- namespace area {
-
- class ProblemReporterStream : public ProblemReporter {
-
- std::ostream* m_out;
-
- public:
-
- explicit ProblemReporterStream(std::ostream& out) :
- m_out(&out) {
- }
-
- virtual ~ProblemReporterStream() = default;
-
- void header(const char* msg) {
- *m_out << "DATA PROBLEM: " << msg << " on " << item_type_to_char(m_object_type) << m_object_id << ": ";
- }
-
- void report_duplicate_node(osmium::object_id_type node_id1, osmium::object_id_type node_id2, osmium::Location location) override {
- header("duplicate node");
- *m_out << "node_id1=" << node_id1 << " node_id2=" << node_id2 << " location=" << location << "\n";
- }
-
- void report_intersection(osmium::object_id_type way1_id, osmium::Location way1_seg_start, osmium::Location way1_seg_end,
- osmium::object_id_type way2_id, osmium::Location way2_seg_start, osmium::Location way2_seg_end, osmium::Location intersection) override {
- header("intersection");
- *m_out << "way1_id=" << way1_id << " way1_seg_start=" << way1_seg_start << " way1_seg_end=" << way1_seg_end
- << " way2_id=" << way2_id << " way2_seg_start=" << way2_seg_start << " way2_seg_end=" << way2_seg_end << " intersection=" << intersection << "\n";
- }
-
- void report_ring_not_closed(osmium::Location end1, osmium::Location end2) override {
- header("ring not closed");
- *m_out << "end1=" << end1 << " end2=" << end2 << "\n";
- }
-
- void report_role_should_be_outer(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
- header("role should be outer");
- *m_out << "way_id=" << way_id << " seg_start=" << seg_start << " seg_end=" << seg_end << "\n";
- }
-
- void report_role_should_be_inner(osmium::object_id_type way_id, osmium::Location seg_start, osmium::Location seg_end) override {
- header("role should be inner");
- *m_out << "way_id=" << way_id << " seg_start=" << seg_start << " seg_end=" << seg_end << "\n";
- }
-
- }; // class ProblemReporterStream
-
- } // namespace area
-
-} // namespace osmium
-
-#endif // OSMIUM_AREA_PROBLEM_REPORTER_STREAM_HPP
diff --git a/contrib/libosmium/osmium/builder/builder.hpp b/contrib/libosmium/osmium/builder/builder.hpp
deleted file mode 100644
index 63eb4bb..0000000
--- a/contrib/libosmium/osmium/builder/builder.hpp
+++ /dev/null
@@ -1,237 +0,0 @@
-#ifndef OSMIUM_BUILDER_BUILDER_HPP
-#define OSMIUM_BUILDER_BUILDER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <new>
-#include <string>
-#include <type_traits>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
- /**
- * @brief Classes for building OSM objects and other items in buffers
- */
- namespace builder {
-
- class Builder {
-
- osmium::memory::Buffer& m_buffer;
- Builder* m_parent;
- size_t m_item_offset;
-
- Builder(const Builder&) = delete;
- Builder(Builder&&) = delete;
-
- Builder& operator=(const Builder&) = delete;
- Builder& operator=(Builder&&) = delete;
-
- protected:
-
- explicit Builder(osmium::memory::Buffer& buffer, Builder* parent, osmium::memory::item_size_type size) :
- m_buffer(buffer),
- m_parent(parent),
- m_item_offset(buffer.written()) {
- m_buffer.reserve_space(size);
- assert(buffer.is_aligned());
- if (m_parent) {
- m_parent->add_size(size);
- }
- }
-
- ~Builder() = default;
-
- osmium::memory::Item& item() const {
- return *reinterpret_cast<osmium::memory::Item*>(m_buffer.data() + m_item_offset);
- }
-
- public:
-
- /**
- * Add padding to buffer (if needed) to align data properly.
- *
- * This calculates how many padding bytes are needed and adds
- * as many zero bytes to the buffer. It also adds this number
- * to the size of the current item (if the "self" param is
- * true) and recursively to all the parent items.
- *
- * @param self If true add number of padding bytes to size
- * of current item. Size is always added to
- * parent item (if any).
- *
- */
- void add_padding(bool self = false) {
- auto padding = osmium::memory::align_bytes - (size() % osmium::memory::align_bytes);
- if (padding != osmium::memory::align_bytes) {
- std::fill_n(m_buffer.reserve_space(padding), padding, 0);
- if (self) {
- add_size(padding);
- } else if (m_parent) {
- m_parent->add_size(padding);
- assert(m_parent->size() % osmium::memory::align_bytes == 0);
- }
- }
- }
-
- void add_size(uint32_t size) {
- item().add_size(size);
- if (m_parent) {
- m_parent->add_size(size);
- }
- }
-
- uint32_t size() const noexcept {
- return item().byte_size();
- }
-
- void add_item(const osmium::memory::Item* item) {
- unsigned char* target = m_buffer.reserve_space(item->padded_size());
- std::copy_n(reinterpret_cast<const unsigned char*>(item), item->padded_size(), target);
- add_size(item->padded_size());
- }
-
- /**
- * Reserve space for an object of class T in buffer and return
- * pointer to it.
- */
- template <typename T>
- T* reserve_space_for() {
- assert(m_buffer.is_aligned());
- return reinterpret_cast<T*>(m_buffer.reserve_space(sizeof(T)));
- }
-
- /**
- * Append data to buffer.
- *
- * @param data Pointer to data.
- * @param length Length of data in bytes. If data is a
- * \0-terminated string, length must contain the
- * \0 byte.
- * @returns The number of bytes appended (length).
- */
- osmium::memory::item_size_type append(const char* data, const osmium::memory::item_size_type length) {
- unsigned char* target = m_buffer.reserve_space(length);
- std::copy_n(reinterpret_cast<const unsigned char*>(data), length, target);
- return length;
- }
-
- /**
- * Append \0-terminated string to buffer.
- *
- * @param str \0-terminated string.
- * @returns The number of bytes appended (strlen(str) + 1).
- */
- osmium::memory::item_size_type append(const char* str) {
- return append(str, static_cast<osmium::memory::item_size_type>(std::strlen(str) + 1));
- }
-
- /**
- * Append '\0' to the buffer.
- *
- * @returns The number of bytes appended (always 1).
- */
- osmium::memory::item_size_type append_zero() {
- *m_buffer.reserve_space(1) = '\0';
- return 1;
- }
-
- /// Return the buffer this builder is using.
- osmium::memory::Buffer& buffer() noexcept {
- return m_buffer;
- }
-
- }; // class Builder
-
- template <typename TItem>
- class ObjectBuilder : public Builder {
-
- static_assert(std::is_base_of<osmium::memory::Item, TItem>::value, "ObjectBuilder can only build objects derived from osmium::memory::Item");
-
- public:
-
- explicit ObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- Builder(buffer, parent, sizeof(TItem)) {
- new (&item()) TItem();
- }
-
- TItem& object() noexcept {
- return static_cast<TItem&>(item());
- }
-
- /**
- * Add user name to buffer.
- *
- * @param user Pointer to user name.
- * @param length Length of user name (without \0 termination).
- */
- void add_user(const char* user, const string_size_type length) {
- object().set_user_size(length + 1);
- add_size(append(user, length) + append_zero());
- add_padding(true);
- }
-
- /**
- * Add user name to buffer.
- *
- * @param user Pointer to \0-terminated user name.
- */
- void add_user(const char* user) {
- add_user(user, static_cast_with_assert<string_size_type>(std::strlen(user)));
- }
-
- /**
- * Add user name to buffer.
- *
- * @param user User name.
- */
- void add_user(const std::string& user) {
- add_user(user.data(), static_cast_with_assert<string_size_type>(user.size()));
- }
-
- }; // class ObjectBuilder
-
- } // namespace builder
-
-} // namespace osmium
-
-#endif // OSMIUM_BUILDER_BUILDER_HPP
diff --git a/contrib/libosmium/osmium/builder/builder_helper.hpp b/contrib/libosmium/osmium/builder/builder_helper.hpp
deleted file mode 100644
index eebdf33..0000000
--- a/contrib/libosmium/osmium/builder/builder_helper.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef OSMIUM_BUILDER_BUILDER_HELPER_HPP
-#define OSMIUM_BUILDER_BUILDER_HELPER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <initializer_list>
-#include <functional>
-#include <map>
-#include <utility>
-
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/memory/buffer.hpp>
-
-namespace osmium {
-
- class NodeRef;
- class TagList;
- class WayNodeList;
-
- namespace builder {
-
- inline const osmium::WayNodeList& build_way_node_list(osmium::memory::Buffer& buffer, const std::initializer_list<osmium::NodeRef>& nodes) {
- size_t pos = buffer.committed();
- {
- osmium::builder::WayNodeListBuilder wnl_builder(buffer);
- for (const auto& node_ref : nodes) {
- wnl_builder.add_node_ref(node_ref);
- }
- }
- buffer.commit();
- return buffer.get<const osmium::WayNodeList>(pos);
- }
-
- inline const osmium::TagList& build_tag_list(osmium::memory::Buffer& buffer, const std::initializer_list<std::pair<const char*, const char*>>& tags) {
- size_t pos = buffer.committed();
- {
- osmium::builder::TagListBuilder tl_builder(buffer);
- for (const auto& p : tags) {
- tl_builder.add_tag(p.first, p.second);
- }
- }
- buffer.commit();
- return buffer.get<const osmium::TagList>(pos);
- }
-
- inline const osmium::TagList& build_tag_list_from_map(osmium::memory::Buffer& buffer, const std::map<const char*, const char*>& tags) {
- size_t pos = buffer.committed();
- {
- osmium::builder::TagListBuilder tl_builder(buffer);
- for (const auto& p : tags) {
- tl_builder.add_tag(p.first, p.second);
- }
- }
- buffer.commit();
- return buffer.get<const osmium::TagList>(pos);
- }
-
- inline const osmium::TagList& build_tag_list_from_func(osmium::memory::Buffer& buffer, std::function<void(osmium::builder::TagListBuilder&)> func) {
- size_t pos = buffer.committed();
- {
- osmium::builder::TagListBuilder tl_builder(buffer);
- func(tl_builder);
- }
- buffer.commit();
- return buffer.get<const osmium::TagList>(pos);
- }
-
- } // namespace builder
-
-} // namespace osmium
-
-#endif // OSMIUM_BUILDER_BUILDER_HELPER_HPP
diff --git a/contrib/libosmium/osmium/builder/osm_object_builder.hpp b/contrib/libosmium/osmium/builder/osm_object_builder.hpp
deleted file mode 100644
index 6aa43ac..0000000
--- a/contrib/libosmium/osmium/builder/osm_object_builder.hpp
+++ /dev/null
@@ -1,370 +0,0 @@
-#ifndef OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
-#define OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstring>
-#include <initializer_list>
-#include <new>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/builder/builder.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
- namespace memory {
- class Buffer;
- }
-
- namespace builder {
-
- class TagListBuilder : public ObjectBuilder<TagList> {
-
- public:
-
- explicit TagListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- ObjectBuilder<TagList>(buffer, parent) {
- }
-
- ~TagListBuilder() {
- add_padding();
- }
-
- /**
- * Add tag to buffer.
- *
- * @param key Tag key (0-terminated string).
- * @param value Tag value (0-terminated string).
- */
- void add_tag(const char* key, const char* value) {
- if (std::strlen(key) > osmium::max_osm_string_length) {
- throw std::length_error("OSM tag key is too long");
- }
- if (std::strlen(value) > osmium::max_osm_string_length) {
- throw std::length_error("OSM tag value is too long");
- }
- add_size(append(key) + append(value));
- }
-
- /**
- * Add tag to buffer.
- *
- * @param key Pointer to tag key.
- * @param key_length Length of key (not including the \0 byte).
- * @param value Pointer to tag value.
- * @param value_length Length of value (not including the \0 byte).
- */
- void add_tag(const char* key, const size_t key_length, const char* value, const size_t value_length) {
- if (key_length > osmium::max_osm_string_length) {
- throw std::length_error("OSM tag key is too long");
- }
- if (value_length > osmium::max_osm_string_length) {
- throw std::length_error("OSM tag value is too long");
- }
- add_size(append(key, osmium::memory::item_size_type(key_length)) + append_zero() +
- append(value, osmium::memory::item_size_type(value_length)) + append_zero());
- }
-
- /**
- * Add tag to buffer.
- *
- * @param key Tag key.
- * @param value Tag value.
- */
- void add_tag(const std::string& key, const std::string& value) {
- if (key.size() > osmium::max_osm_string_length) {
- throw std::length_error("OSM tag key is too long");
- }
- if (value.size() > osmium::max_osm_string_length) {
- throw std::length_error("OSM tag value is too long");
- }
- add_size(append(key.data(), osmium::memory::item_size_type(key.size()) + 1) +
- append(value.data(), osmium::memory::item_size_type(value.size()) + 1));
- }
-
- }; // class TagListBuilder
-
- template <typename T>
- class NodeRefListBuilder : public ObjectBuilder<T> {
-
- public:
-
- explicit NodeRefListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- ObjectBuilder<T>(buffer, parent) {
- }
-
- ~NodeRefListBuilder() {
- static_cast<Builder*>(this)->add_padding();
- }
-
- void add_node_ref(const NodeRef& node_ref) {
- new (static_cast<Builder*>(this)->reserve_space_for<osmium::NodeRef>()) osmium::NodeRef(node_ref);
- static_cast<Builder*>(this)->add_size(sizeof(osmium::NodeRef));
- }
-
- void add_node_ref(const object_id_type ref, const osmium::Location& location = Location{}) {
- add_node_ref(NodeRef(ref, location));
- }
-
- }; // class NodeRefListBuilder
-
- typedef NodeRefListBuilder<WayNodeList> WayNodeListBuilder;
- typedef NodeRefListBuilder<OuterRing> OuterRingBuilder;
- typedef NodeRefListBuilder<InnerRing> InnerRingBuilder;
-
- class RelationMemberListBuilder : public ObjectBuilder<RelationMemberList> {
-
- /**
- * Add role to buffer.
- *
- * @param member Relation member object where the length of the role
- * will be set.
- * @param role The role.
- * @param length Length of role (without \0 termination).
- * @throws std:length_error If role is longer than osmium::max_osm_string_length
- */
- void add_role(osmium::RelationMember& member, const char* role, const size_t length) {
- if (length > osmium::max_osm_string_length) {
- throw std::length_error("OSM relation member role is too long");
- }
- member.set_role_size(osmium::string_size_type(length) + 1);
- add_size(append(role, osmium::memory::item_size_type(length)) + append_zero());
- add_padding(true);
- }
-
- public:
-
- explicit RelationMemberListBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- ObjectBuilder<RelationMemberList>(buffer, parent) {
- }
-
- ~RelationMemberListBuilder() {
- add_padding();
- }
-
- /**
- * Add a member to the relation.
- *
- * @param type The type (node, way, or relation).
- * @param ref The ID of the member.
- * @param role The role of the member.
- * @param role_length Length of the role (without \0 termination).
- * @param full_member Optional pointer to the member object. If it
- * is available a copy will be added to the
- * relation.
- * @throws std:length_error If role_length is greater than
- * osmium::max_osm_string_length
- */
- void add_member(osmium::item_type type, object_id_type ref, const char* role, const size_t role_length, const osmium::OSMObject* full_member = nullptr) {
- osmium::RelationMember* member = reserve_space_for<osmium::RelationMember>();
- new (member) osmium::RelationMember(ref, type, full_member != nullptr);
- add_size(sizeof(RelationMember));
- add_role(*member, role, role_length);
- if (full_member) {
- add_item(full_member);
- }
- }
-
- /**
- * Add a member to the relation.
- *
- * @param type The type (node, way, or relation).
- * @param ref The ID of the member.
- * @param role The role of the member (\0 terminated string).
- * @param full_member Optional pointer to the member object. If it
- * is available a copy will be added to the
- * relation.
- * @throws std:length_error If role is longer than osmium::max_osm_string_length
- */
- void add_member(osmium::item_type type, object_id_type ref, const char* role, const osmium::OSMObject* full_member = nullptr) {
- add_member(type, ref, role, std::strlen(role), full_member);
- }
-
- /**
- * Add a member to the relation.
- *
- * @param type The type (node, way, or relation).
- * @param ref The ID of the member.
- * @param role The role of the member.
- * @param full_member Optional pointer to the member object. If it
- * is available a copy will be added to the
- * relation.
- * @throws std:length_error If role is longer than osmium::max_osm_string_length
- */
- void add_member(osmium::item_type type, object_id_type ref, const std::string& role, const osmium::OSMObject* full_member = nullptr) {
- add_member(type, ref, role.data(), role.size(), full_member);
- }
-
- }; // class RelationMemberListBuilder
-
- class ChangesetDiscussionBuilder : public ObjectBuilder<ChangesetDiscussion> {
-
- osmium::ChangesetComment* m_comment = nullptr;
-
- void add_user(osmium::ChangesetComment& comment, const char* user, const size_t length) {
- if (length > osmium::max_osm_string_length) {
- throw std::length_error("OSM user name is too long");
- }
- comment.set_user_size(osmium::string_size_type(length) + 1);
- add_size(append(user, osmium::memory::item_size_type(length)) + append_zero());
- }
-
- void add_text(osmium::ChangesetComment& comment, const char* text, const size_t length) {
- // XXX There is no limit on the length of a comment text. We
- // limit it here to 2^16-2 characters, because that's all that
- // will fit into our internal data structure. This is not ideal,
- // and will have to be discussed and cleared up.
- if (length > std::numeric_limits<osmium::string_size_type>::max() - 1) {
- throw std::length_error("OSM changeset comment is too long");
- }
- comment.set_text_size(osmium::string_size_type(length) + 1);
- add_size(append(text, osmium::memory::item_size_type(length)) + append_zero());
- add_padding(true);
- }
-
- public:
-
- explicit ChangesetDiscussionBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- ObjectBuilder<ChangesetDiscussion>(buffer, parent) {
- }
-
- ~ChangesetDiscussionBuilder() {
- assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
- add_padding();
- }
-
- void add_comment(osmium::Timestamp date, osmium::user_id_type uid, const char* user) {
- assert(!m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
- m_comment = reserve_space_for<osmium::ChangesetComment>();
- new (m_comment) osmium::ChangesetComment(date, uid);
- add_size(sizeof(ChangesetComment));
- add_user(*m_comment, user, std::strlen(user));
- }
-
- void add_comment_text(const char* text) {
- assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
- add_text(*m_comment, text, std::strlen(text));
- m_comment = nullptr;
- }
-
- void add_comment_text(const std::string& text) {
- assert(m_comment && "You have to always call both add_comment() and then add_comment_text() in that order for each comment!");
- add_text(*m_comment, text.c_str(), text.size());
- m_comment = nullptr;
- }
-
- }; // class ChangesetDiscussionBuilder
-
- template <typename T>
- class OSMObjectBuilder : public ObjectBuilder<T> {
-
- public:
-
- explicit OSMObjectBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- ObjectBuilder<T>(buffer, parent) {
- static_cast<Builder*>(this)->reserve_space_for<string_size_type>();
- static_cast<Builder*>(this)->add_size(sizeof(string_size_type));
- }
-
- void add_tags(const std::initializer_list<std::pair<const char*, const char*>>& tags) {
- osmium::builder::TagListBuilder tl_builder(static_cast<Builder*>(this)->buffer(), this);
- for (const auto& p : tags) {
- tl_builder.add_tag(p.first, p.second);
- }
- }
-
- }; // class OSMObjectBuilder
-
- typedef OSMObjectBuilder<osmium::Node> NodeBuilder;
- typedef OSMObjectBuilder<osmium::Relation> RelationBuilder;
-
- class WayBuilder : public OSMObjectBuilder<osmium::Way> {
-
- public:
-
- explicit WayBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- OSMObjectBuilder<osmium::Way>(buffer, parent) {
- }
-
- void add_node_refs(const std::initializer_list<osmium::NodeRef>& nodes) {
- osmium::builder::WayNodeListBuilder builder(buffer(), this);
- for (const auto& node_ref : nodes) {
- builder.add_node_ref(node_ref);
- }
- }
-
- }; // class WayBuilder
-
- class AreaBuilder : public OSMObjectBuilder<osmium::Area> {
-
- public:
-
- explicit AreaBuilder(osmium::memory::Buffer& buffer, Builder* parent = nullptr) :
- OSMObjectBuilder<osmium::Area>(buffer, parent) {
- }
-
- /**
- * Initialize area attributes from the attributes of the given object.
- */
- void initialize_from_object(const osmium::OSMObject& source) {
- osmium::Area& area = object();
- area.set_id(osmium::object_id_to_area_id(source.id(), source.type()));
- area.set_version(source.version());
- area.set_changeset(source.changeset());
- area.set_timestamp(source.timestamp());
- area.set_visible(source.visible());
- area.set_uid(source.uid());
-
- add_user(source.user());
- }
-
- }; // class AreaBuilder
-
- typedef ObjectBuilder<osmium::Changeset> ChangesetBuilder;
-
- } // namespace builder
-
-} // namespace osmium
-
-#endif // OSMIUM_BUILDER_OSM_OBJECT_BUILDER_HPP
diff --git a/contrib/libosmium/osmium/diff_handler.hpp b/contrib/libosmium/osmium/diff_handler.hpp
deleted file mode 100644
index 4f9b3a1..0000000
--- a/contrib/libosmium/osmium/diff_handler.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_DIFF_HANDLER_HPP
-#define OSMIUM_DIFF_HANDLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/osm/diff_object.hpp>
-
-namespace osmium {
-
- /**
- * @brief Osmium diff handlers provide access to differences between OSM object versions
- */
- namespace diff_handler {
-
- class DiffHandler {
-
- public:
-
- DiffHandler() {
- }
-
- void node(const osmium::DiffNode&) const {
- }
-
- void way(const osmium::DiffWay&) const {
- }
-
- void relation(const osmium::DiffRelation&) const {
- }
-
- }; // class DiffHandler
-
- } // namespace diff_handler
-
-} // namespace osmium
-
-#endif // OSMIUM_DIFF_HANDLER_HPP
diff --git a/contrib/libosmium/osmium/diff_iterator.hpp b/contrib/libosmium/osmium/diff_iterator.hpp
deleted file mode 100644
index 4ee67f7..0000000
--- a/contrib/libosmium/osmium/diff_iterator.hpp
+++ /dev/null
@@ -1,129 +0,0 @@
-#ifndef OSMIUM_DIFF_ITERATOR_HPP
-#define OSMIUM_DIFF_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iterator>
-#include <type_traits>
-
-#include <osmium/osm/diff_object.hpp>
-
-namespace osmium {
-
- class OSMObject;
-
- template <typename TBasicIterator>
- class DiffIterator : public std::iterator<std::input_iterator_tag, const osmium::DiffObject> {
-
- static_assert(std::is_base_of<osmium::OSMObject, typename TBasicIterator::value_type>::value, "TBasicIterator::value_type must derive from osmium::OSMObject");
-
- TBasicIterator m_prev;
- TBasicIterator m_curr;
- TBasicIterator m_next;
-
- const TBasicIterator m_end;
-
- mutable osmium::DiffObject m_diff;
-
- void set_diff() const {
- assert(m_curr != m_end);
-
- TBasicIterator prev = m_prev;
- if (prev->type() != m_curr->type() || prev->id() != m_curr->id()) {
- prev = m_curr;
- }
-
- TBasicIterator next = m_next;
- if (next == m_end || next->type() != m_curr->type() || next->id() != m_curr->id()) {
- next = m_curr;
- }
-
- m_diff = osmium::DiffObject(*prev, *m_curr, *next);
- }
-
- public:
-
- explicit DiffIterator(TBasicIterator begin, TBasicIterator end) :
- m_prev(begin),
- m_curr(begin),
- m_next(begin == end ? begin : ++begin),
- m_end(end) {
- }
-
- DiffIterator(const DiffIterator&) = default;
- DiffIterator& operator=(const DiffIterator&) = default;
-
- DiffIterator(DiffIterator&&) = default;
- DiffIterator& operator=(DiffIterator&&) = default;
-
- DiffIterator& operator++() {
- m_prev = std::move(m_curr);
- m_curr = m_next;
-
- if (m_next != m_end) {
- ++m_next;
- }
-
- return *this;
- }
-
- DiffIterator operator++(int) {
- DiffIterator tmp(*this);
- operator++();
- return tmp;
- }
-
- bool operator==(const DiffIterator& rhs) const {
- return m_curr == rhs.m_curr && m_end == rhs.m_end;
- }
-
- bool operator!=(const DiffIterator& rhs) const {
- return !(*this == rhs);
- }
-
- reference operator*() const {
- set_diff();
- return m_diff;
- }
-
- pointer operator->() const {
- set_diff();
- return &m_diff;
- }
-
- }; // class DiffIterator
-
-} // namespace osmium
-
-#endif // OSMIUM_DIFF_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/diff_visitor.hpp b/contrib/libosmium/osmium/diff_visitor.hpp
deleted file mode 100644
index e7dc576..0000000
--- a/contrib/libosmium/osmium/diff_visitor.hpp
+++ /dev/null
@@ -1,104 +0,0 @@
-#ifndef OSMIUM_DIFF_VISITOR_HPP
-#define OSMIUM_DIFF_VISITOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/diff_iterator.hpp>
-#include <osmium/io/input_iterator.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/diff_object.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
- namespace detail {
-
- template <typename THandler>
- inline void apply_diff_iterator_recurse(const osmium::DiffObject& diff, THandler& handler) {
- switch (diff.type()) {
- case osmium::item_type::node:
- handler.node(static_cast<const osmium::DiffNode&>(diff));
- break;
- case osmium::item_type::way:
- handler.way(static_cast<const osmium::DiffWay&>(diff));
- break;
- case osmium::item_type::relation:
- handler.relation(static_cast<const osmium::DiffRelation&>(diff));
- break;
- default:
- throw osmium::unknown_type();
- }
- }
-
- template <typename THandler, typename... TRest>
- inline void apply_diff_iterator_recurse(const osmium::DiffObject& diff, THandler& handler, TRest&... more) {
- apply_diff_iterator_recurse(diff, handler);
- apply_diff_iterator_recurse(diff, more...);
- }
-
- } // namespace detail
-
- template <typename TIterator, typename... THandlers>
- inline void apply_diff(TIterator it, TIterator end, THandlers&... handlers) {
- typedef osmium::DiffIterator<TIterator> diff_iterator;
-
- diff_iterator dit(it, end);
- diff_iterator dend(end, end);
-
- for (; dit != dend; ++dit) {
- detail::apply_diff_iterator_recurse(*dit, handlers...);
- }
- }
-
- class OSMObject;
-
- template <typename TSource, typename... THandlers>
- inline void apply_diff(TSource& source, THandlers&... handlers) {
- apply_diff(osmium::io::InputIterator<TSource, osmium::OSMObject> {source},
- osmium::io::InputIterator<TSource, osmium::OSMObject> {},
- handlers...);
- }
-
- template <typename... THandlers>
- inline void apply_diff(osmium::memory::Buffer& buffer, THandlers&... handlers) {
- apply_diff(buffer.begin(), buffer.end(), handlers...);
- }
-
- template <typename... THandlers>
- inline void apply_diff(const osmium::memory::Buffer& buffer, THandlers&... handlers) {
- apply_diff(buffer.cbegin(), buffer.cend(), handlers...);
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_DIFF_VISITOR_HPP
diff --git a/contrib/libosmium/osmium/dynamic_handler.hpp b/contrib/libosmium/osmium/dynamic_handler.hpp
deleted file mode 100644
index 39baba5..0000000
--- a/contrib/libosmium/osmium/dynamic_handler.hpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef OSMIUM_DYNAMIC_HANDLER_HPP
-#define OSMIUM_DYNAMIC_HANDLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <memory>
-#include <utility>
-
-#include <osmium/fwd.hpp>
-#include <osmium/handler.hpp>
-
-namespace osmium {
-
- namespace handler {
-
- namespace detail {
-
- class HandlerWrapperBase {
-
- public:
-
- virtual ~HandlerWrapperBase() {
- }
-
- virtual void node(const osmium::Node&) {
- }
-
- virtual void way(const osmium::Way&) {
- }
-
- virtual void relation(const osmium::Relation&) {
- }
-
- virtual void area(const osmium::Area&) {
- }
-
- virtual void changeset(const osmium::Changeset&) {
- }
-
- virtual void flush() {
- }
-
- }; // class HandlerWrapperBase
-
-
- // The following uses trick from
- // http://stackoverflow.com/questions/257288/is-it-possible-to-write-a-c-template-to-check-for-a-functions-existence
- // to either call handler style functions or visitor style operator().
-
-#define OSMIUM_DYNAMIC_HANDLER_DISPATCH(_name_, _type_) \
-template <typename THandler> \
-auto _name_##_dispatch(THandler& handler, const osmium::_type_& object, int) -> decltype(handler._name_(object), void()) { \
- handler._name_(object); \
-} \
-template <typename THandler> \
-auto _name_##_dispatch(THandler& handler, const osmium::_type_& object, long) -> decltype(handler(object), void()) { \
- handler(object); \
-}
-
- OSMIUM_DYNAMIC_HANDLER_DISPATCH(node, Node)
- OSMIUM_DYNAMIC_HANDLER_DISPATCH(way, Way)
- OSMIUM_DYNAMIC_HANDLER_DISPATCH(relation, Relation)
- OSMIUM_DYNAMIC_HANDLER_DISPATCH(changeset, Changeset)
- OSMIUM_DYNAMIC_HANDLER_DISPATCH(area, Area)
-
- template <typename THandler>
- auto flush_dispatch(THandler& handler, int) -> decltype(handler.flush(), void()) {
- handler.flush();
- }
-
- template <typename THandler>
- void flush_dispatch(THandler&, long) {}
-
- template <typename THandler>
- class HandlerWrapper : public HandlerWrapperBase {
-
- THandler m_handler;
-
- public:
-
- template <typename... TArgs>
- HandlerWrapper(TArgs&&... args) :
- m_handler(std::forward<TArgs>(args)...) {
- }
-
- void node(const osmium::Node& node) override final {
- node_dispatch(m_handler, node, 0);
- }
-
- void way(const osmium::Way& way) override final {
- way_dispatch(m_handler, way, 0);
- }
-
- void relation(const osmium::Relation& relation) override final {
- relation_dispatch(m_handler, relation, 0);
- }
-
- void area(const osmium::Area& area) override final {
- area_dispatch(m_handler, area, 0);
- }
-
- void changeset(const osmium::Changeset& changeset) override final {
- changeset_dispatch(m_handler, changeset, 0);
- }
-
- void flush() override final {
- flush_dispatch(m_handler, 0);
- }
-
- }; // class HandlerWrapper
-
- } // namespace detail
-
- class DynamicHandler : public osmium::handler::Handler {
-
- typedef std::unique_ptr<osmium::handler::detail::HandlerWrapperBase> impl_ptr;
- impl_ptr m_impl;
-
- public:
-
- DynamicHandler() :
- m_impl(impl_ptr(new osmium::handler::detail::HandlerWrapperBase)) {
- }
-
- template <typename THandler, typename... TArgs>
- void set(TArgs&&... args) {
- m_impl = impl_ptr(new osmium::handler::detail::HandlerWrapper<THandler>(std::forward<TArgs>(args)...));
- }
-
- void node(const osmium::Node& node) {
- m_impl->node(node);
- }
-
- void way(const osmium::Way& way) {
- m_impl->way(way);
- }
-
- void relation(const osmium::Relation& relation) {
- m_impl->relation(relation);
- }
-
- void area(const osmium::Area& area) {
- m_impl->area(area);
- }
-
- void changeset(const osmium::Changeset& changeset) {
- m_impl->changeset(changeset);
- }
-
- void flush() {
- m_impl->flush();
- }
-
- }; // class DynamicHandler
-
- } // namspace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_DYNAMIC_HANDLER_HPP
diff --git a/contrib/libosmium/osmium/experimental/flex_reader.hpp b/contrib/libosmium/osmium/experimental/flex_reader.hpp
deleted file mode 100644
index c1d2357..0000000
--- a/contrib/libosmium/osmium/experimental/flex_reader.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifndef OSMIUM_EXPERIMENTAL_FLEX_READER_HPP
-#define OSMIUM_EXPERIMENTAL_FLEX_READER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-#include <vector>
-
-#include <osmium/area/assembler.hpp>
-#include <osmium/area/multipolygon_collector.hpp>
-#include <osmium/handler/node_locations_for_ways.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/io/reader.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- /**
- * @brief Experimental code that is not "officially" supported.
- */
- namespace experimental {
-
- template <typename TLocationHandler>
- class FlexReader {
-
- bool m_with_areas;
- osmium::osm_entity_bits::type m_entities;
-
- TLocationHandler& m_location_handler;
-
- osmium::io::Reader m_reader;
- osmium::area::Assembler::config_type m_assembler_config;
- osmium::area::MultipolygonCollector<osmium::area::Assembler> m_collector;
-
- public:
-
- explicit FlexReader(const osmium::io::File& file, TLocationHandler& location_handler, osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::nwr) :
- m_with_areas((entities & osmium::osm_entity_bits::area) != 0),
- m_entities((entities & ~osmium::osm_entity_bits::area) | (m_with_areas ? osmium::osm_entity_bits::node | osmium::osm_entity_bits::way : osmium::osm_entity_bits::nothing)),
- m_location_handler(location_handler),
- m_reader(file, m_entities),
- m_assembler_config(),
- m_collector(m_assembler_config)
- {
- m_location_handler.ignore_errors();
- if (m_with_areas) {
- osmium::io::Reader reader(file, osmium::osm_entity_bits::relation);
- m_collector.read_relations(reader);
- reader.close();
- }
- }
-
- explicit FlexReader(const std::string& filename, TLocationHandler& location_handler, osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::nwr) :
- FlexReader(osmium::io::File(filename), location_handler, entities) {
- }
-
- explicit FlexReader(const char* filename, TLocationHandler& location_handler, osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::nwr) :
- FlexReader(osmium::io::File(filename), location_handler, entities) {
- }
-
- osmium::memory::Buffer read() {
- osmium::memory::Buffer buffer = m_reader.read();
-
- if (buffer) {
- if (m_with_areas) {
- std::vector<osmium::memory::Buffer> area_buffers;
- osmium::apply(buffer, m_location_handler, m_collector.handler([&area_buffers](osmium::memory::Buffer&& area_buffer) {
- area_buffers.push_back(std::move(area_buffer));
- }));
- for (const osmium::memory::Buffer& b : area_buffers) {
- buffer.add_buffer(b);
- buffer.commit();
- }
- } else if (m_entities & (osmium::osm_entity_bits::node | osmium::osm_entity_bits::way)) {
- osmium::apply(buffer, m_location_handler);
- }
- }
-
- return buffer;
- }
-
- osmium::io::Header header() {
- return m_reader.header();
- }
-
- void close() {
- return m_reader.close();
- }
-
- bool eof() const {
- return m_reader.eof();
- }
-
- const osmium::area::MultipolygonCollector<osmium::area::Assembler>& collector() const {
- return m_collector;
- }
-
- }; // class FlexReader
-
- } // namespace experimental
-
-} // namespace osmium
-
-#endif // OSMIUM_EXPERIMENTAL_FLEX_READER_HPP
diff --git a/contrib/libosmium/osmium/fwd.hpp b/contrib/libosmium/osmium/fwd.hpp
deleted file mode 100644
index bfcb5f5..0000000
--- a/contrib/libosmium/osmium/fwd.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef OSMIUM_FWD_HPP
-#define OSMIUM_FWD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- *
- * @file
- *
- * This file contains forward declarations for commonly used Osmium classes.
- *
- */
-
-namespace osmium {
-
- class Area;
- class Box;
- class Changeset;
- class ChangesetComment;
- class ChangesetDiscussion;
- class InnerRing;
- class Location;
- class Node;
- class NodeRef;
- class NodeRefList;
- class OSMEntity;
- class OSMObject;
- class OuterRing;
- class Relation;
- class RelationMemberList;
- class Segment;
- class Tag;
- class TagList;
- class Timestamp;
- class Way;
- class WayNodeList;
-
-} // namespace osmium
-
-#endif // OSMIUM_FWD_HPP
diff --git a/contrib/libosmium/osmium/geom/coordinates.hpp b/contrib/libosmium/osmium/geom/coordinates.hpp
deleted file mode 100644
index 6544e68..0000000
--- a/contrib/libosmium/osmium/geom/coordinates.hpp
+++ /dev/null
@@ -1,96 +0,0 @@
-#ifndef OSMIUM_GEOM_COORDINATES_HPP
-#define OSMIUM_GEOM_COORDINATES_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iosfwd>
-#include <string>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/util/double.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- struct Coordinates {
-
- double x;
- double y;
-
- explicit Coordinates(double cx, double cy) noexcept : x(cx), y(cy) {
- }
-
- Coordinates(const osmium::Location& location) : x(location.lon()), y(location.lat()) {
- }
-
- void append_to_string(std::string& s, const char infix, int precision) const {
- osmium::util::double2string(s, x, precision);
- s += infix;
- osmium::util::double2string(s, y, precision);
- }
-
- void append_to_string(std::string& s, const char prefix, const char infix, const char suffix, int precision) const {
- s += prefix;
- append_to_string(s, infix, precision);
- s += suffix;
- }
-
- }; // struct coordinates
-
- /**
- * Compare whether two Coordinates are identical. Might not give the
- * right result if the coordinates have been the result of some
- * calculation that introduced rounding errors.
- */
- inline bool operator==(const Coordinates& lhs, const Coordinates& rhs) noexcept {
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wfloat-equal"
- return lhs.x == rhs.x && lhs.y == rhs.y;
-#pragma GCC diagnostic pop
- }
-
- inline bool operator!=(const Coordinates& lhs, const Coordinates& rhs) noexcept {
- return ! operator==(lhs, rhs);
- }
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const Coordinates& c) {
- return out << '(' << c.x << ',' << c.y << ')';
- }
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_COORDINATES_HPP
diff --git a/contrib/libosmium/osmium/geom/factory.hpp b/contrib/libosmium/osmium/geom/factory.hpp
deleted file mode 100644
index 49dc78c..0000000
--- a/contrib/libosmium/osmium/geom/factory.hpp
+++ /dev/null
@@ -1,419 +0,0 @@
-#ifndef OSMIUM_GEOM_FACTORY_HPP
-#define OSMIUM_GEOM_FACTORY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown when an invalid geometry is encountered. An example
- * would be a linestring with less than two points.
- */
- class geometry_error : public std::runtime_error {
-
- std::string m_message;
- osmium::object_id_type m_id;
-
- public:
-
- geometry_error(const std::string& message, const char* object_type = "", osmium::object_id_type id = 0) :
- std::runtime_error(message),
- m_message(message),
- m_id(id) {
- if (m_id != 0) {
- m_message += " (";
- m_message += object_type;
- m_message += "_id=";
- m_message += std::to_string(m_id);
- m_message += ")";
- }
- }
-
- void set_id(const char* object_type, osmium::object_id_type id) {
- if (m_id == 0 && id != 0) {
- m_message += " (";
- m_message += object_type;
- m_message += "_id=";
- m_message += std::to_string(id);
- m_message += ")";
- }
- m_id = id;
- }
-
- osmium::object_id_type id() const noexcept {
- return m_id;
- }
-
- virtual const char* what() const noexcept override {
- return m_message.c_str();
- }
-
- }; // struct geometry_error
-
- /**
- * @brief Everything related to geometry handling.
- */
- namespace geom {
-
- /**
- * Which nodes of a way to use for a linestring.
- */
- enum class use_nodes : bool {
- unique = true, ///< Remove consecutive nodes with same location.
- all = false ///< Use all nodes.
- }; // enum class use_nodes
-
- /**
- * Which direction the linestring created from a way
- * should have.
- */
- enum class direction : bool {
- backward = true, ///< Linestring has reverse direction.
- forward = false ///< Linestring has same direction as way.
- }; // enum class direction
-
- /**
- * This pseudo projection just returns its WGS84 input unchanged.
- * Used as a template parameter if a real projection is not needed.
- */
- class IdentityProjection {
-
- public:
-
- Coordinates operator()(osmium::Location location) const {
- return Coordinates{location.lon(), location.lat()};
- }
-
- int epsg() const noexcept {
- return 4326;
- }
-
- std::string proj_string() const {
- return "+proj=longlat +datum=WGS84 +no_defs";
- }
-
- }; // class IdentityProjection
-
- /**
- * Geometry factory.
- */
- template <typename TGeomImpl, typename TProjection = IdentityProjection>
- class GeometryFactory {
-
- /**
- * Add all points of an outer or inner ring to a multipolygon.
- */
- void add_points(const osmium::OuterRing& nodes) {
- osmium::Location last_location;
- for (const osmium::NodeRef& node_ref : nodes) {
- if (last_location != node_ref.location()) {
- last_location = node_ref.location();
- m_impl.multipolygon_add_location(m_projection(last_location));
- }
- }
- }
-
- TProjection m_projection;
- TGeomImpl m_impl;
-
- public:
-
- /**
- * Constructor for default initialized projection.
- */
- template <typename... TArgs>
- GeometryFactory<TGeomImpl, TProjection>(TArgs&&... args) :
- m_projection(),
- m_impl(std::forward<TArgs>(args)...) {
- }
-
- /**
- * Constructor for explicitly initialized projection. Note that the
- * projection is moved into the GeometryFactory.
- */
- template <typename... TArgs>
- GeometryFactory<TGeomImpl, TProjection>(TProjection&& projection, TArgs&&... args) :
- m_projection(std::move(projection)),
- m_impl(std::forward<TArgs>(args)...) {
- }
-
- typedef TProjection projection_type;
- typedef typename TGeomImpl::point_type point_type;
- typedef typename TGeomImpl::linestring_type linestring_type;
- typedef typename TGeomImpl::polygon_type polygon_type;
- typedef typename TGeomImpl::multipolygon_type multipolygon_type;
- typedef typename TGeomImpl::ring_type ring_type;
-
- int epsg() const {
- return m_projection.epsg();
- }
-
- std::string proj_string() const {
- return m_projection.proj_string();
- }
-
- /* Point */
-
- point_type create_point(const osmium::Location& location) const {
- return m_impl.make_point(m_projection(location));
- }
-
- point_type create_point(const osmium::Node& node) {
- try {
- return create_point(node.location());
- } catch (osmium::geometry_error& e) {
- e.set_id("node", node.id());
- throw;
- }
- }
-
- point_type create_point(const osmium::NodeRef& node_ref) {
- try {
- return create_point(node_ref.location());
- } catch (osmium::geometry_error& e) {
- e.set_id("node", node_ref.ref());
- throw;
- }
- }
-
- /* LineString */
-
- void linestring_start() {
- m_impl.linestring_start();
- }
-
- template <typename TIter>
- size_t fill_linestring(TIter it, TIter end) {
- size_t num_points = 0;
- for (; it != end; ++it, ++num_points) {
- m_impl.linestring_add_location(m_projection(it->location()));
- }
- return num_points;
- }
-
- template <typename TIter>
- size_t fill_linestring_unique(TIter it, TIter end) {
- size_t num_points = 0;
- osmium::Location last_location;
- for (; it != end; ++it) {
- if (last_location != it->location()) {
- last_location = it->location();
- m_impl.linestring_add_location(m_projection(last_location));
- ++num_points;
- }
- }
- return num_points;
- }
-
- linestring_type linestring_finish(size_t num_points) {
- return m_impl.linestring_finish(num_points);
- }
-
- linestring_type create_linestring(const osmium::WayNodeList& wnl, use_nodes un = use_nodes::unique, direction dir = direction::forward) {
- linestring_start();
- size_t num_points = 0;
-
- if (un == use_nodes::unique) {
- osmium::Location last_location;
- switch (dir) {
- case direction::forward:
- num_points = fill_linestring_unique(wnl.cbegin(), wnl.cend());
- break;
- case direction::backward:
- num_points = fill_linestring_unique(wnl.crbegin(), wnl.crend());
- break;
- }
- } else {
- switch (dir) {
- case direction::forward:
- num_points = fill_linestring(wnl.cbegin(), wnl.cend());
- break;
- case direction::backward:
- num_points = fill_linestring(wnl.crbegin(), wnl.crend());
- break;
- }
- }
-
- if (num_points < 2) {
- throw osmium::geometry_error("need at least two points for linestring");
- }
-
- return linestring_finish(num_points);
- }
-
- linestring_type create_linestring(const osmium::Way& way, use_nodes un=use_nodes::unique, direction dir=direction::forward) {
- try {
- return create_linestring(way.nodes(), un, dir);
- } catch (osmium::geometry_error& e) {
- e.set_id("way", way.id());
- throw;
- }
- }
-
- /* Polygon */
-
- void polygon_start() {
- m_impl.polygon_start();
- }
-
- template <typename TIter>
- size_t fill_polygon(TIter it, TIter end) {
- size_t num_points = 0;
- for (; it != end; ++it, ++num_points) {
- m_impl.polygon_add_location(m_projection(it->location()));
- }
- return num_points;
- }
-
- template <typename TIter>
- size_t fill_polygon_unique(TIter it, TIter end) {
- size_t num_points = 0;
- osmium::Location last_location;
- for (; it != end; ++it) {
- if (last_location != it->location()) {
- last_location = it->location();
- m_impl.polygon_add_location(m_projection(last_location));
- ++num_points;
- }
- }
- return num_points;
- }
-
- polygon_type polygon_finish(size_t num_points) {
- return m_impl.polygon_finish(num_points);
- }
-
- polygon_type create_polygon(const osmium::WayNodeList& wnl, use_nodes un = use_nodes::unique, direction dir = direction::forward) {
- polygon_start();
- size_t num_points = 0;
-
- if (un == use_nodes::unique) {
- osmium::Location last_location;
- switch (dir) {
- case direction::forward:
- num_points = fill_polygon_unique(wnl.cbegin(), wnl.cend());
- break;
- case direction::backward:
- num_points = fill_polygon_unique(wnl.crbegin(), wnl.crend());
- break;
- }
- } else {
- switch (dir) {
- case direction::forward:
- num_points = fill_polygon(wnl.cbegin(), wnl.cend());
- break;
- case direction::backward:
- num_points = fill_polygon(wnl.crbegin(), wnl.crend());
- break;
- }
- }
-
- if (num_points < 4) {
- throw osmium::geometry_error("need at least four points for polygon");
- }
-
- return polygon_finish(num_points);
- }
-
- polygon_type create_polygon(const osmium::Way& way, use_nodes un=use_nodes::unique, direction dir=direction::forward) {
- try {
- return create_polygon(way.nodes(), un, dir);
- } catch (osmium::geometry_error& e) {
- e.set_id("way", way.id());
- throw;
- }
- }
-
- /* MultiPolygon */
-
- multipolygon_type create_multipolygon(const osmium::Area& area) {
- try {
- size_t num_polygons = 0;
- size_t num_rings = 0;
- m_impl.multipolygon_start();
-
- for (auto it = area.cbegin(); it != area.cend(); ++it) {
- const osmium::OuterRing& ring = static_cast<const osmium::OuterRing&>(*it);
- if (it->type() == osmium::item_type::outer_ring) {
- if (num_polygons > 0) {
- m_impl.multipolygon_polygon_finish();
- }
- m_impl.multipolygon_polygon_start();
- m_impl.multipolygon_outer_ring_start();
- add_points(ring);
- m_impl.multipolygon_outer_ring_finish();
- ++num_rings;
- ++num_polygons;
- } else if (it->type() == osmium::item_type::inner_ring) {
- m_impl.multipolygon_inner_ring_start();
- add_points(ring);
- m_impl.multipolygon_inner_ring_finish();
- ++num_rings;
- }
- }
-
- // if there are no rings, this area is invalid
- if (num_rings == 0) {
- throw osmium::geometry_error("area contains no rings");
- }
-
- m_impl.multipolygon_polygon_finish();
- return m_impl.multipolygon_finish();
- } catch (osmium::geometry_error& e) {
- e.set_id("area", area.id());
- throw;
- }
- }
-
- }; // class GeometryFactory
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_FACTORY_HPP
diff --git a/contrib/libosmium/osmium/geom/geojson.hpp b/contrib/libosmium/osmium/geom/geojson.hpp
deleted file mode 100644
index e5b5a9c..0000000
--- a/contrib/libosmium/osmium/geom/geojson.hpp
+++ /dev/null
@@ -1,160 +0,0 @@
-#ifndef OSMIUM_GEOM_GEOJSON_HPP
-#define OSMIUM_GEOM_GEOJSON_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-#include <utility>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- namespace detail {
-
- class GeoJSONFactoryImpl {
-
- std::string m_str;
- int m_precision;
-
- public:
-
- typedef std::string point_type;
- typedef std::string linestring_type;
- typedef std::string polygon_type;
- typedef std::string multipolygon_type;
- typedef std::string ring_type;
-
- GeoJSONFactoryImpl(int precision = 7) :
- m_precision(precision) {
- }
-
- /* Point */
-
- // { "type": "Point", "coordinates": [100.0, 0.0] }
- point_type make_point(const osmium::geom::Coordinates& xy) const {
- std::string str {"{\"type\":\"Point\",\"coordinates\":"};
- xy.append_to_string(str, '[', ',', ']', m_precision);
- str += "}";
- return str;
- }
-
- /* LineString */
-
- // { "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }
- void linestring_start() {
- m_str = "{\"type\":\"LineString\",\"coordinates\":[";
- }
-
- void linestring_add_location(const osmium::geom::Coordinates& xy) {
- xy.append_to_string(m_str, '[', ',', ']', m_precision);
- m_str += ',';
- }
-
- linestring_type linestring_finish(size_t /* num_points */) {
- assert(!m_str.empty());
- std::string str;
-
- using std::swap;
- swap(str, m_str);
-
- str.back() = ']';
- str += "}";
- return str;
- }
-
- /* MultiPolygon */
-
- void multipolygon_start() {
- m_str = "{\"type\":\"MultiPolygon\",\"coordinates\":[";
- }
-
- void multipolygon_polygon_start() {
- m_str += '[';
- }
-
- void multipolygon_polygon_finish() {
- m_str += "],";
- }
-
- void multipolygon_outer_ring_start() {
- m_str += '[';
- }
-
- void multipolygon_outer_ring_finish() {
- assert(!m_str.empty());
- m_str.back() = ']';
- }
-
- void multipolygon_inner_ring_start() {
- m_str += ",[";
- }
-
- void multipolygon_inner_ring_finish() {
- assert(!m_str.empty());
- m_str.back() = ']';
- }
-
- void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
- xy.append_to_string(m_str, '[', ',', ']', m_precision);
- m_str += ',';
- }
-
- multipolygon_type multipolygon_finish() {
- assert(!m_str.empty());
- std::string str;
-
- using std::swap;
- swap(str, m_str);
-
- str.back() = ']';
- str += "}";
- return str;
- }
-
- }; // class GeoJSONFactoryImpl
-
- } // namespace detail
-
- template <typename TProjection = IdentityProjection>
- using GeoJSONFactory = GeometryFactory<osmium::geom::detail::GeoJSONFactoryImpl, TProjection>;
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_GEOJSON_HPP
diff --git a/contrib/libosmium/osmium/geom/geos.hpp b/contrib/libosmium/osmium/geom/geos.hpp
deleted file mode 100644
index 49b1fd7..0000000
--- a/contrib/libosmium/osmium/geom/geos.hpp
+++ /dev/null
@@ -1,240 +0,0 @@
-#ifndef OSMIUM_GEOM_GEOS_HPP
-#define OSMIUM_GEOM_GEOS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for conversion of OSM geometries into GDAL
- * geometries.
- *
- * @attention If you include this file, you'll need to link with `libgeos`.
- */
-
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <geos/geom/Coordinate.h>
-#include <geos/geom/CoordinateSequence.h>
-#include <geos/geom/CoordinateSequenceFactory.h>
-#include <geos/geom/GeometryFactory.h>
-#include <geos/geom/LinearRing.h>
-#include <geos/geom/MultiPolygon.h>
-#include <geos/geom/Point.h>
-#include <geos/geom/Polygon.h>
-#include <geos/geom/PrecisionModel.h>
-#include <geos/util/GEOSException.h>
-
-#include <osmium/geom/factory.hpp>
-#include <osmium/geom/coordinates.hpp>
-
-// MSVC doesn't support throw_with_nested yet
-#ifdef _MSC_VER
-# define THROW throw
-#else
-# define THROW std::throw_with_nested
-#endif
-
-namespace osmium {
-
- struct geos_geometry_error : public geometry_error {
-
- geos_geometry_error(const char* message) :
- geometry_error(std::string("geometry creation failed in GEOS library: ") + message) {
- }
-
- }; // struct geos_geometry_error
-
- namespace geom {
-
- namespace detail {
-
- class GEOSFactoryImpl {
-
- std::unique_ptr<const geos::geom::PrecisionModel> m_precision_model;
- std::unique_ptr<geos::geom::GeometryFactory> m_our_geos_factory;
- geos::geom::GeometryFactory* m_geos_factory;
-
- std::unique_ptr<geos::geom::CoordinateSequence> m_coordinate_sequence;
- std::vector<std::unique_ptr<geos::geom::LinearRing>> m_rings;
- std::vector<std::unique_ptr<geos::geom::Polygon>> m_polygons;
-
- public:
-
- typedef std::unique_ptr<geos::geom::Point> point_type;
- typedef std::unique_ptr<geos::geom::LineString> linestring_type;
- typedef std::unique_ptr<geos::geom::Polygon> polygon_type;
- typedef std::unique_ptr<geos::geom::MultiPolygon> multipolygon_type;
- typedef std::unique_ptr<geos::geom::LinearRing> ring_type;
-
- explicit GEOSFactoryImpl(geos::geom::GeometryFactory& geos_factory) :
- m_precision_model(nullptr),
- m_our_geos_factory(nullptr),
- m_geos_factory(&geos_factory) {
- }
-
- explicit GEOSFactoryImpl(int srid = -1) :
- m_precision_model(new geos::geom::PrecisionModel),
- m_our_geos_factory(new geos::geom::GeometryFactory(m_precision_model.get(), srid)),
- m_geos_factory(m_our_geos_factory.get()) {
- }
-
- /* Point */
-
- point_type make_point(const osmium::geom::Coordinates& xy) const {
- try {
- return point_type(m_geos_factory->createPoint(geos::geom::Coordinate(xy.x, xy.y)));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- /* LineString */
-
- void linestring_start() {
- try {
- m_coordinate_sequence.reset(m_geos_factory->getCoordinateSequenceFactory()->create(static_cast<size_t>(0), 2));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- void linestring_add_location(const osmium::geom::Coordinates& xy) {
- try {
- m_coordinate_sequence->add(geos::geom::Coordinate(xy.x, xy.y));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- linestring_type linestring_finish(size_t /* num_points */) {
- try {
- return linestring_type(m_geos_factory->createLineString(m_coordinate_sequence.release()));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- /* MultiPolygon */
-
- void multipolygon_start() {
- m_polygons.clear();
- }
-
- void multipolygon_polygon_start() {
- m_rings.clear();
- }
-
- void multipolygon_polygon_finish() {
- try {
- assert(!m_rings.empty());
- auto inner_rings = new std::vector<geos::geom::Geometry*>;
- std::transform(std::next(m_rings.begin(), 1), m_rings.end(), std::back_inserter(*inner_rings), [](std::unique_ptr<geos::geom::LinearRing>& r) {
- return r.release();
- });
- m_polygons.emplace_back(m_geos_factory->createPolygon(m_rings[0].release(), inner_rings));
- m_rings.clear();
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- void multipolygon_outer_ring_start() {
- try {
- m_coordinate_sequence.reset(m_geos_factory->getCoordinateSequenceFactory()->create(static_cast<size_t>(0), 2));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- void multipolygon_outer_ring_finish() {
- try {
- m_rings.emplace_back(m_geos_factory->createLinearRing(m_coordinate_sequence.release()));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- void multipolygon_inner_ring_start() {
- try {
- m_coordinate_sequence.reset(m_geos_factory->getCoordinateSequenceFactory()->create(static_cast<size_t>(0), 2));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- void multipolygon_inner_ring_finish() {
- try {
- m_rings.emplace_back(m_geos_factory->createLinearRing(m_coordinate_sequence.release()));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
- try {
- m_coordinate_sequence->add(geos::geom::Coordinate(xy.x, xy.y));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- multipolygon_type multipolygon_finish() {
- try {
- auto polygons = new std::vector<geos::geom::Geometry*>;
- std::transform(m_polygons.begin(), m_polygons.end(), std::back_inserter(*polygons), [](std::unique_ptr<geos::geom::Polygon>& p) {
- return p.release();
- });
- m_polygons.clear();
- return multipolygon_type(m_geos_factory->createMultiPolygon(polygons));
- } catch (geos::util::GEOSException& e) {
- THROW(osmium::geos_geometry_error(e.what()));
- }
- }
-
- }; // class GEOSFactoryImpl
-
- } // namespace detail
-
- template <typename TProjection = IdentityProjection>
- using GEOSFactory = GeometryFactory<osmium::geom::detail::GEOSFactoryImpl, TProjection>;
-
- } // namespace geom
-
-} // namespace osmium
-
-#undef THROW
-
-#endif // OSMIUM_GEOM_GEOS_HPP
diff --git a/contrib/libosmium/osmium/geom/haversine.hpp b/contrib/libosmium/osmium/geom/haversine.hpp
deleted file mode 100644
index e62a31b..0000000
--- a/contrib/libosmium/osmium/geom/haversine.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef OSMIUM_GEOM_HAVERSINE_HPP
-#define OSMIUM_GEOM_HAVERSINE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cmath>
-#include <iterator>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/util.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- /**
- * @brief Functions to calculate arc distance on Earth using the haversine formula.
- *
- * See http://en.wikipedia.org/wiki/Haversine_formula
- *
- * Implementation derived from
- * http://blog.julien.cayzac.name/2008/10/arc-and-distance-between-two-points-on.html
- */
- namespace haversine {
-
- /// @brief Earth's quadratic mean radius for WGS84
- constexpr double EARTH_RADIUS_IN_METERS = 6372797.560856;
-
- /**
- * Calculate distance in meters between two sets of coordinates.
- */
- inline double distance(const osmium::geom::Coordinates& c1, const osmium::geom::Coordinates& c2) {
- double lonh = sin(deg_to_rad(c1.x - c2.x) * 0.5);
- lonh *= lonh;
- double lath = sin(deg_to_rad(c1.y - c2.y) * 0.5);
- lath *= lath;
- const double tmp = cos(deg_to_rad(c1.y)) * cos(deg_to_rad(c2.y));
- return 2.0 * EARTH_RADIUS_IN_METERS * asin(sqrt(lath + tmp*lonh));
- }
-
- /**
- * Calculate length of way.
- */
- inline double distance(const osmium::WayNodeList& wnl) {
- double sum_length = 0;
-
- for (auto it = wnl.begin(); it != wnl.end(); ++it) {
- if (std::next(it) != wnl.end()) {
- sum_length += distance(it->location(), std::next(it)->location());
- }
- }
-
- return sum_length;
- }
-
- } // namespace haversine
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_HAVERSINE_HPP
diff --git a/contrib/libosmium/osmium/geom/mercator_projection.hpp b/contrib/libosmium/osmium/geom/mercator_projection.hpp
deleted file mode 100644
index 22a0d64..0000000
--- a/contrib/libosmium/osmium/geom/mercator_projection.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef OSMIUM_GEOM_MERCATOR_PROJECTION_HPP
-#define OSMIUM_GEOM_MERCATOR_PROJECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cmath>
-#include <string>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/util.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- namespace detail {
-
- constexpr double earth_radius_for_epsg3857 = 6378137.0;
- constexpr double max_coordinate_epsg3857 = 20037508.34;
-
- constexpr inline double lon_to_x(double lon) {
- return earth_radius_for_epsg3857 * deg_to_rad(lon);
- }
-
- inline double lat_to_y(double lat) { // not constexpr because math functions aren't
- return earth_radius_for_epsg3857 * std::log(std::tan(osmium::geom::PI/4 + deg_to_rad(lat)/2));
- }
-
- constexpr inline double x_to_lon(double x) {
- return rad_to_deg(x) / earth_radius_for_epsg3857;
- }
-
- inline double y_to_lat(double y) { // not constexpr because math functions aren't
- return rad_to_deg(2 * std::atan(std::exp(y / earth_radius_for_epsg3857)) - osmium::geom::PI/2);
- }
-
- } // namespace detail
-
- /**
- * The maximum latitude that can be projected with the Web Mercator
- * (EPSG:3857) projection.
- */
- constexpr double MERCATOR_MAX_LAT = 85.0511288;
-
- inline Coordinates lonlat_to_mercator(const Coordinates& c) {
- return Coordinates(detail::lon_to_x(c.x), detail::lat_to_y(c.y));
- }
-
- inline Coordinates mercator_to_lonlat(const Coordinates& c) {
- return Coordinates(detail::x_to_lon(c.x), detail::y_to_lat(c.y));
- }
-
- /**
- * Functor that does projection from WGS84 (EPSG:4326) to "Web
- * Mercator" (EPSG:3857)
- */
- class MercatorProjection {
-
- public:
-
- Coordinates operator()(osmium::Location location) const {
- return Coordinates {detail::lon_to_x(location.lon()), detail::lat_to_y(location.lat())};
- }
-
- int epsg() const noexcept {
- return 3857;
- }
-
- std::string proj_string() const {
- return "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs";
- }
-
- }; // class MercatorProjection
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_MERCATOR_PROJECTION_HPP
diff --git a/contrib/libosmium/osmium/geom/ogr.hpp b/contrib/libosmium/osmium/geom/ogr.hpp
deleted file mode 100644
index 4d5995c..0000000
--- a/contrib/libosmium/osmium/geom/ogr.hpp
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef OSMIUM_GEOM_OGR_HPP
-#define OSMIUM_GEOM_OGR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for conversion of OSM geometries into OGR
- * geometries.
- *
- * @attention If you include this file, you'll need to link with `libgdal`.
- */
-
-#include <cassert>
-#include <cstddef>
-#include <memory>
-#include <utility>
-
-#include <ogr_geometry.h>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- namespace detail {
-
- class OGRFactoryImpl {
-
- public:
-
- typedef std::unique_ptr<OGRPoint> point_type;
- typedef std::unique_ptr<OGRLineString> linestring_type;
- typedef std::unique_ptr<OGRPolygon> polygon_type;
- typedef std::unique_ptr<OGRMultiPolygon> multipolygon_type;
- typedef std::unique_ptr<OGRLinearRing> ring_type;
-
- private:
-
- linestring_type m_linestring;
- multipolygon_type m_multipolygon;
- polygon_type m_polygon;
- ring_type m_ring;
-
- public:
-
- OGRFactoryImpl() = default;
-
- /* Point */
-
- point_type make_point(const osmium::geom::Coordinates& xy) const {
- return point_type(new OGRPoint(xy.x, xy.y));
- }
-
- /* LineString */
-
- void linestring_start() {
- m_linestring = std::unique_ptr<OGRLineString>(new OGRLineString());
- }
-
- void linestring_add_location(const osmium::geom::Coordinates& xy) {
- assert(!!m_linestring);
- m_linestring->addPoint(xy.x, xy.y);
- }
-
- linestring_type linestring_finish(size_t /* num_points */) {
- return std::move(m_linestring);
- }
-
- /* Polygon */
-
- void polygon_start() {
- m_ring = std::unique_ptr<OGRLinearRing>(new OGRLinearRing());
- }
-
- void polygon_add_location(const osmium::geom::Coordinates& xy) {
- assert(!!m_ring);
- m_ring->addPoint(xy.x, xy.y);
- }
-
- polygon_type polygon_finish(size_t /* num_points */) {
- std::unique_ptr<OGRPolygon> polygon = std::unique_ptr<OGRPolygon>(new OGRPolygon());
- polygon->addRingDirectly(m_ring.release());
- return polygon;
- }
-
- /* MultiPolygon */
-
- void multipolygon_start() {
- m_multipolygon.reset(new OGRMultiPolygon());
- }
-
- void multipolygon_polygon_start() {
- m_polygon.reset(new OGRPolygon());
- }
-
- void multipolygon_polygon_finish() {
- assert(!!m_multipolygon);
- assert(!!m_polygon);
- m_multipolygon->addGeometryDirectly(m_polygon.release());
- }
-
- void multipolygon_outer_ring_start() {
- m_ring.reset(new OGRLinearRing());
- }
-
- void multipolygon_outer_ring_finish() {
- assert(!!m_polygon);
- assert(!!m_ring);
- m_polygon->addRingDirectly(m_ring.release());
- }
-
- void multipolygon_inner_ring_start() {
- m_ring.reset(new OGRLinearRing());
- }
-
- void multipolygon_inner_ring_finish() {
- assert(!!m_polygon);
- assert(!!m_ring);
- m_polygon->addRingDirectly(m_ring.release());
- }
-
- void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
- assert(!!m_polygon);
- assert(!!m_ring);
- m_ring->addPoint(xy.x, xy.y);
- }
-
- multipolygon_type multipolygon_finish() {
- assert(!!m_multipolygon);
- return std::move(m_multipolygon);
- }
-
- }; // class OGRFactoryImpl
-
- } // namespace detail
-
- template <typename TProjection = IdentityProjection>
- using OGRFactory = GeometryFactory<osmium::geom::detail::OGRFactoryImpl, TProjection>;
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_OGR_HPP
diff --git a/contrib/libosmium/osmium/geom/projection.hpp b/contrib/libosmium/osmium/geom/projection.hpp
deleted file mode 100644
index 6419101..0000000
--- a/contrib/libosmium/osmium/geom/projection.hpp
+++ /dev/null
@@ -1,167 +0,0 @@
-#ifndef OSMIUM_GEOM_PROJECTION_HPP
-#define OSMIUM_GEOM_PROJECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * This file contains code for projecting OSM locations to arbitrary
- * coordinate reference systems. It is based on the Proj.4 library.
- *
- * @attention If you include this file, you'll need to link with `libproj`.
- */
-
-#include <memory>
-#include <string>
-
-#include <proj_api.h>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/util.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- /**
- * C++ wrapper for a Coordinate Reference System of the proj library.
- */
- class CRS {
-
- struct ProjCRSDeleter {
- void operator()(void* crs) {
- pj_free(crs);
- }
- }; // struct ProjCRSDeleter
-
- std::unique_ptr<void, ProjCRSDeleter> m_crs;
-
- projPJ get() const {
- return m_crs.get();
- }
-
- public:
-
- CRS(const std::string& crs) :
- m_crs(pj_init_plus(crs.c_str()), ProjCRSDeleter()) {
- if (!m_crs) {
- throw osmium::projection_error(std::string("creation of CRS failed: ") + pj_strerrno(*pj_get_errno_ref()));
- }
- }
-
- CRS(int epsg) :
- CRS(std::string("+init=epsg:") + std::to_string(epsg)) {
- }
-
- bool is_latlong() const {
- return pj_is_latlong(m_crs.get()) != 0;
- }
-
- bool is_geocent() const {
- return pj_is_geocent(m_crs.get()) != 0;
- }
-
- /**
- * Transform coordinates from one CRS into another. Wraps the same function
- * of the proj library.
- *
- * Coordinates have to be in radians and are produced in radians.
- *
- * @throws osmmium::projection_error if the projection fails
- */
- friend Coordinates transform(const CRS& src, const CRS& dest, Coordinates c) {
- int result = pj_transform(src.get(), dest.get(), 1, 1, &c.x, &c.y, nullptr);
- if (result != 0) {
- throw osmium::projection_error(std::string("projection failed: ") + pj_strerrno(result));
- }
- return c;
- }
-
- }; // class CRS
-
- /**
- * Functor that does projection from WGS84 (EPSG:4326) to the given
- * CRS.
- */
- class Projection {
-
- int m_epsg;
- std::string m_proj_string;
- CRS m_crs_wgs84 {4326};
- CRS m_crs_user;
-
- public:
-
- Projection(const std::string& proj_string) :
- m_epsg(-1),
- m_proj_string(proj_string),
- m_crs_user(proj_string) {
- }
-
- Projection(int epsg) :
- m_epsg(epsg),
- m_proj_string(std::string("+init=epsg:") + std::to_string(epsg)),
- m_crs_user(epsg) {
- }
-
- Coordinates operator()(osmium::Location location) const {
- Coordinates c {location.lon(), location.lat()};
-
- if (m_epsg != 4326) {
- c = transform(m_crs_wgs84, m_crs_user, Coordinates(deg_to_rad(location.lon()), deg_to_rad(location.lat())));
- if (m_crs_user.is_latlong()) {
- c.x = rad_to_deg(c.x);
- c.y = rad_to_deg(c.y);
- }
- }
-
- return c;
- }
-
- int epsg() const noexcept {
- return m_epsg;
- }
-
- std::string proj_string() const {
- return m_proj_string;
- }
-
- }; // class Projection
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_PROJECTION_HPP
diff --git a/contrib/libosmium/osmium/geom/rapid_geojson.hpp b/contrib/libosmium/osmium/geom/rapid_geojson.hpp
deleted file mode 100644
index 87e479b..0000000
--- a/contrib/libosmium/osmium/geom/rapid_geojson.hpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef OSMIUM_GEOM_RAPID_GEOJSON_HPP
-#define OSMIUM_GEOM_RAPID_GEOJSON_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- namespace detail {
-
- /**
- * A geometry factory implementation that can be used with the
- * RapidJSON (https://github.com/miloyip/rapidjson) JSON writer.
- */
- template <typename TWriter>
- class RapidGeoJSONFactoryImpl {
-
- TWriter* m_writer;
-
- public:
-
- typedef void point_type;
- typedef void linestring_type;
- typedef void polygon_type;
- typedef void multipolygon_type;
- typedef void ring_type;
-
- RapidGeoJSONFactoryImpl(TWriter& writer) :
- m_writer(&writer) {
- }
-
- /* Point */
-
- // { "type": "Point", "coordinates": [100.0, 0.0] }
- point_type make_point(const osmium::geom::Coordinates& xy) const {
- m_writer->String("geometry");
- m_writer->StartObject();
- m_writer->String("type");
- m_writer->String("Point");
- m_writer->String("coordinates");
- m_writer->StartArray();
- m_writer->Double(xy.x);
- m_writer->Double(xy.y);
- m_writer->EndArray();
- m_writer->EndObject();
- }
-
- /* LineString */
-
- // { "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ] }
- void linestring_start() {
- m_writer->String("geometry");
- m_writer->StartObject();
- m_writer->String("type");
- m_writer->String("LineString");
- m_writer->String("coordinates");
- m_writer->StartArray();
- }
-
- void linestring_add_location(const osmium::geom::Coordinates& xy) {
- m_writer->StartArray();
- m_writer->Double(xy.x);
- m_writer->Double(xy.y);
- m_writer->EndArray();
- }
-
- linestring_type linestring_finish(size_t /* num_points */) {
- m_writer->EndArray();
- m_writer->EndObject();
- }
-
- /* Polygon */
-
- // { "type": "Polygon", "coordinates": [[[100.0, 0.0], [101.0, 1.0]]] }
- void polygon_start() {
- m_writer->String("geometry");
- m_writer->StartObject();
- m_writer->String("type");
- m_writer->String("Polygon");
- m_writer->String("coordinates");
- m_writer->StartArray();
- m_writer->StartArray();
- }
-
- void polygon_add_location(const osmium::geom::Coordinates& xy) {
- m_writer->StartArray();
- m_writer->Double(xy.x);
- m_writer->Double(xy.y);
- m_writer->EndArray();
- }
-
- polygon_type polygon_finish(size_t /* num_points */) {
- m_writer->EndArray();
- m_writer->EndArray();
- m_writer->EndObject();
- }
-
- /* MultiPolygon */
-
- void multipolygon_start() {
- m_writer->String("geometry");
- m_writer->StartObject();
- m_writer->String("type");
- m_writer->String("MultiPolygon");
- m_writer->String("coordinates");
- m_writer->StartArray();
- }
-
- void multipolygon_polygon_start() {
- m_writer->StartArray();
- }
-
- void multipolygon_polygon_finish() {
- m_writer->EndArray();
- }
-
- void multipolygon_outer_ring_start() {
- m_writer->StartArray();
- }
-
- void multipolygon_outer_ring_finish() {
- m_writer->EndArray();
- }
-
- void multipolygon_inner_ring_start() {
- m_writer->StartArray();
- }
-
- void multipolygon_inner_ring_finish() {
- m_writer->EndArray();
- }
-
- void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
- m_writer->StartArray();
- m_writer->Double(xy.x);
- m_writer->Double(xy.y);
- m_writer->EndArray();
- }
-
- multipolygon_type multipolygon_finish() {
- m_writer->EndArray();
- m_writer->EndObject();
- }
-
- }; // class RapidGeoJSONFactoryImpl
-
- } // namespace detail
-
- template <typename TWriter, typename TProjection = IdentityProjection>
- using RapidGeoJSONFactory = GeometryFactory<detail::RapidGeoJSONFactoryImpl<TWriter>, TProjection>;
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_RAPID_GEOJSON_HPP
diff --git a/contrib/libosmium/osmium/geom/relations.hpp b/contrib/libosmium/osmium/geom/relations.hpp
deleted file mode 100644
index e9e2aa4..0000000
--- a/contrib/libosmium/osmium/geom/relations.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef OSMIUM_GEOM_RELATIONS_HPP
-#define OSMIUM_GEOM_RELATIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/osm/box.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- /**
- * Check whether one geometry contains another.
- */
- inline bool contains(const osmium::Box& a, const osmium::Box& b) {
- return ((a.bottom_left().x() >= b.bottom_left().x()) &&
- (a.top_right().x() <= b.top_right().x()) &&
- (a.bottom_left().y() >= b.bottom_left().y()) &&
- (a.top_right().y() <= b.top_right().y()));
- }
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_RELATIONS_HPP
diff --git a/contrib/libosmium/osmium/geom/tile.hpp b/contrib/libosmium/osmium/geom/tile.hpp
deleted file mode 100644
index 6ca0682..0000000
--- a/contrib/libosmium/osmium/geom/tile.hpp
+++ /dev/null
@@ -1,101 +0,0 @@
-#ifndef OSMIUM_GEOM_TILE_HPP
-#define OSMIUM_GEOM_TILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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/geom/mercator_projection.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- namespace detail {
-
- template <typename T>
- inline T restrict_to_range(T value, T min, T max) {
- if (value < min) return min;
- if (value > max) return max;
- return value;
- }
-
- } // namespace detail
-
- /**
- * A tile in the usual Mercator projection.
- */
- struct Tile {
-
- uint32_t x;
- uint32_t y;
- uint32_t z;
-
- explicit Tile(uint32_t zoom, uint32_t tx, uint32_t ty) noexcept : x(tx), y(ty), z(zoom) {
- }
-
- explicit Tile(uint32_t zoom, const osmium::Location& location) :
- z(zoom) {
- osmium::geom::Coordinates c = lonlat_to_mercator(location);
- const int32_t n = 1 << zoom;
- const double scale = detail::max_coordinate_epsg3857 * 2 / n;
- x = uint32_t(detail::restrict_to_range<int32_t>(int32_t((c.x + detail::max_coordinate_epsg3857) / scale), 0, n-1));
- y = uint32_t(detail::restrict_to_range<int32_t>(int32_t((detail::max_coordinate_epsg3857 - c.y) / scale), 0, n-1));
- }
-
- }; // struct Tile
-
- inline bool operator==(const Tile& a, const Tile& b) {
- return a.z == b.z && a.x == b.x && a.y == b.y;
- }
-
- inline bool operator!=(const Tile& a, const Tile& b) {
- return ! (a == b);
- }
-
- /**
- * This defines an arbitrary order on tiles for use in std::map etc.
- */
- inline bool operator<(const Tile& a, const Tile& b) {
- if (a.z < b.z) return true;
- if (a.z > b.z) return false;
- if (a.x < b.x) return true;
- if (a.x > b.x) return false;
- return a.y < b.y;
- }
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_TILE_HPP
diff --git a/contrib/libosmium/osmium/geom/util.hpp b/contrib/libosmium/osmium/geom/util.hpp
deleted file mode 100644
index 5e9f822..0000000
--- a/contrib/libosmium/osmium/geom/util.hpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#ifndef OSMIUM_GEOM_UTIL_HPP
-#define OSMIUM_GEOM_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <stdexcept>
-#include <string>
-
-namespace osmium {
-
- /**
- * Exception thrown when a projection object can not be initialized or the
- * projection of some coordinates can not be calculated.
- */
- struct projection_error : public std::runtime_error {
-
- projection_error(const std::string& what) :
- std::runtime_error(what) {
- }
-
- projection_error(const char* what) :
- std::runtime_error(what) {
- }
-
- }; // struct projection_error
-
- namespace geom {
-
- constexpr double PI = 3.14159265358979323846;
-
- /// Convert angle from degrees to radians.
- inline constexpr double deg_to_rad(double degree) noexcept {
- return degree * (PI / 180.0);
- }
-
- /// Convert angle from radians to degrees.
- inline constexpr double rad_to_deg(double radians) noexcept {
- return radians * (180.0 / PI);
- }
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_UTIL_HPP
diff --git a/contrib/libosmium/osmium/geom/wkb.hpp b/contrib/libosmium/osmium/geom/wkb.hpp
deleted file mode 100644
index 49833e6..0000000
--- a/contrib/libosmium/osmium/geom/wkb.hpp
+++ /dev/null
@@ -1,273 +0,0 @@
-#ifndef OSMIUM_GEOM_WKB_HPP
-#define OSMIUM_GEOM_WKB_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <cstdint>
-#include <string>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/endian.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- enum class wkb_type : bool {
- wkb = false,
- ewkb = true
- }; // enum class wkb_type
-
- enum class out_type : bool {
- binary = false,
- hex = true
- }; // enum class out_type
-
- namespace detail {
-
- template <typename T>
- inline void str_push(std::string& str, T data) {
- size_t size = str.size();
- str.resize(size + sizeof(T));
- std::copy_n(reinterpret_cast<char*>(&data), sizeof(T), &str[size]);
- }
-
- inline std::string convert_to_hex(const std::string& str) {
- static const char* lookup_hex = "0123456789ABCDEF";
- std::string out;
-
- for (char c : str) {
- out += lookup_hex[(c >> 4) & 0xf];
- out += lookup_hex[c & 0xf];
- }
-
- return out;
- }
-
- class WKBFactoryImpl {
-
- /// OSM data always uses SRID 4326 (WGS84).
- static constexpr uint32_t srid = 4326;
-
- /**
- * Type of WKB geometry.
- * These definitions are from
- * 99-049_OpenGIS_Simple_Features_Specification_For_SQL_Rev_1.1.pdf (for WKB)
- * and http://trac.osgeo.org/postgis/browser/trunk/doc/ZMSgeoms.txt (for EWKB).
- * They are used to encode geometries into the WKB format.
- */
- enum wkbGeometryType : uint32_t {
- wkbPoint = 1,
- wkbLineString = 2,
- wkbPolygon = 3,
- wkbMultiPoint = 4,
- wkbMultiLineString = 5,
- wkbMultiPolygon = 6,
- wkbGeometryCollection = 7,
-
- // SRID-presence flag (EWKB)
- wkbSRID = 0x20000000
- }; // enum wkbGeometryType
-
- /**
- * Byte order marker in WKB geometry.
- */
- enum class wkb_byte_order_type : uint8_t {
- XDR = 0, // Big Endian
- NDR = 1 // Little Endian
- }; // enum class wkb_byte_order_type
-
- std::string m_data;
- uint32_t m_points {0};
- wkb_type m_wkb_type;
- out_type m_out_type;
-
- size_t m_linestring_size_offset = 0;
- size_t m_polygons = 0;
- size_t m_rings = 0;
- size_t m_multipolygon_size_offset = 0;
- size_t m_polygon_size_offset = 0;
- size_t m_ring_size_offset = 0;
-
- size_t header(std::string& str, wkbGeometryType type, bool add_length) const {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- str_push(str, wkb_byte_order_type::NDR);
-#else
- str_push(str, wkb_byte_order_type::XDR);
-#endif
- if (m_wkb_type == wkb_type::ewkb) {
- str_push(str, type | wkbSRID);
- str_push(str, srid);
- } else {
- str_push(str, type);
- }
- size_t offset = str.size();
- if (add_length) {
- str_push(str, static_cast<uint32_t>(0));
- }
- return offset;
- }
-
- void set_size(const size_t offset, const size_t size) {
- *reinterpret_cast<uint32_t*>(&m_data[offset]) = static_cast_with_assert<uint32_t>(size);
- }
-
- public:
-
- typedef std::string point_type;
- typedef std::string linestring_type;
- typedef std::string polygon_type;
- typedef std::string multipolygon_type;
- typedef std::string ring_type;
-
- explicit WKBFactoryImpl(wkb_type wtype = wkb_type::wkb, out_type otype = out_type::binary) :
- m_wkb_type(wtype),
- m_out_type(otype) {
- }
-
- /* Point */
-
- point_type make_point(const osmium::geom::Coordinates& xy) const {
- std::string data;
- header(data, wkbPoint, false);
- str_push(data, xy.x);
- str_push(data, xy.y);
-
- if (m_out_type == out_type::hex) {
- return convert_to_hex(data);
- } else {
- return data;
- }
- }
-
- /* LineString */
-
- void linestring_start() {
- m_data.clear();
- m_linestring_size_offset = header(m_data, wkbLineString, true);
- }
-
- void linestring_add_location(const osmium::geom::Coordinates& xy) {
- str_push(m_data, xy.x);
- str_push(m_data, xy.y);
- }
-
- linestring_type linestring_finish(size_t num_points) {
- set_size(m_linestring_size_offset, num_points);
- std::string data;
-
- using std::swap;
- swap(data, m_data);
-
- if (m_out_type == out_type::hex) {
- return convert_to_hex(data);
- } else {
- return data;
- }
- }
-
- /* MultiPolygon */
-
- void multipolygon_start() {
- m_data.clear();
- m_polygons = 0;
- m_multipolygon_size_offset = header(m_data, wkbMultiPolygon, true);
- }
-
- void multipolygon_polygon_start() {
- ++m_polygons;
- m_rings = 0;
- m_polygon_size_offset = header(m_data, wkbPolygon, true);
- }
-
- void multipolygon_polygon_finish() {
- set_size(m_polygon_size_offset, m_rings);
- }
-
- void multipolygon_outer_ring_start() {
- ++m_rings;
- m_points = 0;
- m_ring_size_offset = m_data.size();
- str_push(m_data, static_cast<uint32_t>(0));
- }
-
- void multipolygon_outer_ring_finish() {
- set_size(m_ring_size_offset, m_points);
- }
-
- void multipolygon_inner_ring_start() {
- ++m_rings;
- m_points = 0;
- m_ring_size_offset = m_data.size();
- str_push(m_data, static_cast<uint32_t>(0));
- }
-
- void multipolygon_inner_ring_finish() {
- set_size(m_ring_size_offset, m_points);
- }
-
- void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
- str_push(m_data, xy.x);
- str_push(m_data, xy.y);
- ++m_points;
- }
-
- multipolygon_type multipolygon_finish() {
- set_size(m_multipolygon_size_offset, m_polygons);
- std::string data;
-
- using std::swap;
- swap(data, m_data);
-
- if (m_out_type == out_type::hex) {
- return convert_to_hex(data);
- } else {
- return data;
- }
- }
-
- }; // class WKBFactoryImpl
-
- } // namespace detail
-
- template <typename TProjection = IdentityProjection>
- using WKBFactory = GeometryFactory<osmium::geom::detail::WKBFactoryImpl, TProjection>;
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_WKB_HPP
diff --git a/contrib/libosmium/osmium/geom/wkt.hpp b/contrib/libosmium/osmium/geom/wkt.hpp
deleted file mode 100644
index 9cf5371..0000000
--- a/contrib/libosmium/osmium/geom/wkt.hpp
+++ /dev/null
@@ -1,156 +0,0 @@
-#ifndef OSMIUM_GEOM_WKT_HPP
-#define OSMIUM_GEOM_WKT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <string>
-#include <utility>
-
-#include <osmium/geom/coordinates.hpp>
-#include <osmium/geom/factory.hpp>
-
-namespace osmium {
-
- namespace geom {
-
- namespace detail {
-
- class WKTFactoryImpl {
-
- std::string m_str;
- int m_precision;
-
- public:
-
- typedef std::string point_type;
- typedef std::string linestring_type;
- typedef std::string polygon_type;
- typedef std::string multipolygon_type;
- typedef std::string ring_type;
-
- WKTFactoryImpl(int precision = 7) :
- m_precision(precision) {
- }
-
- /* Point */
-
- point_type make_point(const osmium::geom::Coordinates& xy) const {
- std::string str {"POINT"};
- xy.append_to_string(str, '(', ' ', ')', m_precision);
- return str;
- }
-
- /* LineString */
-
- void linestring_start() {
- m_str = "LINESTRING(";
- }
-
- void linestring_add_location(const osmium::geom::Coordinates& xy) {
- xy.append_to_string(m_str, ' ', m_precision);
- m_str += ',';
- }
-
- linestring_type linestring_finish(size_t /* num_points */) {
- assert(!m_str.empty());
- std::string str;
-
- using std::swap;
- swap(str, m_str);
-
- str.back() = ')';
- return str;
- }
-
- /* MultiPolygon */
-
- void multipolygon_start() {
- m_str = "MULTIPOLYGON(";
- }
-
- void multipolygon_polygon_start() {
- m_str += '(';
- }
-
- void multipolygon_polygon_finish() {
- m_str += "),";
- }
-
- void multipolygon_outer_ring_start() {
- m_str += '(';
- }
-
- void multipolygon_outer_ring_finish() {
- assert(!m_str.empty());
- m_str.back() = ')';
- }
-
- void multipolygon_inner_ring_start() {
- m_str += ",(";
- }
-
- void multipolygon_inner_ring_finish() {
- assert(!m_str.empty());
- m_str.back() = ')';
- }
-
- void multipolygon_add_location(const osmium::geom::Coordinates& xy) {
- xy.append_to_string(m_str, ' ', m_precision);
- m_str += ',';
- }
-
- multipolygon_type multipolygon_finish() {
- assert(!m_str.empty());
- std::string str;
-
- using std::swap;
- swap(str, m_str);
-
- str.back() = ')';
- return str;
- }
-
- }; // class WKTFactoryImpl
-
- } // namespace detail
-
- template <typename TProjection = IdentityProjection>
- using WKTFactory = GeometryFactory<osmium::geom::detail::WKTFactoryImpl, TProjection>;
-
- } // namespace geom
-
-} // namespace osmium
-
-#endif // OSMIUM_GEOM_WKT_HPP
diff --git a/contrib/libosmium/osmium/handler.hpp b/contrib/libosmium/osmium/handler.hpp
deleted file mode 100644
index f366197..0000000
--- a/contrib/libosmium/osmium/handler.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef OSMIUM_HANDLER_HPP
-#define OSMIUM_HANDLER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/fwd.hpp>
-
-namespace osmium {
-
- /**
- * @brief Osmium handlers provide callbacks for OSM objects
- */
- namespace handler {
-
- class Handler {
-
- public:
-
- void osm_object(const osmium::OSMObject&) const {
- }
-
- void node(const osmium::Node&) const {
- }
-
- void way(const osmium::Way&) const {
- }
-
- void relation(const osmium::Relation&) const {
- }
-
- void area(const osmium::Area&) const {
- }
-
- void changeset(const osmium::Changeset&) const {
- }
-
- void tag_list(const osmium::TagList&) const {
- }
-
- void way_node_list(const osmium::WayNodeList&) const {
- }
-
- void relation_member_list(const osmium::RelationMemberList&) const {
- }
-
- void outer_ring(const osmium::OuterRing&) const {
- }
-
- void inner_ring(const osmium::InnerRing&) const {
- }
-
- void changeset_discussion(const osmium::ChangesetDiscussion&) const {
- }
-
- void flush() const {
- }
-
- }; // class Handler
-
- } // namspace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_HPP
diff --git a/contrib/libosmium/osmium/handler/chain.hpp b/contrib/libosmium/osmium/handler/chain.hpp
deleted file mode 100644
index 4f3291c..0000000
--- a/contrib/libosmium/osmium/handler/chain.hpp
+++ /dev/null
@@ -1,128 +0,0 @@
-#ifndef OSMIUM_HANDLER_CHAIN_HPP
-#define OSMIUM_HANDLER_CHAIN_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <tuple>
-
-#include <osmium/handler.hpp>
-
-#define OSMIUM_CHAIN_HANDLER_CALL(_func_, _type_) \
- template <int N, int SIZE, typename THandlers> \
- struct call_ ## _func_ { \
- void operator()(THandlers& handlers, osmium::_type_& object) { \
- std::get<N>(handlers)._func_(object); \
- call_ ## _func_<N+1, SIZE, THandlers>()(handlers, object); \
- } \
- }; \
- template <int SIZE, typename THandlers> \
- struct call_ ## _func_<SIZE, SIZE, THandlers> { \
- void operator()(THandlers&, osmium::_type_&) {} \
- };
-
-namespace osmium {
-
- class Node;
- class Way;
- class Relation;
- class Area;
- class Changeset;
-
- namespace handler {
-
- /**
- * This handler allows chaining of any number of handlers into a single
- * handler.
- */
- template <typename... THandler>
- class ChainHandler : public osmium::handler::Handler {
-
- typedef std::tuple<THandler&...> handlers_type;
- handlers_type m_handlers;
-
- template <int N, int SIZE, typename THandlers>
- struct call_flush {
- void operator()(THandlers& handlers) {
- std::get<N>(handlers).flush();
- call_flush<N+1, SIZE, THandlers>()(handlers);
- }
- }; // struct call_flush
-
- template <int SIZE, typename THandlers>
- struct call_flush<SIZE, SIZE, THandlers> {
- void operator()(THandlers&) {}
- }; // struct call_flush
-
- OSMIUM_CHAIN_HANDLER_CALL(node, Node)
- OSMIUM_CHAIN_HANDLER_CALL(way, Way)
- OSMIUM_CHAIN_HANDLER_CALL(relation, Relation)
- OSMIUM_CHAIN_HANDLER_CALL(changeset, Changeset)
- OSMIUM_CHAIN_HANDLER_CALL(area, Area)
-
- public:
-
- explicit ChainHandler(THandler&... handlers) :
- m_handlers(handlers...) {
- }
-
- void node(osmium::Node& node) {
- call_node<0, sizeof...(THandler), handlers_type>()(m_handlers, node);
- }
-
- void way(osmium::Way& way) {
- call_way<0, sizeof...(THandler), handlers_type>()(m_handlers, way);
- }
-
- void relation(osmium::Relation& relation) {
- call_relation<0, sizeof...(THandler), handlers_type>()(m_handlers, relation);
- }
-
- void changeset( osmium::Changeset& changeset) {
- call_changeset<0, sizeof...(THandler), handlers_type>()(m_handlers, changeset);
- }
-
- void area(osmium::Area& area) {
- call_area<0, sizeof...(THandler), handlers_type>()(m_handlers, area);
- }
-
- void flush() {
- call_flush<0, sizeof...(THandler), handlers_type>()(m_handlers);
- }
-
- }; // class ChainHandler
-
- } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_CHAIN_HPP
diff --git a/contrib/libosmium/osmium/handler/disk_store.hpp b/contrib/libosmium/osmium/handler/disk_store.hpp
deleted file mode 100644
index ccae596..0000000
--- a/contrib/libosmium/osmium/handler/disk_store.hpp
+++ /dev/null
@@ -1,111 +0,0 @@
-#ifndef OSMIUM_HANDLER_DISK_STORE_HPP
-#define OSMIUM_HANDLER_DISK_STORE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-
-#include <osmium/handler.hpp>
-#include <osmium/index/map.hpp>
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/item_iterator.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- namespace handler {
-
- /**
- *
- * Note: This handler will only work if either all object IDs are
- * positive or all object IDs are negative.
- */
- class DiskStore : public osmium::handler::Handler {
-
- typedef osmium::index::map::Map<unsigned_object_id_type, size_t> offset_index_type;
-
- size_t m_offset = 0;
- int m_data_fd;
-
- offset_index_type& m_node_index;
- offset_index_type& m_way_index;
- offset_index_type& m_relation_index;
-
- public:
-
- explicit DiskStore(int data_fd, offset_index_type& node_index, offset_index_type& way_index, offset_index_type& relation_index) :
- m_data_fd(data_fd),
- m_node_index(node_index),
- m_way_index(way_index),
- m_relation_index(relation_index) {
- }
-
- DiskStore(const DiskStore&) = delete;
- DiskStore& operator=(const DiskStore&) = delete;
-
- ~DiskStore() noexcept = default;
-
- void node(const osmium::Node& node) {
- m_node_index.set(node.positive_id(), m_offset);
- m_offset += node.byte_size();
- }
-
- void way(const osmium::Way& way) {
- m_way_index.set(way.positive_id(), m_offset);
- m_offset += way.byte_size();
- }
-
- void relation(const osmium::Relation& relation) {
- m_relation_index.set(relation.positive_id(), m_offset);
- m_offset += relation.byte_size();
- }
-
- // XXX
- void operator()(const osmium::memory::Buffer& buffer) {
- osmium::io::detail::reliable_write(m_data_fd, buffer.data(), buffer.committed());
-
- osmium::apply(buffer.begin(), buffer.end(), *this);
- }
-
- }; // class DiskStore
-
- } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_DISK_STORE_HPP
diff --git a/contrib/libosmium/osmium/handler/dump.hpp b/contrib/libosmium/osmium/handler/dump.hpp
deleted file mode 100644
index a23236e..0000000
--- a/contrib/libosmium/osmium/handler/dump.hpp
+++ /dev/null
@@ -1,294 +0,0 @@
-#ifndef OSMIUM_HANDLER_DUMP_HPP
-#define OSMIUM_HANDLER_DUMP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iomanip>
-#include <iostream>
-#include <string>
-
-#include <osmium/handler.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/area.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- namespace handler {
-
- class Dump : public osmium::handler::Handler {
-
- std::ostream* m_out;
- bool m_with_size;
- std::string m_prefix;
-
- void print_title(const char* title, const osmium::memory::Item& item) {
- *m_out << m_prefix
- << title
- << ":";
-
- if (m_with_size) {
- *m_out << " ["
- << item.byte_size()
- << "]";
- }
-
- *m_out << "\n";
- }
-
- void print_meta(const osmium::OSMObject& object) {
- *m_out << m_prefix
- << " id="
- << object.id()
- << "\n";
- *m_out << m_prefix
- << " version="
- << object.version()
- << "\n";
- *m_out << m_prefix
- << " uid="
- << object.uid()
- << "\n";
- *m_out << m_prefix
- << " user=|"
- << object.user()
- << "|\n";
- *m_out << m_prefix
- << " changeset="
- << object.changeset()
- << "\n";
- *m_out << m_prefix
- << " timestamp="
- << object.timestamp().to_iso()
- << "\n";
- *m_out << m_prefix
- << " visible="
- << (object.visible() ? "yes" : "no")
- << "\n";
-
- Dump dump(*m_out, m_with_size, m_prefix + " ");
- osmium::apply(object.cbegin(), object.cend(), dump);
- }
-
- void print_location(const osmium::Node& node) {
- const osmium::Location& location = node.location();
-
- if (location) {
- *m_out << m_prefix
- << " lon="
- << std::fixed
- << std::setprecision(7)
- << location.lon_without_check()
- << "\n";
- *m_out << m_prefix
- << " lat="
- << location.lat_without_check()
- << "\n";
- } else {
- *m_out << m_prefix
- << " lon=\n"
- << m_prefix
- << " lat=\n";
- }
- }
-
- public:
-
- explicit Dump(std::ostream& out, bool with_size = true, const std::string& prefix = "") :
- m_out(&out),
- m_with_size(with_size),
- m_prefix(prefix) {
- }
-
- void tag_list(const osmium::TagList& tags) {
- print_title("TAGS", tags);
- for (const auto& tag : tags) {
- *m_out << m_prefix
- << " k=|"
- << tag.key()
- << "| v=|"
- << tag.value()
- << "|"
- << "\n";
- }
- }
-
- void way_node_list(const osmium::WayNodeList& wnl) {
- print_title("NODES", wnl);
- for (const auto& node_ref : wnl) {
- *m_out << m_prefix
- << " ref="
- << node_ref.ref();
- if (node_ref.location()) {
- *m_out << " pos="
- << node_ref.location();
- }
- *m_out << "\n";
- }
- }
-
- void relation_member_list(const osmium::RelationMemberList& rml) {
- print_title("MEMBERS", rml);
- for (const auto& member : rml) {
- *m_out << m_prefix
- << " type="
- << item_type_to_name(member.type())
- << " ref="
- << member.ref()
- << " role=|"
- << member.role()
- << "|\n";
- if (member.full_member()) {
- Dump dump(*m_out, m_with_size, m_prefix + " | ");
- osmium::apply_item(member.get_object(), dump);
- }
- }
- }
-
- void outer_ring(const osmium::OuterRing& ring) {
- print_title("OUTER RING", ring);
- for (const auto& node_ref : ring) {
- *m_out << m_prefix
- << " ref="
- << node_ref.ref();
- if (node_ref.location()) {
- *m_out << " pos="
- << node_ref.location();
- }
- *m_out << "\n";
- }
- }
-
- void inner_ring(const osmium::InnerRing& ring) {
- print_title("INNER RING", ring);
- for (const auto& node_ref : ring) {
- *m_out << m_prefix
- << " ref="
- << node_ref.ref();
- if (node_ref.location()) {
- *m_out << " pos="
- << node_ref.location();
- }
- *m_out << "\n";
- }
- }
-
- void node(const osmium::Node& node) {
- print_title("NODE", node);
- print_meta(node);
- print_location(node);
- }
-
- void way(const osmium::Way& way) {
- print_title("WAY", way);
- print_meta(way);
- }
-
- void relation(const osmium::Relation& relation) {
- print_title("RELATION", relation);
- print_meta(relation);
- }
-
- void area(const osmium::Area& area) {
- print_title("AREA", area);
- print_meta(area);
- }
-
- void changeset(const osmium::Changeset& changeset) {
- print_title("CHANGESET", changeset);
- *m_out << m_prefix
- << " id="
- << changeset.id()
- << "\n";
- *m_out << m_prefix
- << " num_changes="
- << changeset.num_changes()
- << "\n";
- *m_out << m_prefix
- << " uid="
- << changeset.uid()
- << "\n";
- *m_out << m_prefix
- << " user=|"
- << changeset.user()
- << "|\n";
- *m_out << m_prefix
- << " created_at="
- << changeset.created_at().to_iso()
- << "\n";
- *m_out << m_prefix
- << " closed_at="
- << changeset.closed_at().to_iso()
- << "\n";
- *m_out << m_prefix
- << " bounds=";
-
- if (changeset.bounds()) {
- *m_out << '('
- << changeset.bounds().bottom_left().lon_without_check()
- << ','
- << changeset.bounds().bottom_left().lat_without_check()
- << ','
- << changeset.bounds().top_right().lon_without_check()
- << ','
- << changeset.bounds().top_right().lat_without_check()
- << ')';
- } else {
- *m_out << "(undefined)";
- }
-
- *m_out << "\n";
-
- Dump dump(*m_out, m_with_size, m_prefix + " ");
- osmium::apply(changeset.cbegin(), changeset.cend(), dump);
- }
-
- }; // class Dump
-
- } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_DUMP_HPP
diff --git a/contrib/libosmium/osmium/handler/node_locations_for_ways.hpp b/contrib/libosmium/osmium/handler/node_locations_for_ways.hpp
deleted file mode 100644
index 8d31310..0000000
--- a/contrib/libosmium/osmium/handler/node_locations_for_ways.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_HANDLER_NODE_LOCATIONS_FOR_WAYS_HPP
-#define OSMIUM_HANDLER_NODE_LOCATIONS_FOR_WAYS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <type_traits>
-
-#include <osmium/handler.hpp>
-#include <osmium/index/index.hpp>
-#include <osmium/index/map/dummy.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-
-#include <osmium/index/node_locations_map.hpp>
-
-namespace osmium {
-
- namespace handler {
-
- typedef osmium::index::map::Dummy<osmium::unsigned_object_id_type, osmium::Location> dummy_type;
-
- /**
- * Handler to retrieve locations from nodes and add them to ways.
- *
- * @tparam TStoragePosIDs Class that handles the actual storage of the node locations
- * (for positive IDs). It must support the set(id, value) and
- * get(id) methods.
- * @tparam TStorageNegIDs Same but for negative IDs.
- */
- template <typename TStoragePosIDs, typename TStorageNegIDs = dummy_type>
- class NodeLocationsForWays : public osmium::handler::Handler {
-
- static_assert(std::is_base_of<osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>, TStoragePosIDs>::value, "Index class must be derived from osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>");
-
- static_assert(std::is_base_of<osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>, TStorageNegIDs>::value, "Index class must be derived from osmium::index::map::Map<osmium::unsigned_object_id_type, osmium::Location>");
-
- public:
-
- typedef TStoragePosIDs index_pos_type;
- typedef TStorageNegIDs index_neg_type;
-
- private:
-
- /// Object that handles the actual storage of the node locations (with positive IDs).
- TStoragePosIDs& m_storage_pos;
-
- /// Object that handles the actual storage of the node locations (with negative IDs).
- TStorageNegIDs& m_storage_neg;
-
- bool m_ignore_errors {false};
-
- bool m_must_sort {false};
-
- // It is okay to have this static dummy instance, even when using several threads,
- // because it is read-only.
- static dummy_type& get_dummy() {
- static dummy_type instance;
- return instance;
- }
-
- public:
-
- explicit NodeLocationsForWays(TStoragePosIDs& storage_pos,
- TStorageNegIDs& storage_neg = get_dummy()) :
- m_storage_pos(storage_pos),
- m_storage_neg(storage_neg) {
- }
-
- NodeLocationsForWays(const NodeLocationsForWays&) = delete;
- NodeLocationsForWays& operator=(const NodeLocationsForWays&) = delete;
-
- NodeLocationsForWays(NodeLocationsForWays&&) = default;
- NodeLocationsForWays& operator=(NodeLocationsForWays&&) = default;
-
- ~NodeLocationsForWays() noexcept = default;
-
- void ignore_errors() {
- m_ignore_errors = true;
- }
-
- /**
- * Store the location of the node in the storage.
- */
- void node(const osmium::Node& node) {
- m_must_sort = true;
- const osmium::object_id_type id = node.id();
- if (id >= 0) {
- m_storage_pos.set(static_cast<osmium::unsigned_object_id_type>( id), node.location());
- } else {
- m_storage_neg.set(static_cast<osmium::unsigned_object_id_type>(-id), node.location());
- }
- }
-
- /**
- * Get location of node with given id.
- */
- osmium::Location get_node_location(const osmium::object_id_type id) const {
- if (id >= 0) {
- return m_storage_pos.get(static_cast<osmium::unsigned_object_id_type>( id));
- } else {
- return m_storage_neg.get(static_cast<osmium::unsigned_object_id_type>(-id));
- }
- }
-
- /**
- * Retrieve locations of all nodes in the way from storage and add
- * them to the way object.
- */
- void way(osmium::Way& way) {
- if (m_must_sort) {
- m_storage_pos.sort();
- m_storage_neg.sort();
- m_must_sort = false;
- }
- bool error = false;
- for (auto& node_ref : way.nodes()) {
- try {
- node_ref.set_location(get_node_location(node_ref.ref()));
- if (!node_ref.location()) {
- error = true;
- }
- } catch (osmium::not_found&) {
- error = true;
- }
- }
- if (error && !m_ignore_errors) {
- throw osmium::not_found("location for one or more nodes not found in node location index");
- }
- }
-
- /**
- * Call clear on the location indexes. Makes the
- * NodeLocationsForWays handler unusable. Used to explicitly free
- * memory if thats needed.
- */
- void clear() {
- m_storage_pos.clear();
- m_storage_neg.clear();
- }
-
- }; // class NodeLocationsForWays
-
- } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_NODE_LOCATIONS_FOR_WAYS_HPP
diff --git a/contrib/libosmium/osmium/handler/object_relations.hpp b/contrib/libosmium/osmium/handler/object_relations.hpp
deleted file mode 100644
index dc4aa45..0000000
--- a/contrib/libosmium/osmium/handler/object_relations.hpp
+++ /dev/null
@@ -1,106 +0,0 @@
-#ifndef OSMIUM_HANDLER_OBJECT_RELATIONS_HPP
-#define OSMIUM_HANDLER_OBJECT_RELATIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/handler.hpp>
-#include <osmium/index/multimap.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-
-namespace osmium {
-
- namespace handler {
-
- /**
- *
- * Note: This handler will only work if either all object IDs are
- * positive or all object IDs are negative.
- */
- class ObjectRelations : public osmium::handler::Handler {
-
- typedef osmium::index::multimap::Multimap<unsigned_object_id_type, unsigned_object_id_type> index_type;
-
- index_type& m_index_n2w;
- index_type& m_index_n2r;
- index_type& m_index_w2r;
- index_type& m_index_r2r;
-
- public:
-
- explicit ObjectRelations(index_type& n2w, index_type& n2r, index_type& w2r, index_type& r2r) :
- m_index_n2w(n2w),
- m_index_n2r(n2r),
- m_index_w2r(w2r),
- m_index_r2r(r2r) {
- }
-
- ObjectRelations(const ObjectRelations&) = delete;
- ObjectRelations& operator=(const ObjectRelations&) = delete;
-
- ~ObjectRelations() noexcept = default;
-
- void way(const osmium::Way& way) {
- for (const auto& node_ref : way.nodes()) {
- m_index_n2w.set(node_ref.positive_ref(), way.positive_id());
- }
- }
-
- void relation(const osmium::Relation& relation) {
- for (const auto& member : relation.members()) {
- switch (member.type()) {
- case osmium::item_type::node:
- m_index_n2r.set(member.positive_ref(), relation.positive_id());
- break;
- case osmium::item_type::way:
- m_index_w2r.set(member.positive_ref(), relation.positive_id());
- break;
- case osmium::item_type::relation:
- m_index_r2r.set(member.positive_ref(), relation.positive_id());
- break;
- default:
- break;
- }
- }
- }
-
- }; // class ObjectRelations
-
- } // namespace handler
-
-} // namespace osmium
-
-#endif // OSMIUM_HANDLER_OBJECT_RELATIONS_HPP
diff --git a/contrib/libosmium/osmium/index/bool_vector.hpp b/contrib/libosmium/osmium/index/bool_vector.hpp
deleted file mode 100644
index 04850a5..0000000
--- a/contrib/libosmium/osmium/index/bool_vector.hpp
+++ /dev/null
@@ -1,85 +0,0 @@
-#ifndef OSMIUM_INDEX_BOOL_VECTOR_HPP
-#define OSMIUM_INDEX_BOOL_VECTOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <type_traits>
-#include <vector>
-
-namespace osmium {
-
- namespace index {
-
- /**
- * Index storing one bit for each Id. The index automatically scales
- * with the Ids stored. Default value is 'false'. Storage uses
- * std::vector<bool> and needs a minimum of memory if the Ids are
- * dense.
- */
- template <typename T>
- class BoolVector {
-
- static_assert(std::is_unsigned<T>::value, "Needs unsigned type");
-
- std::vector<bool> m_bits;
-
- public:
-
- BoolVector() = default;
-
- BoolVector(const BoolVector&) = default;
- BoolVector(BoolVector&&) = default;
- BoolVector& operator=(const BoolVector&) = default;
- BoolVector& operator=(BoolVector&&) = default;
-
- ~BoolVector() noexcept = default;
-
- void set(T id, bool value = true) {
- if (m_bits.size() <= id) {
- m_bits.resize(id + 1024 * 1024);
- }
-
- m_bits[id] = value;
- }
-
- bool get(T id) const {
- return id < m_bits.size() && m_bits[id];
- }
-
- }; // class BoolVector
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_BOOL_VECTOR_HPP
diff --git a/contrib/libosmium/osmium/index/detail/create_map_with_fd.hpp b/contrib/libosmium/osmium/index/detail/create_map_with_fd.hpp
deleted file mode 100644
index 5eb6cd0..0000000
--- a/contrib/libosmium/osmium/index/detail/create_map_with_fd.hpp
+++ /dev/null
@@ -1,71 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_CREATE_MAP_WITH_FD_HPP
-#define OSMIUM_INDEX_DETAIL_CREATE_MAP_WITH_FD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <cstring>
-#include <fcntl.h>
-#include <stdexcept>
-#include <string>
-#include <vector>
-
-namespace osmium {
-
- namespace index {
-
- namespace detail {
-
- template <typename T>
- inline T* create_map_with_fd(const std::vector<std::string>& config) {
- if (config.size() == 1) {
- return new T();
- } else {
- assert(config.size() > 1);
- const std::string& filename = config[1];
- int fd = ::open(filename.c_str(), O_CREAT | O_RDWR, 0644);
- if (fd == -1) {
- throw std::runtime_error(std::string("can't open file '") + filename + "': " + strerror(errno));
- }
- return new T(fd);
- }
- }
-
- } // namespace detail
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_CREATE_MAP_WITH_FD_HPP
diff --git a/contrib/libosmium/osmium/index/detail/mmap_vector_anon.hpp b/contrib/libosmium/osmium/index/detail/mmap_vector_anon.hpp
deleted file mode 100644
index 12a1803..0000000
--- a/contrib/libosmium/osmium/index/detail/mmap_vector_anon.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_MMAP_VECTOR_ANON_HPP
-#define OSMIUM_INDEX_DETAIL_MMAP_VECTOR_ANON_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_base.hpp>
-
-namespace osmium {
-
- namespace detail {
-
- /**
- * This class looks and behaves like STL vector, but uses mmap
- * internally.
- */
- template <typename T>
- class mmap_vector_anon : public mmap_vector_base<T> {
-
- public:
-
- mmap_vector_anon() :
- mmap_vector_base<T>() {
- }
-
- ~mmap_vector_anon() noexcept = default;
-
- }; // class mmap_vector_anon
-
- } // namespace detail
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_DETAIL_MMAP_VECTOR_ANON_HPP
diff --git a/contrib/libosmium/osmium/index/detail/mmap_vector_base.hpp b/contrib/libosmium/osmium/index/detail/mmap_vector_base.hpp
deleted file mode 100644
index e5f28e9..0000000
--- a/contrib/libosmium/osmium/index/detail/mmap_vector_base.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_MMAP_VECTOR_BASE_HPP
-#define OSMIUM_INDEX_DETAIL_MMAP_VECTOR_BASE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <new> // IWYU pragma: keep
-#include <stdexcept>
-
-#include <osmium/util/memory_mapping.hpp>
-
-namespace osmium {
-
- namespace detail {
-
- constexpr size_t mmap_vector_size_increment = 1024 * 1024;
-
- /**
- * This is a base class for implementing classes that look like
- * STL vector but use mmap internally. Do not use this class itself,
- * use the derived classes mmap_vector_anon or mmap_vector_file.
- */
- template <typename T>
- class mmap_vector_base {
-
- protected:
-
- size_t m_size;
- osmium::util::TypedMemoryMapping<T> m_mapping;
-
- public:
-
- mmap_vector_base(int fd, size_t capacity, size_t size = 0) :
- m_size(size),
- m_mapping(capacity, osmium::util::MemoryMapping::mapping_mode::write_shared, fd) {
- }
-
- explicit mmap_vector_base(size_t capacity = mmap_vector_size_increment) :
- m_size(0),
- m_mapping(capacity) {
- }
-
- ~mmap_vector_base() noexcept = default;
-
- typedef T value_type;
- typedef T& reference;
- typedef const T& const_reference;
- typedef T* pointer;
- typedef const T* const_pointer;
- typedef T* iterator;
- typedef const T* const_iterator;
-
- void close() {
- m_mapping.unmap();
- }
-
- size_t capacity() const noexcept {
- return m_mapping.size();
- }
-
- size_t size() const noexcept {
- return m_size;
- }
-
- bool empty() const noexcept {
- return m_size == 0;
- }
-
- const T* data() const {
- return m_mapping.begin();
- }
-
- T* data() {
- return m_mapping.begin();
- }
-
- T& operator[](size_t n) {
- return data()[n];
- }
-
- T at(size_t n) const {
- if (n >= m_size) {
- throw std::out_of_range("out of range");
- }
- return data()[n];
- }
-
- void clear() noexcept {
- m_size = 0;
- }
-
- void shrink_to_fit() {
- // XXX do something here
- }
-
- void push_back(const T& value) {
- if (m_size >= capacity()) {
- resize(m_size+1);
- }
- data()[m_size] = value;
- ++m_size;
- }
-
- void reserve(size_t new_capacity) {
- if (new_capacity > capacity()) {
- m_mapping.resize(new_capacity);
- }
- }
-
- void resize(size_t new_size) {
- if (new_size > capacity()) {
- reserve(new_size + osmium::detail::mmap_vector_size_increment);
- }
- if (new_size > size()) {
- new (data() + size()) T[new_size - size()];
- }
- m_size = new_size;
- }
-
- iterator begin() noexcept {
- return data();
- }
-
- iterator end() noexcept {
- return data() + m_size;
- }
-
- const_iterator begin() const noexcept {
- return data();
- }
-
- const_iterator end() const noexcept {
- return data() + m_size;
- }
-
- const_iterator cbegin() const noexcept {
- return data();
- }
-
- const_iterator cend() const noexcept {
- return data() + m_size;
- }
-
- }; // class mmap_vector_base
-
- } // namespace detail
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_MMAP_VECTOR_BASE_HPP
diff --git a/contrib/libosmium/osmium/index/detail/mmap_vector_file.hpp b/contrib/libosmium/osmium/index/detail/mmap_vector_file.hpp
deleted file mode 100644
index 54ef513..0000000
--- a/contrib/libosmium/osmium/index/detail/mmap_vector_file.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_MMAP_VECTOR_FILE_HPP
-#define OSMIUM_INDEX_DETAIL_MMAP_VECTOR_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/index/detail/mmap_vector_base.hpp>
-#include <osmium/index/detail/tmpfile.hpp>
-#include <osmium/util/file.hpp>
-
-namespace osmium {
-
- namespace detail {
-
- /**
- * This class looks and behaves like STL vector, but mmap's a file
- * internally.
- */
- template <typename T>
- class mmap_vector_file : public mmap_vector_base<T> {
-
- public:
-
- mmap_vector_file() :
- mmap_vector_base<T>(
- osmium::detail::create_tmp_file(),
- osmium::detail::mmap_vector_size_increment) {
- }
-
- explicit mmap_vector_file(int fd) :
- mmap_vector_base<T>(
- fd,
- osmium::util::file_size(fd) / sizeof(T),
- osmium::util::file_size(fd) / sizeof(T)) {
- }
-
- ~mmap_vector_file() noexcept = default;
-
- }; // class mmap_vector_file
-
- } // namespace detail
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_MMAP_VECTOR_FILE_HPP
diff --git a/contrib/libosmium/osmium/index/detail/tmpfile.hpp b/contrib/libosmium/osmium/index/detail/tmpfile.hpp
deleted file mode 100644
index 06cab65..0000000
--- a/contrib/libosmium/osmium/index/detail/tmpfile.hpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_TMPFILE_HPP
-#define OSMIUM_INDEX_DETAIL_TMPFILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <cstdio>
-#include <system_error>
-
-namespace osmium {
-
- namespace detail {
-
- /**
- * Create and open a temporary file. It is removed after opening.
- *
- * @returns File descriptor of temporary file.
- * @throws std::system_error if something went wrong.
- */
- inline int create_tmp_file() {
- FILE* file = ::tmpfile();
- if (!file) {
- throw std::system_error(errno, std::system_category(), "tempfile failed");
- }
- return fileno(file);
- }
-
- } // namespace detail
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_TMPFILE_HPP
diff --git a/contrib/libosmium/osmium/index/detail/vector_map.hpp b/contrib/libosmium/osmium/index/detail/vector_map.hpp
deleted file mode 100644
index 48b0f62..0000000
--- a/contrib/libosmium/osmium/index/detail/vector_map.hpp
+++ /dev/null
@@ -1,246 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_VECTOR_MAP_HPP
-#define OSMIUM_INDEX_DETAIL_VECTOR_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <stdexcept>
-#include <utility>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/map.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename TVector, typename TId, typename TValue>
- class VectorBasedDenseMap : public Map<TId, TValue> {
-
- TVector m_vector;
-
- public:
-
- typedef TValue element_type;
- typedef TVector vector_type;
- typedef typename vector_type::iterator iterator;
- typedef typename vector_type::const_iterator const_iterator;
-
- VectorBasedDenseMap() :
- m_vector() {
- }
-
- explicit VectorBasedDenseMap(int fd) :
- m_vector(fd) {
- }
-
- ~VectorBasedDenseMap() noexcept = default;
-
- void reserve(const size_t size) override final {
- m_vector.reserve(size);
- }
-
- void set(const TId id, const TValue value) override final {
- if (size() <= id) {
- m_vector.resize(id+1);
- }
- m_vector[id] = value;
- }
-
- const TValue get(const TId id) const override final {
- try {
- const TValue& value = m_vector.at(id);
- if (value == osmium::index::empty_value<TValue>()) {
- not_found_error(id);
- }
- return value;
- } catch (std::out_of_range&) {
- not_found_error(id);
- }
- }
-
- size_t size() const override final {
- return m_vector.size();
- }
-
- size_t byte_size() const {
- return m_vector.size() * sizeof(element_type);
- }
-
- size_t used_memory() const override final {
- return sizeof(TValue) * size();
- }
-
- void clear() override final {
- m_vector.clear();
- m_vector.shrink_to_fit();
- }
-
- void dump_as_array(const int fd) override final {
- osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(m_vector.data()), byte_size());
- }
-
- iterator begin() {
- return m_vector.begin();
- }
-
- iterator end() {
- return m_vector.end();
- }
-
- const_iterator cbegin() const {
- return m_vector.cbegin();
- }
-
- const_iterator cend() const {
- return m_vector.cend();
- }
-
- const_iterator begin() const {
- return m_vector.cbegin();
- }
-
- const_iterator end() const {
- return m_vector.cend();
- }
-
- }; // class VectorBasedDenseMap
-
-
- template <typename TId, typename TValue, template<typename...> class TVector>
- class VectorBasedSparseMap : public Map<TId, TValue> {
-
- public:
-
- typedef typename std::pair<TId, TValue> element_type;
- typedef TVector<element_type> vector_type;
- typedef typename vector_type::iterator iterator;
- typedef typename vector_type::const_iterator const_iterator;
-
- private:
-
- vector_type m_vector;
-
- public:
-
- VectorBasedSparseMap() :
- m_vector() {
- }
-
- VectorBasedSparseMap(int fd) :
- m_vector(fd) {
- }
-
- ~VectorBasedSparseMap() override final = default;
-
- void set(const TId id, const TValue value) override final {
- m_vector.push_back(element_type(id, value));
- }
-
- const TValue get(const TId id) const override final {
- const element_type element {
- id,
- osmium::index::empty_value<TValue>()
- };
- const auto result = std::lower_bound(m_vector.begin(), m_vector.end(), element, [](const element_type& a, const element_type& b) {
- return a.first < b.first;
- });
- if (result == m_vector.end() || result->first != id) {
- not_found_error(id);
- } else {
- return result->second;
- }
- }
-
- size_t size() const override final {
- return m_vector.size();
- }
-
- size_t byte_size() const {
- return m_vector.size() * sizeof(element_type);
- }
-
- size_t used_memory() const override final {
- return sizeof(element_type) * size();
- }
-
- void clear() override final {
- m_vector.clear();
- m_vector.shrink_to_fit();
- }
-
- void sort() override final {
- std::sort(m_vector.begin(), m_vector.end());
- }
-
- void dump_as_list(const int fd) override final {
- osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(m_vector.data()), byte_size());
- }
-
- iterator begin() {
- return m_vector.begin();
- }
-
- iterator end() {
- return m_vector.end();
- }
-
- const_iterator cbegin() const {
- return m_vector.cbegin();
- }
-
- const_iterator cend() const {
- return m_vector.cend();
- }
-
- const_iterator begin() const {
- return m_vector.cbegin();
- }
-
- const_iterator end() const {
- return m_vector.cend();
- }
-
- }; // class VectorBasedSparseMap
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_VECTOR_MAP_HPP
diff --git a/contrib/libosmium/osmium/index/detail/vector_multimap.hpp b/contrib/libosmium/osmium/index/detail/vector_multimap.hpp
deleted file mode 100644
index dc2e15a..0000000
--- a/contrib/libosmium/osmium/index/detail/vector_multimap.hpp
+++ /dev/null
@@ -1,186 +0,0 @@
-#ifndef OSMIUM_INDEX_DETAIL_VECTOR_MULTIMAP_HPP
-#define OSMIUM_INDEX_DETAIL_VECTOR_MULTIMAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <utility>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/multimap.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace multimap {
-
- template <typename TId, typename TValue, template<typename...> class TVector>
- class VectorBasedSparseMultimap : public Multimap<TId, TValue> {
-
- public:
-
- typedef typename std::pair<TId, TValue> element_type;
- typedef TVector<element_type> vector_type;
- typedef typename vector_type::iterator iterator;
- typedef typename vector_type::const_iterator const_iterator;
-
- private:
-
- vector_type m_vector;
-
- static bool is_removed(element_type& element) {
- return element.second == osmium::index::empty_value<TValue>();
- }
-
- public:
-
- VectorBasedSparseMultimap() :
- m_vector() {
- }
-
- explicit VectorBasedSparseMultimap(int fd) :
- m_vector(fd) {
- }
-
- ~VectorBasedSparseMultimap() noexcept = default;
-
- void set(const TId id, const TValue value) override final {
- m_vector.push_back(element_type(id, value));
- }
-
- void unsorted_set(const TId id, const TValue value) {
- m_vector.push_back(element_type(id, value));
- }
-
- std::pair<iterator, iterator> get_all(const TId id) {
- const element_type element {
- id,
- osmium::index::empty_value<TValue>()
- };
- return std::equal_range(m_vector.begin(), m_vector.end(), element, [](const element_type& a, const element_type& b) {
- return a.first < b.first;
- });
- }
-
- std::pair<const_iterator, const_iterator> get_all(const TId id) const {
- const element_type element {
- id,
- osmium::index::empty_value<TValue>()
- };
- return std::equal_range(m_vector.cbegin(), m_vector.cend(), element, [](const element_type& a, const element_type& b) {
- return a.first < b.first;
- });
- }
-
- size_t size() const override final {
- return m_vector.size();
- }
-
- size_t byte_size() const {
- return m_vector.size() * sizeof(element_type);
- }
-
- size_t used_memory() const override final {
- return sizeof(element_type) * size();
- }
-
- void clear() override final {
- m_vector.clear();
- m_vector.shrink_to_fit();
- }
-
- void sort() override final {
- std::sort(m_vector.begin(), m_vector.end());
- }
-
- void remove(const TId id, const TValue value) {
- auto r = get_all(id);
- for (auto it = r.first; it != r.second; ++it) {
- if (it->second == value) {
- it->second = 0;
- return;
- }
- }
- }
-
- void consolidate() {
- std::sort(m_vector.begin(), m_vector.end());
- }
-
- void erase_removed() {
- m_vector.erase(
- std::remove_if(m_vector.begin(), m_vector.end(), is_removed),
- m_vector.end()
- );
- }
-
- void dump_as_list(const int fd) override final {
- osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(m_vector.data()), byte_size());
- }
-
- iterator begin() {
- return m_vector.begin();
- }
-
- iterator end() {
- return m_vector.end();
- }
-
- const_iterator cbegin() const {
- return m_vector.cbegin();
- }
-
- const_iterator cend() const {
- return m_vector.cend();
- }
-
- const_iterator begin() const {
- return m_vector.cbegin();
- }
-
- const_iterator end() const {
- return m_vector.cend();
- }
-
- }; // class VectorBasedSparseMultimap
-
- } // namespace multimap
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_DETAIL_VECTOR_MULTIMAP_HPP
diff --git a/contrib/libosmium/osmium/index/index.hpp b/contrib/libosmium/osmium/index/index.hpp
deleted file mode 100644
index f415192..0000000
--- a/contrib/libosmium/osmium/index/index.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef OSMIUM_INDEX_INDEX_HPP
-#define OSMIUM_INDEX_INDEX_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <limits>
-#include <sstream>
-#include <stdexcept>
-#include <string>
-
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- /**
- * Exception signaling that an element could not be
- * found in an index.
- */
- struct not_found : public std::runtime_error {
-
- not_found(const std::string& what) :
- std::runtime_error(what) {
- }
-
- not_found(const char* what) :
- std::runtime_error(what) {
- }
-
- }; // struct not_found
-
- /**
- * @brief Indexing of OSM data, Locations, etc.
- */
- namespace index {
-
- template <typename TKey>
- OSMIUM_NORETURN void not_found_error(TKey key) {
- std::stringstream s;
- s << "id " << key << " not found";
- throw not_found(s.str());
- }
-
- /**
- * Some of the index classes need an "empty" value that can
- * never appear in real data. This function must return this
- * empty value for any class used as a value in an index.
- * The default implementation returns a default constructed
- * object, but it can be specialized.
- */
- template <typename T>
- inline constexpr T empty_value() {
- return T{};
- }
-
- /**
- * The size_t value in indexes is usually used for offsets
- * into a buffer or file. It is unlikely that we ever need
- * the full range, so the max value is a good "empty" value.
- */
- template <>
- inline OSMIUM_CONSTEXPR size_t empty_value<size_t>() {
- return std::numeric_limits<size_t>::max();
- }
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_INDEX_HPP
diff --git a/contrib/libosmium/osmium/index/map.hpp b/contrib/libosmium/osmium/index/map.hpp
deleted file mode 100644
index 68a9c20..0000000
--- a/contrib/libosmium/osmium/index/map.hpp
+++ /dev/null
@@ -1,275 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_HPP
-#define OSMIUM_INDEX_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <functional>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <type_traits>
-#include <vector>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/util/string.hpp>
-
-namespace osmium {
-
- namespace index {
-
- /**
- * @brief Key-value containers with unique integer values for a key
- */
- namespace map {
-
- /**
- * This abstract class defines an interface to storage classes
- * intended for storing small pieces of data (such as coordinates)
- * indexed by a positive integer (such as an object ID). The
- * storage must be very space efficient and able to scale to billions
- * of objects.
- *
- * Subclasses have different implementations that store the
- * data in different ways in memory and/or on disk. Some storage
- * classes are better suited when working with the whole planet,
- * some are better for data extracts.
- *
- * Note that these classes are not required to track "empty" fields.
- * When reading data you have to be sure you have put something in
- * there before.
- *
- * A typical use for this and derived classes is storage of node
- * locations indexed by node ID. These indexes will only work
- * on 64 bit systems if used in this case. 32 bit systems just
- * can't address that much memory!
- *
- * @tparam TId Id type, usually osmium::unsigned_object_id_type,
- * must be an unsigned integral type.
- * @tparam TValue Value type, usually osmium::Location or size_t.
- * Copied by value, so should be "small" type.
- */
- template <typename TId, typename TValue>
- class Map {
-
- static_assert(std::is_integral<TId>::value && std::is_unsigned<TId>::value,
- "TId template parameter for class Map must be unsigned integral type");
-
- Map(const Map&) = delete;
- Map& operator=(const Map&) = delete;
-
- protected:
-
- Map(Map&&) = default;
- Map& operator=(Map&&) = default;
-
- public:
-
- /// The "key" type, usually osmium::unsigned_object_id_type.
- typedef TId key_type;
-
- /// The "value" type, usually a Location or size_t.
- typedef TValue value_type;
-
- Map() = default;
-
- virtual ~Map() noexcept = default;
-
- virtual void reserve(const size_t) {
- // default implementation is empty
- }
-
- /// Set the field with id to value.
- virtual void set(const TId id, const TValue value) = 0;
-
- /// Retrieve value by id. Does not check for overflow or empty fields.
- virtual const TValue get(const TId id) const = 0;
-
- /**
- * Get the approximate number of items in the storage. The storage
- * might allocate memory in blocks, so this size might not be
- * accurate. You can not use this to find out how much memory the
- * storage uses. Use used_memory() for that.
- */
- virtual size_t size() const = 0;
-
- /**
- * Get the memory used for this storage in bytes. Note that this
- * is not necessarily entirely accurate but an approximation.
- * For storage classes that store the data in memory, this is
- * the main memory used, for storage classes storing data on disk
- * this is the memory used on disk.
- */
- virtual size_t used_memory() const = 0;
-
- /**
- * Clear memory used for this storage. After this you can not
- * use the storage container any more.
- */
- virtual void clear() = 0;
-
- /**
- * Sort data in map. Call this after writing all data and
- * before reading. Not all implementations need this.
- */
- virtual void sort() {
- // default implementation is empty
- }
-
- // This function could usually be const in derived classes,
- // but not always. It could, for instance, sort internal data.
- // This is why it is not declared const here.
- virtual void dump_as_list(const int /*fd*/) {
- throw std::runtime_error("can't dump as list");
- }
-
- // This function could usually be const in derived classes,
- // but not always. It could, for instance, sort internal data.
- // This is why it is not declared const here.
- virtual void dump_as_array(const int /*fd*/) {
- throw std::runtime_error("can't dump as array");
- }
-
- }; // class Map
-
- } // namespace map
-
- template <typename TId, typename TValue>
- class MapFactory {
-
- public:
-
- typedef TId id_type;
- typedef TValue value_type;
- typedef osmium::index::map::Map<id_type, value_type> map_type;
- typedef std::function<map_type*(const std::vector<std::string>&)> create_map_func;
-
- private:
-
- std::map<const std::string, create_map_func> m_callbacks;
-
- MapFactory() = default;
-
- MapFactory(const MapFactory&) = delete;
- MapFactory& operator=(const MapFactory&) = delete;
-
- MapFactory(MapFactory&&) = delete;
- MapFactory& operator=(MapFactory&&) = delete;
-
- OSMIUM_NORETURN static void error(const std::string& map_type_name) {
- std::string error_message {"Support for map type '"};
- error_message += map_type_name;
- error_message += "' not compiled into this binary.";
- throw std::runtime_error(error_message);
- }
-
- public:
-
- static MapFactory<id_type, value_type>& instance() {
- static MapFactory<id_type, value_type> factory;
- return factory;
- }
-
- bool register_map(const std::string& map_type_name, create_map_func func) {
- return m_callbacks.emplace(map_type_name, func).second;
- }
-
- bool has_map_type(const std::string& map_type_name) const {
- return m_callbacks.count(map_type_name);
- }
-
- std::vector<std::string> map_types() const {
- std::vector<std::string> result;
-
- for (const auto& cb : m_callbacks) {
- result.push_back(cb.first);
- }
-
- std::sort(result.begin(), result.end());
-
- return result;
- }
-
- std::unique_ptr<map_type> create_map(const std::string& config_string) const {
- std::vector<std::string> config = osmium::split_string(config_string, ',');
-
- if (config.empty()) {
- throw std::runtime_error("Need non-empty map type name.");
- }
-
- auto it = m_callbacks.find(config[0]);
- if (it != m_callbacks.end()) {
- return std::unique_ptr<map_type>((it->second)(config));
- }
-
- error(config[0]);
- }
-
- }; // class MapFactory
-
- namespace map {
-
- template <typename TId, typename TValue, template<typename, typename> class TMap>
- struct create_map {
- TMap<TId, TValue>* operator()(const std::vector<std::string>&) {
- return new TMap<TId, TValue>();
- }
- };
-
- } // namespace map
-
- template <typename TId, typename TValue, template<typename, typename> class TMap>
- inline bool register_map(const std::string& name) {
- return osmium::index::MapFactory<TId, TValue>::instance().register_map(name, [](const std::vector<std::string>& config) {
- return map::create_map<TId, TValue, TMap>()(config);
- });
- }
-
-#define OSMIUM_CONCATENATE_DETAIL_(x, y) x##y
-#define OSMIUM_CONCATENATE_(x, y) OSMIUM_CONCATENATE_DETAIL_(x, y)
-
-#define REGISTER_MAP(id, value, klass, name) \
-namespace osmium { namespace index { namespace detail { \
- const bool OSMIUM_CONCATENATE_(registered_, name) = osmium::index::register_map<id, value, klass>(#name); \
- inline bool OSMIUM_CONCATENATE_(get_registered_, name)() noexcept { \
- return OSMIUM_CONCATENATE_(registered_, name); \
- } \
-} } }
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_HPP
diff --git a/contrib/libosmium/osmium/index/map/all.hpp b/contrib/libosmium/osmium/index/map/all.hpp
deleted file mode 100644
index 9ffadc0..0000000
--- a/contrib/libosmium/osmium/index/map/all.hpp
+++ /dev/null
@@ -1,46 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_ALL_HPP
-#define OSMIUM_INDEX_MAP_ALL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/index/map/dense_file_array.hpp> // IWYU pragma: keep
-#include <osmium/index/map/dense_mem_array.hpp> // IWYU pragma: keep
-#include <osmium/index/map/dense_mmap_array.hpp> // IWYU pragma: keep
-#include <osmium/index/map/dummy.hpp> // IWYU pragma: keep
-#include <osmium/index/map/sparse_file_array.hpp> // IWYU pragma: keep
-#include <osmium/index/map/sparse_mem_array.hpp> // IWYU pragma: keep
-#include <osmium/index/map/sparse_mem_map.hpp> // IWYU pragma: keep
-#include <osmium/index/map/sparse_mem_table.hpp> // IWYU pragma: keep
-#include <osmium/index/map/sparse_mmap_array.hpp> // IWYU pragma: keep
-
-#endif // OSMIUM_INDEX_MAP_ALL_HPP
diff --git a/contrib/libosmium/osmium/index/map/dense_file_array.hpp b/contrib/libosmium/osmium/index/map/dense_file_array.hpp
deleted file mode 100644
index d209a87..0000000
--- a/contrib/libosmium/osmium/index/map/dense_file_array.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DENSE_FILE_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_DENSE_FILE_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-#include <vector>
-
-#include <osmium/index/detail/mmap_vector_file.hpp>
-#include <osmium/index/detail/vector_map.hpp>
-#include <osmium/index/detail/create_map_with_fd.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_DENSE_FILE_ARRAY
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename TId, typename TValue>
- using DenseFileArray = VectorBasedDenseMap<osmium::detail::mmap_vector_file<TValue>, TId, TValue>;
-
- template <typename TId, typename TValue>
- struct create_map<TId, TValue, DenseFileArray> {
- DenseFileArray<TId, TValue>* operator()(const std::vector<std::string>& config) {
- return osmium::index::detail::create_map_with_fd<DenseFileArray<TId, TValue>>(config);
- }
- };
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_DENSE_FILE_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/dense_mem_array.hpp b/contrib/libosmium/osmium/index/map/dense_mem_array.hpp
deleted file mode 100644
index b45eec4..0000000
--- a/contrib/libosmium/osmium/index/map/dense_mem_array.hpp
+++ /dev/null
@@ -1,57 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DENSE_MEM_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_DENSE_MEM_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <vector>
-
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_DENSE_MEM_ARRAY
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename TId, typename TValue>
- using DenseMemArray = VectorBasedDenseMap<std::vector<TValue>, TId, TValue>;
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_DENSE_MEM_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/dense_mmap_array.hpp b/contrib/libosmium/osmium/index/map/dense_mmap_array.hpp
deleted file mode 100644
index a912aeb..0000000
--- a/contrib/libosmium/osmium/index/map/dense_mmap_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DENSE_MMAP_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_DENSE_MMAP_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_anon.hpp> // IWYU pragma: keep
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_DENSE_MMAP_ARRAY
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename TId, typename TValue>
- using DenseMmapArray = VectorBasedDenseMap<osmium::detail::mmap_vector_anon<TValue>, TId, TValue>;
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_MAP_DENSE_MMAP_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/dummy.hpp b/contrib/libosmium/osmium/index/map/dummy.hpp
deleted file mode 100644
index 5b471df..0000000
--- a/contrib/libosmium/osmium/index/map/dummy.hpp
+++ /dev/null
@@ -1,88 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_DUMMY_HPP
-#define OSMIUM_INDEX_MAP_DUMMY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/map.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- /**
- * Pseudo map.
- * Use this class if you don't need a map, but you
- * need an object that behaves like one.
- */
- template <typename TId, typename TValue>
- class Dummy : public osmium::index::map::Map<TId, TValue> {
-
- public:
-
- Dummy() = default;
-
- ~Dummy() noexcept override final = default;
-
- void set(const TId, const TValue) override final {
- // intentionally left blank
- }
-
- const TValue get(const TId id) const override final {
- not_found_error(id);
- }
-
- size_t size() const override final {
- return 0;
- }
-
- size_t used_memory() const override final {
- return 0;
- }
-
- void clear() override final {
- }
-
- }; // class Dummy
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_DUMMY_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_file_array.hpp b/contrib/libosmium/osmium/index/map/sparse_file_array.hpp
deleted file mode 100644
index 2ba9315..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_file_array.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_FILE_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_FILE_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-#include <vector>
-
-#include <osmium/index/detail/mmap_vector_file.hpp>
-#include <osmium/index/detail/vector_map.hpp>
-#include <osmium/index/detail/create_map_with_fd.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_FILE_ARRAY
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename TId, typename TValue>
- using SparseFileArray = VectorBasedSparseMap<TId, TValue, osmium::detail::mmap_vector_file>;
-
- template <typename TId, typename TValue>
- struct create_map<TId, TValue, SparseFileArray> {
- SparseFileArray<TId, TValue>* operator()(const std::vector<std::string>& config) {
- return osmium::index::detail::create_map_with_fd<SparseFileArray<TId, TValue>>(config);
- }
- };
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_FILE_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mem_array.hpp b/contrib/libosmium/osmium/index/map/sparse_mem_array.hpp
deleted file mode 100644
index 9adf41f..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mem_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MEM_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <vector>
-
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_ARRAY
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename T>
- using StdVectorWrap = std::vector<T>;
-
- template <typename TId, typename TValue>
- using SparseMemArray = VectorBasedSparseMap<TId, TValue, StdVectorWrap>;
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_MEM_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mem_map.hpp b/contrib/libosmium/osmium/index/map/sparse_mem_map.hpp
deleted file mode 100644
index 9bad07e..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mem_map.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_MAP_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MEM_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm> // IWYU pragma: keep (for std::copy)
-#include <cstddef>
-#include <iterator>
-#include <map>
-#include <stdexcept>
-#include <vector>
-
-#include <osmium/index/map.hpp>
-#include <osmium/index/index.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_MAP
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- /**
- * This implementation uses std::map internally. It uses rather a
- * lot of memory, but might make sense for small maps.
- */
- template <typename TId, typename TValue>
- class SparseMemMap : public osmium::index::map::Map<TId, TValue> {
-
- // This is a rough estimate for the memory needed for each
- // element in the map (id + value + pointers to left, right,
- // and parent plus some overhead for color of red-black-tree
- // or similar).
- static constexpr size_t element_size = sizeof(TId) + sizeof(TValue) + sizeof(void*) * 4;
-
- std::map<TId, TValue> m_elements;
-
- public:
-
- SparseMemMap() = default;
-
- ~SparseMemMap() noexcept override final = default;
-
- void set(const TId id, const TValue value) override final {
- m_elements[id] = value;
- }
-
- const TValue get(const TId id) const override final {
- auto it = m_elements.find(id);
- if (it == m_elements.end()) {
- not_found_error(id);
- }
- return it->second;
- }
-
- size_t size() const noexcept override final {
- return m_elements.size();
- }
-
- size_t used_memory() const noexcept override final {
- return element_size * m_elements.size();
- }
-
- void clear() override final {
- m_elements.clear();
- }
-
- void dump_as_list(const int fd) override final {
- typedef typename std::map<TId, TValue>::value_type t;
- std::vector<t> v;
- v.reserve(m_elements.size());
- std::copy(m_elements.cbegin(), m_elements.cend(), std::back_inserter(v));
- osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()), sizeof(t) * v.size());
- }
-
- }; // class SparseMemMap
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_MEM_MAP_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mem_table.hpp b/contrib/libosmium/osmium/index/map/sparse_mem_table.hpp
deleted file mode 100644
index 032400e..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mem_table.hpp
+++ /dev/null
@@ -1,147 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MEM_TABLE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#ifdef OSMIUM_WITH_SPARSEHASH
-
-#include <cstddef>
-#include <utility>
-#include <vector>
-
-#include <google/sparsetable>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/map.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_TABLE
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- /**
- * The SparseMemTable index stores elements in a Google sparsetable,
- * a data structure that can hold sparsly filled tables in a
- * space efficient way. It will resize automatically.
- *
- * Use this index if the ID space is only sparsly
- * populated, such as when working with smaller OSM files (like
- * country extracts).
- *
- * This will only work on 64 bit machines.
- */
- template <typename TId, typename TValue>
- class SparseMemTable : public osmium::index::map::Map<TId, TValue> {
-
- TId m_grow_size;
-
- google::sparsetable<TValue> m_elements;
-
- static_assert(sizeof(typename google::sparsetable<TValue>::size_type) >= 8, "google::sparsetable needs 64bit machine");
-
- public:
-
- /**
- * Constructor.
- *
- * @param grow_size The initial size of the index (ie number of
- * elements that fit into the index).
- * The storage will grow by at least this size
- * every time it runs out of space.
- */
- explicit SparseMemTable(const TId grow_size = 10000) :
- m_grow_size(grow_size),
- m_elements(grow_size) {
- }
-
- ~SparseMemTable() noexcept override final = default;
-
- void set(const TId id, const TValue value) override final {
- if (id >= m_elements.size()) {
- m_elements.resize(id + m_grow_size);
- }
- m_elements[id] = value;
- }
-
- const TValue get(const TId id) const override final {
- if (id >= m_elements.size()) {
- not_found_error(id);
- }
- if (m_elements[id] == osmium::index::empty_value<TValue>()) {
- not_found_error(id);
- }
- return m_elements[id];
- }
-
- size_t size() const override final {
- return m_elements.size();
- }
-
- size_t used_memory() const override final {
- // unused elements use 1 bit, used elements sizeof(TValue) bytes
- // http://google-sparsehash.googlecode.com/svn/trunk/doc/sparsetable.html
- return (m_elements.size() / 8) + (m_elements.num_nonempty() * sizeof(TValue));
- }
-
- void clear() override final {
- m_elements.clear();
- }
-
- void dump_as_list(const int fd) override final {
- std::vector<std::pair<TId, TValue>> v;
- v.reserve(m_elements.size());
- int n = 0;
- for (const TValue value : m_elements) {
- if (value != osmium::index::empty_value<TValue>()) {
- v.emplace_back(n, value);
- }
- ++n;
- }
- osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()), sizeof(std::pair<TId, TValue>) * v.size());
- }
-
- }; // class SparseMemTable
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_WITH_SPARSEHASH
-
-#endif // OSMIUM_INDEX_BYID_SPARSE_MEM_TABLE_HPP
diff --git a/contrib/libosmium/osmium/index/map/sparse_mmap_array.hpp b/contrib/libosmium/osmium/index/map/sparse_mmap_array.hpp
deleted file mode 100644
index c85e2c9..0000000
--- a/contrib/libosmium/osmium/index/map/sparse_mmap_array.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_INDEX_MAP_SPARSE_MMAP_ARRAY_HPP
-#define OSMIUM_INDEX_MAP_SPARSE_MMAP_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_anon.hpp>
-#include <osmium/index/detail/vector_map.hpp>
-
-#define OSMIUM_HAS_INDEX_MAP_SPARSE_MMAP_ARRAY
-
-namespace osmium {
-
- namespace index {
-
- namespace map {
-
- template <typename TId, typename TValue>
- using SparseMmapArray = VectorBasedSparseMap<TId, TValue, osmium::detail::mmap_vector_anon>;
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_MAP_SPARSE_MMAP_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/multimap.hpp b/contrib/libosmium/osmium/index/multimap.hpp
deleted file mode 100644
index c817b6f..0000000
--- a/contrib/libosmium/osmium/index/multimap.hpp
+++ /dev/null
@@ -1,127 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_HPP
-#define OSMIUM_INDEX_MULTIMAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <stdexcept>
-#include <type_traits>
-#include <utility>
-
-namespace osmium {
-
- namespace index {
-
- /**
- * @brief Key-value containers with multiple values for an integer key
- */
- namespace multimap {
-
- template <typename TId, typename TValue>
- class Multimap {
-
- static_assert(std::is_integral<TId>::value && std::is_unsigned<TId>::value, "TId template parameter for class Multimap must be unsigned integral type");
-
- typedef typename std::pair<TId, TValue> element_type;
-
- Multimap(const Multimap&) = delete;
- Multimap& operator=(const Multimap&) = delete;
-
- protected:
-
- Multimap(Multimap&&) = default;
- Multimap& operator=(Multimap&&) = default;
-
- public:
-
- /// The "key" type, usually osmium::unsigned_object_id_type.
- typedef TId key_type;
-
- /// The "value" type, usually a Location or size_t.
- typedef TValue value_type;
-
- Multimap() = default;
-
- virtual ~Multimap() noexcept = default;
-
- /// Set the field with id to value.
- virtual void set(const TId id, const TValue value) = 0;
-
- typedef element_type* iterator;
-
-// virtual std::pair<iterator, iterator> get_all(const TId id) const = 0;
-
- /**
- * Get the approximate number of items in the storage. The storage
- * might allocate memory in blocks, so this size might not be
- * accurate. You can not use this to find out how much memory the
- * storage uses. Use used_memory() for that.
- */
- virtual size_t size() const = 0;
-
- /**
- * Get the memory used for this storage in bytes. Note that this
- * is not necessarily entirely accurate but an approximation.
- * For storage classes that store the data in memory, this is
- * the main memory used, for storage classes storing data on disk
- * this is the memory used on disk.
- */
- virtual size_t used_memory() const = 0;
-
- /**
- * Clear memory used for this storage. After this you can not
- * use the storage container any more.
- */
- virtual void clear() = 0;
-
- /**
- * Sort data in map. Call this after writing all data and
- * before reading. Not all implementations need this.
- */
- virtual void sort() {
- // default implementation is empty
- }
-
- virtual void dump_as_list(const int /*fd*/) {
- std::runtime_error("can't dump as list");
- }
-
- }; // class Multimap
-
- } // namespace map
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/all.hpp b/contrib/libosmium/osmium/index/multimap/all.hpp
deleted file mode 100644
index 8b0ae99..0000000
--- a/contrib/libosmium/osmium/index/multimap/all.hpp
+++ /dev/null
@@ -1,41 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_ALL_HPP
-#define OSMIUM_INDEX_MULTIMAP_ALL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/index/multimap/sparse_file_array.hpp> // IWYU pragma: keep
-#include <osmium/index/multimap/sparse_mem_array.hpp> // IWYU pragma: keep
-#include <osmium/index/multimap/sparse_mem_multimap.hpp> // IWYU pragma: keep
-#include <osmium/index/multimap/sparse_mmap_array.hpp> // IWYU pragma: keep
-
-#endif // OSMIUM_INDEX_MULTIMAP_ALL_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/hybrid.hpp b/contrib/libosmium/osmium/index/multimap/hybrid.hpp
deleted file mode 100644
index cdf14a3..0000000
--- a/contrib/libosmium/osmium/index/multimap/hybrid.hpp
+++ /dev/null
@@ -1,204 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_HYBRID_HPP
-#define OSMIUM_INDEX_MULTIMAP_HYBRID_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <utility>
-
-#include <osmium/index/index.hpp>
-#include <osmium/index/multimap.hpp>
-#include <osmium/index/multimap/sparse_mem_array.hpp>
-#include <osmium/index/multimap/sparse_mem_multimap.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace multimap {
-
- template <typename TId, typename TValue>
- class HybridIterator {
-
- typedef SparseMemArray<TId, TValue> main_map_type;
- typedef SparseMemMultimap<TId, TValue> extra_map_type;
-
- typedef typename std::pair<TId, TValue> element_type;
-
- typename main_map_type::iterator m_begin_main;
- typename main_map_type::iterator m_end_main;
- typename extra_map_type::iterator m_begin_extra;
- typename extra_map_type::iterator m_end_extra;
-
- public:
-
- HybridIterator(typename main_map_type::iterator begin_main,
- typename main_map_type::iterator end_main,
- typename extra_map_type::iterator begin_extra,
- typename extra_map_type::iterator end_extra) :
- m_begin_main(begin_main),
- m_end_main(end_main),
- m_begin_extra(begin_extra),
- m_end_extra(end_extra) {
- }
-
- ~HybridIterator() noexcept = default;
-
- HybridIterator& operator++() {
- if (m_begin_main == m_end_main) {
- ++m_begin_extra;
- } else {
- ++m_begin_main;
- while (m_begin_main != m_end_main && m_begin_main->second == osmium::index::empty_value<TValue>()) { // ignore removed elements
- ++m_begin_main;
- }
- }
- return *this;
- }
-
- HybridIterator<TId, TValue> operator++(int) {
- auto tmp(*this);
- operator++();
- return tmp;
- }
-
- bool operator==(const HybridIterator& rhs) const {
- return m_begin_main == rhs.m_begin_main &&
- m_end_main == rhs.m_end_main &&
- m_begin_extra == rhs.m_begin_extra &&
- m_end_extra == rhs.m_end_extra;
- }
-
- bool operator!=(const HybridIterator& rhs) const {
- return ! operator==(rhs);
- }
-
- const element_type& operator*() {
- if (m_begin_main == m_end_main) {
- return *m_begin_extra;
- } else {
- return *m_begin_main;
- }
- }
-
- const element_type* operator->() {
- return &operator*();
- }
-
- }; // class HybridIterator
-
- template <typename TId, typename TValue>
- class Hybrid : public Multimap<TId, TValue> {
-
- typedef SparseMemArray<TId, TValue> main_map_type;
- typedef SparseMemMultimap<TId, TValue> extra_map_type;
-
- main_map_type m_main;
- extra_map_type m_extra;
-
- public:
-
- typedef HybridIterator<TId, TValue> iterator;
- typedef const HybridIterator<TId, TValue> const_iterator;
-
- Hybrid() :
- m_main(),
- m_extra() {
- }
-
- ~Hybrid() noexcept = default;
-
- size_t size() const override final {
- return m_main.size() + m_extra.size();
- }
-
- size_t used_memory() const override final {
- return m_main.used_memory() + m_extra.used_memory();
- }
-
- void reserve(const size_t size) {
- m_main.reserve(size);
- }
-
- void unsorted_set(const TId id, const TValue value) {
- m_main.set(id, value);
- }
-
- void set(const TId id, const TValue value) override final {
- m_extra.set(id, value);
- }
-
- std::pair<iterator, iterator> get_all(const TId id) {
- auto result_main = m_main.get_all(id);
- auto result_extra = m_extra.get_all(id);
- return std::make_pair(iterator(result_main.first, result_main.second, result_extra.first, result_extra.second),
- iterator(result_main.second, result_main.second, result_extra.second, result_extra.second));
- }
-
- void remove(const TId id, const TValue value) {
- m_main.remove(id, value);
- m_extra.remove(id, value);
- }
-
- void consolidate() {
- m_main.erase_removed();
- for (const auto& element : m_extra) {
- m_main.set(element.first, element.second);
- }
- m_extra.clear();
- m_main.sort();
- }
-
- void dump_as_list(const int fd) override final {
- consolidate();
- m_main.dump_as_list(fd);
- }
-
- void clear() override final {
- m_main.clear();
- m_extra.clear();
- }
-
- void sort() override final {
- m_main.sort();
- }
-
- }; // class Hybrid
-
- } // namespace multimap
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_HYBRID_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_file_array.hpp b/contrib/libosmium/osmium/index/multimap/sparse_file_array.hpp
deleted file mode 100644
index 0b9ae92..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_file_array.hpp
+++ /dev/null
@@ -1,54 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_FILE_ARRAY_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_FILE_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/index/detail/mmap_vector_file.hpp>
-#include <osmium/index/detail/vector_multimap.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace multimap {
-
- template <typename TId, typename TValue>
- using SparseFileArray = VectorBasedSparseMultimap<TId, TValue, osmium::detail::mmap_vector_file>;
-
- } // namespace multimap
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_FILE_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_mem_array.hpp b/contrib/libosmium/osmium/index/multimap/sparse_mem_array.hpp
deleted file mode 100644
index c4140cb..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_mem_array.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_ARRAY_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <vector>
-
-#include <osmium/index/detail/vector_multimap.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace multimap {
-
- template <typename T>
- using StdVectorWrap = std::vector<T>;
-
- template <typename TId, typename TValue>
- using SparseMemArray = VectorBasedSparseMultimap<TId, TValue, StdVectorWrap>;
-
- } // namespace multimap
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_mem_multimap.hpp b/contrib/libosmium/osmium/index/multimap/sparse_mem_multimap.hpp
deleted file mode 100644
index 353e357..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_mem_multimap.hpp
+++ /dev/null
@@ -1,151 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_MULTIMAP_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_MULTIMAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <map>
-#include <utility>
-#include <vector>
-
-#include <osmium/index/multimap.hpp>
-#include <osmium/io/detail/read_write.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace multimap {
-
- /**
- * This implementation uses std::multimap internally. It uses rather a
- * lot of memory, but might make sense for small maps.
- */
- template <typename TId, typename TValue>
- class SparseMemMultimap : public osmium::index::multimap::Multimap<TId, TValue> {
-
- // This is a rough estimate for the memory needed for each
- // element in the map (id + value + pointers to left, right,
- // and parent plus some overhead for color of red-black-tree
- // or similar).
- static constexpr size_t element_size = sizeof(TId) + sizeof(TValue) + sizeof(void*) * 4;
-
- public:
-
- typedef typename std::multimap<const TId, TValue> collection_type;
- typedef typename collection_type::iterator iterator;
- typedef typename collection_type::const_iterator const_iterator;
- typedef typename collection_type::value_type value_type;
-
- typedef typename std::pair<TId, TValue> element_type;
-
- private:
-
- collection_type m_elements;
-
- public:
-
- SparseMemMultimap() = default;
-
- ~SparseMemMultimap() noexcept override final = default;
-
- void unsorted_set(const TId id, const TValue value) {
- m_elements.emplace(id, value);
- }
-
- void set(const TId id, const TValue value) override final {
- m_elements.emplace(id, value);
- }
-
- std::pair<iterator, iterator> get_all(const TId id) {
- return m_elements.equal_range(id);
- }
-
- std::pair<const_iterator, const_iterator> get_all(const TId id) const {
- return m_elements.equal_range(id);
- }
-
- void remove(const TId id, const TValue value) {
- std::pair<iterator, iterator> r = get_all(id);
- for (iterator it = r.first; it != r.second; ++it) {
- if (it->second == value) {
- m_elements.erase(it);
- return;
- }
- }
- }
-
- iterator begin() {
- return m_elements.begin();
- }
-
- iterator end() {
- return m_elements.end();
- }
-
- size_t size() const override final {
- return m_elements.size();
- }
-
- size_t used_memory() const override final {
- return element_size * m_elements.size();
- }
-
- void clear() override final {
- m_elements.clear();
- }
-
- void consolidate() {
- // intentionally left blank
- }
-
- void dump_as_list(const int fd) override final {
- std::vector<element_type> v;
- v.reserve(m_elements.size());
- for (const auto& element : m_elements) {
- v.emplace_back(element.first, element.second);
- }
- std::sort(v.begin(), v.end());
- osmium::io::detail::reliable_write(fd, reinterpret_cast<const char*>(v.data()), sizeof(element_type) * v.size());
- }
-
- }; // class SparseMemMultimap
-
- } // namespace multimap
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_MEM_MULTIMAP_HPP
diff --git a/contrib/libosmium/osmium/index/multimap/sparse_mmap_array.hpp b/contrib/libosmium/osmium/index/multimap/sparse_mmap_array.hpp
deleted file mode 100644
index 9f92555..0000000
--- a/contrib/libosmium/osmium/index/multimap/sparse_mmap_array.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef OSMIUM_INDEX_MULTIMAP_SPARSE_MMAP_ARRAY_HPP
-#define OSMIUM_INDEX_MULTIMAP_SPARSE_MMAP_ARRAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#ifdef __linux__
-
-#include <osmium/index/detail/mmap_vector_anon.hpp>
-#include <osmium/index/detail/vector_multimap.hpp>
-
-namespace osmium {
-
- namespace index {
-
- namespace multimap {
-
- template <typename TId, typename TValue>
- using SparseMmapArray = VectorBasedSparseMultimap<TId, TValue, osmium::detail::mmap_vector_anon>;
-
- } // namespace multimap
-
- } // namespace index
-
-} // namespace osmium
-
-#endif // __linux__
-
-#endif // OSMIUM_INDEX_MULTIMAP_SPARSE_MMAP_ARRAY_HPP
diff --git a/contrib/libosmium/osmium/index/node_locations_map.hpp b/contrib/libosmium/osmium/index/node_locations_map.hpp
deleted file mode 100644
index ca4b136..0000000
--- a/contrib/libosmium/osmium/index/node_locations_map.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef OSMIUM_INDEX_NODE_LOCATIONS_MAP_HPP
-#define OSMIUM_INDEX_NODE_LOCATIONS_MAP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/index/map.hpp> // IWYU pragma: keep
-
-#ifdef OSMIUM_HAS_INDEX_MAP_DENSE_FILE_ARRAY
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::DenseFileArray, dense_file_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_DENSE_MEM_ARRAY
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::DenseMemArray, dense_mem_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_DENSE_MMAP_ARRAY
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::DenseMmapArray, dense_mmap_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_FILE_ARRAY
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseFileArray, sparse_file_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_ARRAY
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMemArray, sparse_mem_array)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_MAP
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMemMap, sparse_mem_map)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MEM_TABLE
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMemTable, sparse_mem_table)
-#endif
-
-#ifdef OSMIUM_HAS_INDEX_MAP_SPARSE_MMAP_ARRAY
- REGISTER_MAP(osmium::unsigned_object_id_type, osmium::Location, osmium::index::map::SparseMmapArray, sparse_mmap_array)
-#endif
-
-#endif // OSMIUM_INDEX_NODE_LOCATIONS_MAP_HPP
diff --git a/contrib/libosmium/osmium/io/any_compression.hpp b/contrib/libosmium/osmium/io/any_compression.hpp
deleted file mode 100644
index 00e8ee2..0000000
--- a/contrib/libosmium/osmium/io/any_compression.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_ANY_COMPRESSION_HPP
-#define OSMIUM_IO_ANY_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read or write compressed OSM XML files.
- *
- * @attention If you include this file, you'll need to link with `libz`
- * and `libbz2`.
- */
-
-#include <osmium/io/bzip2_compression.hpp> // IWYU pragma: export
-#include <osmium/io/gzip_compression.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_ANY_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/any_input.hpp b/contrib/libosmium/osmium/io/any_input.hpp
deleted file mode 100644
index 36f43b7..0000000
--- a/contrib/libosmium/osmium/io/any_input.hpp
+++ /dev/null
@@ -1,52 +0,0 @@
-#ifndef OSMIUM_IO_ANY_INPUT_HPP
-#define OSMIUM_IO_ANY_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read all kinds of OSM files.
- *
- * @attention If you include this file, you'll need to link with
- * `ws2_32` (Windows only), `libexpat`, `libz`, `libbz2`,
- * and enable multithreading.
- */
-
-#include <osmium/io/any_compression.hpp> // IWYU pragma: export
-
-#include <osmium/io/pbf_input.hpp> // IWYU pragma: export
-#include <osmium/io/xml_input.hpp> // IWYU pragma: export
-#include <osmium/io/o5m_input.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_ANY_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/any_output.hpp b/contrib/libosmium/osmium/io/any_output.hpp
deleted file mode 100644
index 990a27b..0000000
--- a/contrib/libosmium/osmium/io/any_output.hpp
+++ /dev/null
@@ -1,53 +0,0 @@
-#ifndef OSMIUM_IO_ANY_OUTPUT_HPP
-#define OSMIUM_IO_ANY_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to write all kinds of OSM files.
- *
- * @attention If you include this file, you'll need to link with
- * `ws2_32` (Windows only), `libz`, `libbz2`, and enable
- * multithreading.
- */
-
-#include <osmium/io/any_compression.hpp> // IWYU pragma: export
-
-#include <osmium/io/debug_output.hpp> // IWYU pragma: export
-#include <osmium/io/opl_output.hpp> // IWYU pragma: export
-#include <osmium/io/pbf_output.hpp> // IWYU pragma: export
-#include <osmium/io/xml_output.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_ANY_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/bzip2_compression.hpp b/contrib/libosmium/osmium/io/bzip2_compression.hpp
deleted file mode 100644
index ad4b877..0000000
--- a/contrib/libosmium/osmium/io/bzip2_compression.hpp
+++ /dev/null
@@ -1,321 +0,0 @@
-#ifndef OSMIUM_IO_BZIP2_COMPRESSION_HPP
-#define OSMIUM_IO_BZIP2_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read or write bzip2-compressed OSM XML
- * files.
- *
- * @attention If you include this file, you'll need to link with `libbz2`.
- */
-
-#include <cerrno>
-#include <cstddef>
-#include <cstdio>
-#include <stdexcept>
-#include <string>
-
-#include <bzlib.h>
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#endif
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown when there are problems compressing or
- * decompressing bzip2 files.
- */
- struct bzip2_error : public io_error {
-
- int bzip2_error_code;
- int system_errno;
-
- bzip2_error(const std::string& what, int error_code) :
- io_error(what),
- bzip2_error_code(error_code),
- system_errno(error_code == BZ_IO_ERROR ? errno : 0) {
- }
-
- }; // struct bzip2_error
-
- namespace io {
-
- namespace detail {
-
- OSMIUM_NORETURN inline void throw_bzip2_error(BZFILE* bzfile, const char* msg, int bzlib_error = 0) {
- std::string error("bzip2 error: ");
- error += msg;
- error += ": ";
- int errnum = bzlib_error;
- if (bzlib_error) {
- error += std::to_string(bzlib_error);
- } else {
- error += ::BZ2_bzerror(bzfile, &errnum);
- }
- throw osmium::bzip2_error(error, errnum);
- }
-
- } // namespace detail
-
- class Bzip2Compressor : public Compressor {
-
- FILE* m_file;
- int m_bzerror;
- BZFILE* m_bzfile;
-
- public:
-
- explicit Bzip2Compressor(int fd, fsync sync) :
- Compressor(sync),
- m_file(fdopen(dup(fd), "wb")),
- m_bzerror(BZ_OK),
- m_bzfile(::BZ2_bzWriteOpen(&m_bzerror, m_file, 6, 0, 0)) {
- if (!m_bzfile) {
- detail::throw_bzip2_error(m_bzfile, "write open failed", m_bzerror);
- }
- }
-
- ~Bzip2Compressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- void write(const std::string& data) override final {
- int error;
- ::BZ2_bzWrite(&error, m_bzfile, const_cast<char*>(data.data()), static_cast_with_assert<int>(data.size()));
- if (error != BZ_OK && error != BZ_STREAM_END) {
- detail::throw_bzip2_error(m_bzfile, "write failed", error);
- }
- }
-
- void close() override final {
- if (m_bzfile) {
- int error;
- ::BZ2_bzWriteClose(&error, m_bzfile, 0, nullptr, nullptr);
- m_bzfile = nullptr;
- if (m_file) {
- if (do_fsync()) {
- osmium::io::detail::reliable_fsync(::fileno(m_file));
- }
- if (fclose(m_file) != 0) {
- throw std::system_error(errno, std::system_category(), "Close failed");
- }
- }
- if (error != BZ_OK) {
- detail::throw_bzip2_error(m_bzfile, "write close failed", error);
- }
- }
- }
-
- }; // class Bzip2Compressor
-
- class Bzip2Decompressor : public Decompressor {
-
- FILE* m_file;
- int m_bzerror;
- BZFILE* m_bzfile;
- bool m_stream_end {false};
-
- public:
-
- Bzip2Decompressor(int fd) :
- Decompressor(),
- m_file(fdopen(dup(fd), "rb")),
- m_bzerror(BZ_OK),
- m_bzfile(::BZ2_bzReadOpen(&m_bzerror, m_file, 0, 0, nullptr, 0)) {
- if (!m_bzfile) {
- detail::throw_bzip2_error(m_bzfile, "read open failed", m_bzerror);
- }
- }
-
- ~Bzip2Decompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- std::string read() override final {
- std::string buffer;
-
- if (!m_stream_end) {
- buffer.resize(osmium::io::Decompressor::input_buffer_size);
- int error;
- int nread = ::BZ2_bzRead(&error, m_bzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<int>(buffer.size()));
- if (error != BZ_OK && error != BZ_STREAM_END) {
- detail::throw_bzip2_error(m_bzfile, "read failed", error);
- }
- if (error == BZ_STREAM_END) {
- void* unused;
- int nunused;
- if (! feof(m_file)) {
- ::BZ2_bzReadGetUnused(&error, m_bzfile, &unused, &nunused);
- if (error != BZ_OK) {
- detail::throw_bzip2_error(m_bzfile, "get unused failed", error);
- }
- std::string unused_data(static_cast<const char*>(unused), static_cast<std::string::size_type>(nunused));
- ::BZ2_bzReadClose(&error, m_bzfile);
- if (error != BZ_OK) {
- detail::throw_bzip2_error(m_bzfile, "read close failed", error);
- }
- m_bzfile = ::BZ2_bzReadOpen(&error, m_file, 0, 0, const_cast<void*>(static_cast<const void*>(unused_data.data())), static_cast_with_assert<int>(unused_data.size()));
- if (error != BZ_OK) {
- detail::throw_bzip2_error(m_bzfile, "read open failed", error);
- }
- } else {
- m_stream_end = true;
- }
- }
- buffer.resize(static_cast<std::string::size_type>(nread));
- }
-
- return buffer;
- }
-
- void close() override final {
- if (m_bzfile) {
- int error;
- ::BZ2_bzReadClose(&error, m_bzfile);
- m_bzfile = nullptr;
- if (m_file) {
- if (fclose(m_file) != 0) {
- throw std::system_error(errno, std::system_category(), "Close failed");
- }
- }
- if (error != BZ_OK) {
- detail::throw_bzip2_error(m_bzfile, "read close failed", error);
- }
- }
- }
-
- }; // class Bzip2Decompressor
-
- class Bzip2BufferDecompressor : public Decompressor {
-
- const char* m_buffer;
- size_t m_buffer_size;
- bz_stream m_bzstream;
-
- public:
-
- Bzip2BufferDecompressor(const char* buffer, size_t size) :
- m_buffer(buffer),
- m_buffer_size(size),
- m_bzstream() {
- m_bzstream.next_in = const_cast<char*>(buffer);
- m_bzstream.avail_in = static_cast_with_assert<unsigned int>(size);
- int result = BZ2_bzDecompressInit(&m_bzstream, 0, 0);
- if (result != BZ_OK) {
- std::string message("bzip2 error: decompression init failed: ");
- throw bzip2_error(message, result);
- }
- }
-
- ~Bzip2BufferDecompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- std::string read() override final {
- std::string output;
-
- if (m_buffer) {
- const size_t buffer_size = 10240;
- output.resize(buffer_size);
- m_bzstream.next_out = const_cast<char*>(output.data());
- m_bzstream.avail_out = buffer_size;
- int result = BZ2_bzDecompress(&m_bzstream);
-
- if (result != BZ_OK) {
- m_buffer = nullptr;
- m_buffer_size = 0;
- }
-
- if (result != BZ_OK && result != BZ_STREAM_END) {
- std::string message("bzip2 error: decompress failed: ");
- throw bzip2_error(message, result);
- }
-
- output.resize(static_cast<unsigned long>(m_bzstream.next_out - output.data()));
- }
-
- return output;
- }
-
- void close() override final {
- BZ2_bzDecompressEnd(&m_bzstream);
- }
-
- }; // class Bzip2BufferDecompressor
-
- namespace detail {
-
- // we want the register_compression() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_bzip2_compression = osmium::io::CompressionFactory::instance().register_compression(osmium::io::file_compression::bzip2,
- [](int fd, fsync sync) { return new osmium::io::Bzip2Compressor(fd, sync); },
- [](int fd) { return new osmium::io::Bzip2Decompressor(fd); },
- [](const char* buffer, size_t size) { return new osmium::io::Bzip2BufferDecompressor(buffer, size); }
- );
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_bzip2_compression() noexcept {
- return registered_bzip2_compression;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_BZIP2_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/compression.hpp b/contrib/libosmium/osmium/io/compression.hpp
deleted file mode 100644
index 4a69be7..0000000
--- a/contrib/libosmium/osmium/io/compression.hpp
+++ /dev/null
@@ -1,321 +0,0 @@
-#ifndef OSMIUM_IO_COMPRESSION_HPP
-#define OSMIUM_IO_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <functional>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <system_error>
-#include <tuple>
-#include <utility>
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#else
-# include <io.h>
-#endif
-
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- namespace io {
-
- class Compressor {
-
- fsync m_fsync;
-
- protected:
-
- bool do_fsync() const {
- return m_fsync == fsync::yes;
- }
-
- public:
-
- explicit Compressor(fsync sync) :
- m_fsync(sync) {
- }
-
- virtual ~Compressor() noexcept {
- }
-
- virtual void write(const std::string& data) = 0;
-
- virtual void close() = 0;
-
- }; // class Compressor
-
- class Decompressor {
-
- public:
-
- static constexpr unsigned int input_buffer_size = 1024 * 1024;
-
- Decompressor() = default;
-
- Decompressor(const Decompressor&) = delete;
- Decompressor& operator=(const Decompressor&) = delete;
-
- Decompressor(Decompressor&&) = delete;
- Decompressor& operator=(Decompressor&&) = delete;
-
- virtual ~Decompressor() noexcept {
- }
-
- virtual std::string read() = 0;
-
- virtual void close() = 0;
-
- }; // class Decompressor
-
- /**
- * This singleton factory class is used to register compression
- * algorithms used for reading and writing OSM files.
- *
- * For each algorithm we store two functions that construct
- * a compressor and decompressor object, respectively.
- */
- class CompressionFactory {
-
- public:
-
- typedef std::function<osmium::io::Compressor*(int, fsync)> create_compressor_type;
- typedef std::function<osmium::io::Decompressor*(int)> create_decompressor_type_fd;
- typedef std::function<osmium::io::Decompressor*(const char*, size_t)> create_decompressor_type_buffer;
-
- private:
-
- typedef std::map<const osmium::io::file_compression,
- std::tuple<create_compressor_type,
- create_decompressor_type_fd,
- create_decompressor_type_buffer>> compression_map_type;
-
- compression_map_type m_callbacks;
-
- CompressionFactory() = default;
-
- CompressionFactory(const CompressionFactory&) = delete;
- CompressionFactory& operator=(const CompressionFactory&) = delete;
-
- CompressionFactory(CompressionFactory&&) = delete;
- CompressionFactory& operator=(CompressionFactory&&) = delete;
-
- OSMIUM_NORETURN void error(osmium::io::file_compression compression) {
- std::string error_message {"Support for compression '"};
- error_message += as_string(compression);
- error_message += "' not compiled into this binary.";
- throw unsupported_file_format_error(error_message);
- }
-
- public:
-
- static CompressionFactory& instance() {
- static CompressionFactory factory;
- return factory;
- }
-
- bool register_compression(
- osmium::io::file_compression compression,
- create_compressor_type create_compressor,
- create_decompressor_type_fd create_decompressor_fd,
- create_decompressor_type_buffer create_decompressor_buffer) {
-
- compression_map_type::value_type cc(compression,
- std::make_tuple(create_compressor,
- create_decompressor_fd,
- create_decompressor_buffer));
-
- return m_callbacks.insert(cc).second;
- }
-
- template <typename... TArgs>
- std::unique_ptr<osmium::io::Compressor> create_compressor(osmium::io::file_compression compression, TArgs&&... args) {
- auto it = m_callbacks.find(compression);
-
- if (it != m_callbacks.end()) {
- return std::unique_ptr<osmium::io::Compressor>(std::get<0>(it->second)(std::forward<TArgs>(args)...));
- }
-
- error(compression);
- }
-
- std::unique_ptr<osmium::io::Decompressor> create_decompressor(osmium::io::file_compression compression, int fd) {
- auto it = m_callbacks.find(compression);
-
- if (it != m_callbacks.end()) {
- return std::unique_ptr<osmium::io::Decompressor>(std::get<1>(it->second)(fd));
- }
-
- error(compression);
- }
-
- std::unique_ptr<osmium::io::Decompressor> create_decompressor(osmium::io::file_compression compression, const char* buffer, size_t size) {
- auto it = m_callbacks.find(compression);
-
- if (it != m_callbacks.end()) {
- return std::unique_ptr<osmium::io::Decompressor>(std::get<2>(it->second)(buffer, size));
- }
-
- error(compression);
- }
-
- }; // class CompressionFactory
-
- class NoCompressor : public Compressor {
-
- int m_fd;
-
- public:
-
- NoCompressor(int fd, fsync sync) :
- Compressor(sync),
- m_fd(fd) {
- }
-
- ~NoCompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- void write(const std::string& data) override final {
- osmium::io::detail::reliable_write(m_fd, data.data(), data.size());
- }
-
- void close() override final {
- if (m_fd >= 0) {
- int fd = m_fd;
- m_fd = -1;
- if (do_fsync()) {
- osmium::io::detail::reliable_fsync(fd);
- }
- osmium::io::detail::reliable_close(fd);
- }
- }
-
- }; // class NoCompressor
-
- class NoDecompressor : public Decompressor {
-
- int m_fd;
- const char *m_buffer;
- size_t m_buffer_size;
-
- public:
-
- NoDecompressor(int fd) :
- Decompressor(),
- m_fd(fd),
- m_buffer(nullptr),
- m_buffer_size(0) {
- }
-
- NoDecompressor(const char* buffer, size_t size) :
- Decompressor(),
- m_fd(-1),
- m_buffer(buffer),
- m_buffer_size(size) {
- }
-
- ~NoDecompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- std::string read() override final {
- std::string buffer;
-
- if (m_buffer) {
- if (m_buffer_size != 0) {
- size_t size = m_buffer_size;
- m_buffer_size = 0;
- buffer.append(m_buffer, size);
- }
- } else {
- buffer.resize(osmium::io::Decompressor::input_buffer_size);
- auto nread = ::read(m_fd, const_cast<char*>(buffer.data()), osmium::io::Decompressor::input_buffer_size);
- if (nread < 0) {
- throw std::system_error(errno, std::system_category(), "Read failed");
- }
- buffer.resize(std::string::size_type(nread));
- }
-
- return buffer;
- }
-
- void close() override final {
- if (m_fd >= 0) {
- int fd = m_fd;
- m_fd = -1;
- osmium::io::detail::reliable_close(fd);
- }
- }
-
- }; // class NoDecompressor
-
- namespace detail {
-
- // we want the register_compression() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_no_compression = osmium::io::CompressionFactory::instance().register_compression(osmium::io::file_compression::none,
- [](int fd, fsync sync) { return new osmium::io::NoCompressor(fd, sync); },
- [](int fd) { return new osmium::io::NoDecompressor(fd); },
- [](const char* buffer, size_t size) { return new osmium::io::NoDecompressor(buffer, size); }
- );
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_no_compression() noexcept {
- return registered_no_compression;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/debug_output.hpp b/contrib/libosmium/osmium/io/debug_output.hpp
deleted file mode 100644
index 2836f79..0000000
--- a/contrib/libosmium/osmium/io/debug_output.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OSMIUM_IO_DEBUG_OUTPUT_HPP
-#define OSMIUM_IO_DEBUG_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/debug_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_DEBUG_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/debug_output_format.hpp b/contrib/libosmium/osmium/io/detail/debug_output_format.hpp
deleted file mode 100644
index 90ec199..0000000
--- a/contrib/libosmium/osmium/io/detail/debug_output_format.hpp
+++ /dev/null
@@ -1,485 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_DEBUG_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_DEBUG_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cinttypes>
-#include <cstddef>
-#include <cstdint>
-#include <cstdio>
-#include <future>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/util/minmax.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- namespace io {
-
- class File;
-
- namespace detail {
-
- constexpr const char* color_bold = "\x1b[1m";
- constexpr const char* color_black = "\x1b[30m";
- constexpr const char* color_gray = "\x1b[30;1m";
- constexpr const char* color_red = "\x1b[31m";
- constexpr const char* color_green = "\x1b[32m";
- constexpr const char* color_yellow = "\x1b[33m";
- constexpr const char* color_blue = "\x1b[34m";
- constexpr const char* color_magenta = "\x1b[35m";
- constexpr const char* color_cyan = "\x1b[36m";
- constexpr const char* color_white = "\x1b[37m";
- constexpr const char* color_reset = "\x1b[0m";
-
- struct debug_output_options {
-
- /// Should metadata of objects be added?
- bool add_metadata;
-
- /// Output with ANSI colors?
- bool use_color;
-
- };
-
- /**
- * Writes out one buffer with OSM data in Debug format.
- */
- class DebugOutputBlock : public OutputBlock {
-
- debug_output_options m_options;
-
- const char* m_utf8_prefix = "";
- const char* m_utf8_suffix = "";
-
- void append_encoded_string(const char* data) {
- append_debug_encoded_string(*m_out, data, m_utf8_prefix, m_utf8_suffix);
- }
-
- void write_color(const char* color) {
- if (m_options.use_color) {
- *m_out += color;
- }
- }
-
- void write_string(const char* string) {
- *m_out += '"';
- write_color(color_blue);
- append_encoded_string(string);
- write_color(color_reset);
- *m_out += '"';
- }
-
- void write_object_type(const char* object_type, bool visible = true) {
- if (visible) {
- write_color(color_bold);
- } else {
- write_color(color_white);
- }
- *m_out += object_type;
- write_color(color_reset);
- *m_out += ' ';
- }
-
- void write_fieldname(const char* name) {
- *m_out += " ";
- write_color(color_cyan);
- *m_out += name;
- write_color(color_reset);
- *m_out += ": ";
- }
-
- void write_comment_field(const char* name) {
- write_color(color_cyan);
- *m_out += name;
- write_color(color_reset);
- *m_out += ": ";
- }
-
- void write_counter(int width, int n) {
- write_color(color_white);
- output_formatted(" %0*d: ", width, n++);
- write_color(color_reset);
- }
-
- void write_error(const char* msg) {
- write_color(color_red);
- *m_out += msg;
- write_color(color_reset);
- }
-
- void write_timestamp(const osmium::Timestamp& timestamp) {
- if (timestamp.valid()) {
- *m_out += timestamp.to_iso();
- output_formatted(" (%d)", timestamp.seconds_since_epoch());
- } else {
- write_error("NOT SET");
- }
- *m_out += '\n';
- }
-
- void write_meta(const osmium::OSMObject& object) {
- output_formatted("%" PRId64 "\n", object.id());
- if (m_options.add_metadata) {
- write_fieldname("version");
- output_formatted(" %d", object.version());
- if (object.visible()) {
- *m_out += " visible\n";
- } else {
- write_error(" deleted\n");
- }
- write_fieldname("changeset");
- output_formatted("%d\n", object.changeset());
- write_fieldname("timestamp");
- write_timestamp(object.timestamp());
- write_fieldname("user");
- output_formatted(" %d ", object.uid());
- write_string(object.user());
- *m_out += '\n';
- }
- }
-
- void write_tags(const osmium::TagList& tags, const char* padding="") {
- if (!tags.empty()) {
- write_fieldname("tags");
- *m_out += padding;
- output_formatted(" %d\n", tags.size());
-
- osmium::max_op<size_t> max;
- for (const auto& tag : tags) {
- max.update(std::strlen(tag.key()));
- }
- for (const auto& tag : tags) {
- *m_out += " ";
- write_string(tag.key());
- auto spacing = max() - std::strlen(tag.key());
- while (spacing--) {
- *m_out += " ";
- }
- *m_out += " = ";
- write_string(tag.value());
- *m_out += '\n';
- }
- }
- }
-
- void write_location(const osmium::Location& location) {
- write_fieldname("lon/lat");
- output_formatted(" %.7f,%.7f", location.lon_without_check(), location.lat_without_check());
- if (!location.valid()) {
- write_error(" INVALID LOCATION!");
- }
- *m_out += '\n';
- }
-
- void write_box(const osmium::Box& box) {
- write_fieldname("box l/b/r/t");
- if (!box) {
- write_error("BOX NOT SET!\n");
- return;
- }
- const auto& bl = box.bottom_left();
- const auto& tr = box.top_right();
- output_formatted("%.7f,%.7f %.7f,%.7f", bl.lon_without_check(), bl.lat_without_check(), tr.lon_without_check(), tr.lat_without_check());
- if (!box.valid()) {
- write_error(" INVALID BOX!");
- }
- *m_out += '\n';
- }
-
- public:
-
- DebugOutputBlock(osmium::memory::Buffer&& buffer, const debug_output_options& options) :
- OutputBlock(std::move(buffer)),
- m_options(options),
- m_utf8_prefix(options.use_color ? color_red : ""),
- m_utf8_suffix(options.use_color ? color_blue : "") {
- }
-
- DebugOutputBlock(const DebugOutputBlock&) = default;
- DebugOutputBlock& operator=(const DebugOutputBlock&) = default;
-
- DebugOutputBlock(DebugOutputBlock&&) = default;
- DebugOutputBlock& operator=(DebugOutputBlock&&) = default;
-
- ~DebugOutputBlock() noexcept = default;
-
- std::string operator()() {
- osmium::apply(m_input_buffer->cbegin(), m_input_buffer->cend(), *this);
-
- std::string out;
- using std::swap;
- swap(out, *m_out);
-
- return out;
- }
-
- void node(const osmium::Node& node) {
- write_object_type("node", node.visible());
- write_meta(node);
-
- if (node.visible()) {
- write_location(node.location());
- }
-
- write_tags(node.tags());
-
- *m_out += '\n';
- }
-
- void way(const osmium::Way& way) {
- write_object_type("way", way.visible());
- write_meta(way);
- write_tags(way.tags());
-
- write_fieldname("nodes");
-
- output_formatted(" %d", way.nodes().size());
- if (way.nodes().size() < 2) {
- write_error(" LESS THAN 2 NODES!\n");
- } else if (way.nodes().size() > 2000) {
- write_error(" MORE THAN 2000 NODES!\n");
- } else if (way.nodes().is_closed()) {
- *m_out += " (closed)\n";
- } else {
- *m_out += " (open)\n";
- }
-
- int width = int(log10(way.nodes().size())) + 1;
- int n = 0;
- for (const auto& node_ref : way.nodes()) {
- write_counter(width, n++);
- output_formatted("%10" PRId64, node_ref.ref());
- if (node_ref.location().valid()) {
- output_formatted(" (%.7f,%.7f)", node_ref.location().lon_without_check(), node_ref.location().lat_without_check());
- }
- *m_out += '\n';
- }
-
- *m_out += '\n';
- }
-
- void relation(const osmium::Relation& relation) {
- static const char* short_typename[] = { "node", "way ", "rel " };
- write_object_type("relation", relation.visible());
- write_meta(relation);
- write_tags(relation.tags());
-
- write_fieldname("members");
- output_formatted(" %d\n", relation.members().size());
-
- int width = int(log10(relation.members().size())) + 1;
- int n = 0;
- for (const auto& member : relation.members()) {
- write_counter(width, n++);
- *m_out += short_typename[item_type_to_nwr_index(member.type())];
- output_formatted(" %10" PRId64 " ", member.ref());
- write_string(member.role());
- *m_out += '\n';
- }
-
- *m_out += '\n';
- }
-
- void changeset(const osmium::Changeset& changeset) {
- write_object_type("changeset");
- output_formatted("%d\n", changeset.id());
-
- write_fieldname("num changes");
- output_formatted("%d", changeset.num_changes());
- if (changeset.num_changes() == 0) {
- write_error(" NO CHANGES!");
- }
- *m_out += '\n';
-
- write_fieldname("created at");
- *m_out += ' ';
- write_timestamp(changeset.created_at());
-
- write_fieldname("closed at");
- *m_out += " ";
- if (changeset.closed()) {
- write_timestamp(changeset.closed_at());
- } else {
- write_error("OPEN!\n");
- }
-
- write_fieldname("user");
- output_formatted(" %d ", changeset.uid());
- write_string(changeset.user());
- *m_out += '\n';
-
- write_box(changeset.bounds());
- write_tags(changeset.tags(), " ");
-
- if (changeset.num_comments() > 0) {
- write_fieldname("comments");
- output_formatted(" %d\n", changeset.num_comments());
-
- int width = int(log10(changeset.num_comments())) + 1;
- int n = 0;
- for (const auto& comment : changeset.discussion()) {
- write_counter(width, n++);
-
- write_comment_field("date");
- write_timestamp(comment.date());
- output_formatted(" %*s", width, "");
-
- write_comment_field("user");
- output_formatted("%d ", comment.uid());
- write_string(comment.user());
- output_formatted("\n %*s", width, "");
-
- write_comment_field("text");
- write_string(comment.text());
- *m_out += '\n';
- }
- }
-
- *m_out += '\n';
- }
-
- }; // class DebugOutputBlock
-
- class DebugOutputFormat : public osmium::io::detail::OutputFormat {
-
- debug_output_options m_options;
-
- void write_fieldname(std::string& out, const char* name) {
- out += " ";
- if (m_options.use_color) {
- out += color_cyan;
- }
- out += name;
- if (m_options.use_color) {
- out += color_reset;
- }
- out += ": ";
- }
-
- public:
-
- DebugOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
- OutputFormat(output_queue),
- m_options() {
- m_options.add_metadata = file.is_not_false("add_metadata");
- m_options.use_color = file.is_true("color");
- }
-
- DebugOutputFormat(const DebugOutputFormat&) = delete;
- DebugOutputFormat& operator=(const DebugOutputFormat&) = delete;
-
- ~DebugOutputFormat() noexcept = default;
-
- void write_header(const osmium::io::Header& header) override final {
- std::string out;
-
- if (m_options.use_color) {
- out += color_bold;
- }
- out += "header\n";
- if (m_options.use_color) {
- out += color_reset;
- }
-
- write_fieldname(out, "multiple object versions");
- out += header.has_multiple_object_versions() ? "yes" : "no";
- out += '\n';
- write_fieldname(out, "bounding boxes");
- out += '\n';
- for (const auto& box : header.boxes()) {
- out += " ";
- box.bottom_left().as_string(std::back_inserter(out), ',');
- out += " ";
- box.top_right().as_string(std::back_inserter(out), ',');
- out += '\n';
- }
- write_fieldname(out, "options");
- out += '\n';
- for (const auto& opt : header) {
- out += " ";
- out += opt.first;
- out += " = ";
- out += opt.second;
- out += '\n';
- }
- out += "\n=============================================\n\n";
-
- send_to_output_queue(std::move(out));
- }
-
- void write_buffer(osmium::memory::Buffer&& buffer) override final {
- m_output_queue.push(osmium::thread::Pool::instance().submit(DebugOutputBlock{std::move(buffer), m_options}));
- }
-
- }; // class DebugOutputFormat
-
- // we want the register_output_format() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_debug_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::debug,
- [](const osmium::io::File& file, future_string_queue_type& output_queue) {
- return new osmium::io::detail::DebugOutputFormat(file, output_queue);
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_debug_output() noexcept {
- return registered_debug_output;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_DEBUG_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/input_format.hpp b/contrib/libosmium/osmium/io/detail/input_format.hpp
deleted file mode 100644
index d26b1ee..0000000
--- a/contrib/libosmium/osmium/io/detail/input_format.hpp
+++ /dev/null
@@ -1,211 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <exception>
-#include <functional>
-#include <future>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- class Parser {
-
- future_buffer_queue_type& m_output_queue;
- std::promise<osmium::io::Header>& m_header_promise;
- queue_wrapper<std::string> m_input_queue;
- osmium::osm_entity_bits::type m_read_types;
- bool m_header_is_done;
-
- protected:
-
- std::string get_input() {
- return m_input_queue.pop();
- }
-
- bool input_done() const {
- return m_input_queue.has_reached_end_of_data();
- }
-
- osmium::osm_entity_bits::type read_types() const {
- return m_read_types;
- }
-
- bool header_is_done() const {
- return m_header_is_done;
- }
-
- void set_header_value(const osmium::io::Header& header) {
- if (!m_header_is_done) {
- m_header_is_done = true;
- m_header_promise.set_value(header);
- }
- }
-
- void set_header_exception(const std::exception_ptr& exception) {
- if (!m_header_is_done) {
- m_header_is_done = true;
- m_header_promise.set_exception(exception);
- }
- }
-
- /**
- * Wrap the buffer into a future and add it to the output queue.
- */
- void send_to_output_queue(osmium::memory::Buffer&& buffer) {
- add_to_queue(m_output_queue, std::move(buffer));
- }
-
- void send_to_output_queue(std::future<osmium::memory::Buffer>&& future) {
- m_output_queue.push(std::move(future));
- }
-
- public:
-
- Parser(future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_types) :
- m_output_queue(output_queue),
- m_header_promise(header_promise),
- m_input_queue(input_queue),
- m_read_types(read_types),
- m_header_is_done(false) {
- }
-
- Parser(const Parser&) = delete;
- Parser& operator=(const Parser&) = delete;
-
- Parser(Parser&&) = delete;
- Parser& operator=(Parser&&) = delete;
-
- virtual ~Parser() noexcept = default;
-
- virtual void run() = 0;
-
- void parse() {
- try {
- run();
- } catch (...) {
- std::exception_ptr exception = std::current_exception();
- set_header_exception(exception);
- add_to_queue(m_output_queue, std::move(exception));
- }
-
- add_end_of_data_to_queue(m_output_queue);
- }
-
- }; // class Parser
-
- /**
- * This factory class is used to create objects that decode OSM
- * data written in a specified format.
- *
- * Do not use this class directly. Use the osmium::io::Reader
- * class instead.
- */
- class ParserFactory {
-
- public:
-
- typedef std::function<
- std::unique_ptr<Parser>(
- future_string_queue_type&,
- future_buffer_queue_type&,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_which_entities
- )
- > create_parser_type;
-
- private:
-
- typedef std::map<osmium::io::file_format, create_parser_type> map_type;
-
- map_type m_callbacks;
-
- ParserFactory() :
- m_callbacks() {
- }
-
- public:
-
- static ParserFactory& instance() {
- static ParserFactory factory;
- return factory;
- }
-
- bool register_parser(osmium::io::file_format format, create_parser_type create_function) {
- if (! m_callbacks.insert(map_type::value_type(format, create_function)).second) {
- return false;
- }
- return true;
- }
-
- create_parser_type get_creator_function(const osmium::io::File& file) {
- auto it = m_callbacks.find(file.format());
- if (it == m_callbacks.end()) {
- throw unsupported_file_format_error(
- std::string("Can not open file '") +
- file.filename() +
- "' with type '" +
- as_string(file.format()) +
- "'. No support for reading this format in this program.");
- }
- return it->second;
- }
-
- }; // class ParserFactory
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/o5m_input_format.hpp b/contrib/libosmium/osmium/io/detail/o5m_input_format.hpp
deleted file mode 100644
index b5b5c71..0000000
--- a/contrib/libosmium/osmium/io/detail/o5m_input_format.hpp
+++ /dev/null
@@ -1,633 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_O5M_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_O5M_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <future>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <protozero/varint.hpp>
-
-#include <osmium/builder/builder.hpp>
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/delta.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown when the o5m deocder failed. The exception contains
- * (if available) information about the place where the error happened
- * and the type of error.
- */
- struct o5m_error : public io_error {
-
- o5m_error(const char* what) :
- io_error(std::string("o5m format error: ") + what) {
- }
-
- }; // struct o5m_error
-
- namespace io {
-
- namespace detail {
-
- // Implementation of the o5m/o5c file formats according to the
- // description at http://wiki.openstreetmap.org/wiki/O5m .
-
- class ReferenceTable {
-
- // The following settings are from the o5m description:
-
- // The maximum number of entries in this table.
- const uint64_t number_of_entries = 15000;
-
- // The size of one entry in the table.
- const unsigned int entry_size = 256;
-
- // The maximum length of a string in the table including
- // two \0 bytes.
- const unsigned int max_length = 250 + 2;
-
- // The data is stored in this string. It is default constructed
- // and then resized on demand the first time something is added.
- // This is done because the ReferenceTable is in a O5mParser
- // object which will be copied from one thread to another. This
- // way the string is still small when it is copied.
- std::string m_table;
-
- unsigned int current_entry = 0;
-
- public:
-
- void clear() {
- current_entry = 0;
- }
-
- void add(const char* string, size_t size) {
- if (m_table.empty()) {
- m_table.resize(entry_size * number_of_entries);
- }
- if (size <= max_length) {
- std::copy_n(string, size, &m_table[current_entry * entry_size]);
- if (++current_entry == number_of_entries) {
- current_entry = 0;
- }
- }
- }
-
- const char* get(uint64_t index) const {
- if (m_table.empty() || index == 0 || index > number_of_entries) {
- throw o5m_error("reference to non-existing string in table");
- }
- auto entry = (current_entry + number_of_entries - index) % number_of_entries;
- return &m_table[entry * entry_size];
- }
-
- }; // class ReferenceTable
-
- class O5mParser : public Parser {
-
- static constexpr int buffer_size = 2 * 1000 * 1000;
-
- osmium::io::Header m_header;
-
- osmium::memory::Buffer m_buffer;
-
- std::string m_input;
-
- const char* m_data;
- const char* m_end;
-
- ReferenceTable m_reference_table;
-
- static int64_t zvarint(const char** data, const char* end) {
- return protozero::decode_zigzag64(protozero::decode_varint(data, end));
- }
-
- bool ensure_bytes_available(size_t need_bytes) {
- if ((m_end - m_data) >= long(need_bytes)) {
- return true;
- }
-
- if (input_done() && (m_input.size() < need_bytes)) {
- return false;
- }
-
- m_input.erase(0, m_data - m_input.data());
-
- while (m_input.size() < need_bytes) {
- std::string data = get_input();
- if (input_done()) {
- return false;
- }
- m_input.append(data);
- }
-
- m_data = m_input.data();
- m_end = m_input.data() + m_input.size();
-
- return true;
- }
-
- void check_header_magic() {
- static const unsigned char header_magic[] = { 0xff, 0xe0, 0x04, 'o', '5' };
-
- if (std::strncmp(reinterpret_cast<const char*>(header_magic), m_data, sizeof(header_magic))) {
- throw o5m_error("wrong header magic");
- }
-
- m_data += sizeof(header_magic);
- }
-
- void check_file_type() {
- if (*m_data == 'm') { // o5m data file
- m_header.set_has_multiple_object_versions(false);
- } else if (*m_data == 'c') { // o5c change file
- m_header.set_has_multiple_object_versions(true);
- } else {
- throw o5m_error("wrong header magic");
- }
-
- m_data++;
- }
-
- void check_file_format_version() {
- if (*m_data != '2') {
- throw o5m_error("wrong header magic");
- }
-
- m_data++;
- }
-
- void decode_header() {
- if (! ensure_bytes_available(7)) { // overall length of header
- throw o5m_error("file too short (incomplete header info)");
- }
-
- check_header_magic();
- check_file_type();
- check_file_format_version();
- }
-
- void mark_header_as_done() {
- set_header_value(m_header);
- }
-
- osmium::util::DeltaDecode<osmium::object_id_type> m_delta_id;
-
- osmium::util::DeltaDecode<int64_t> m_delta_timestamp;
- osmium::util::DeltaDecode<osmium::changeset_id_type> m_delta_changeset;
- osmium::util::DeltaDecode<int64_t> m_delta_lon;
- osmium::util::DeltaDecode<int64_t> m_delta_lat;
-
- osmium::util::DeltaDecode<osmium::object_id_type> m_delta_way_node_id;
- osmium::util::DeltaDecode<osmium::object_id_type> m_delta_member_ids[3];
-
- void reset() {
- m_reference_table.clear();
-
- m_delta_id.clear();
- m_delta_timestamp.clear();
- m_delta_changeset.clear();
- m_delta_lon.clear();
- m_delta_lat.clear();
-
- m_delta_way_node_id.clear();
- m_delta_member_ids[0].clear();
- m_delta_member_ids[1].clear();
- m_delta_member_ids[2].clear();
- }
-
- const char* decode_string(const char** dataptr, const char* const end) {
- if (**dataptr == 0x00) { // get inline string
- (*dataptr)++;
- if (*dataptr == end) {
- throw o5m_error("string format error");
- }
- return *dataptr;
- } else { // get from reference table
- auto index = protozero::decode_varint(dataptr, end);
- return m_reference_table.get(index);
- }
- }
-
- std::pair<osmium::user_id_type, const char*> decode_user(const char** dataptr, const char* const end) {
- bool update_pointer = (**dataptr == 0x00);
- const char* data = decode_string(dataptr, end);
- const char* start = data;
-
- auto uid = protozero::decode_varint(&data, end);
-
- if (data == end) {
- throw o5m_error("missing user name");
- }
-
- const char* user = ++data;
-
- if (uid == 0 && update_pointer) {
- m_reference_table.add("\0\0", 2);
- *dataptr = data;
- return std::make_pair(0, "");
- }
-
- while (*data++) {
- if (data == end) {
- throw o5m_error("no null byte in user name");
- }
- }
-
- if (update_pointer) {
- m_reference_table.add(start, data - start);
- *dataptr = data;
- }
-
- return std::make_pair(static_cast_with_assert<osmium::user_id_type>(uid), user);
- }
-
- void decode_tags(osmium::builder::Builder* builder, const char** dataptr, const char* const end) {
- osmium::builder::TagListBuilder tl_builder(m_buffer, builder);
-
- while(*dataptr != end) {
- bool update_pointer = (**dataptr == 0x00);
- const char* data = decode_string(dataptr, end);
- const char* start = data;
-
- while (*data++) {
- if (data == end) {
- throw o5m_error("no null byte in tag key");
- }
- }
-
- const char* value = data;
- while (*data++) {
- if (data == end) {
- throw o5m_error("no null byte in tag value");
- }
- }
-
- if (update_pointer) {
- m_reference_table.add(start, data - start);
- *dataptr = data;
- }
-
- tl_builder.add_tag(start, value);
- }
- }
-
- const char* decode_info(osmium::OSMObject& object, const char** dataptr, const char* const end) {
- const char* user = "";
-
- if (**dataptr == 0x00) { // no info section
- ++*dataptr;
- } else { // has info section
- object.set_version(static_cast_with_assert<object_version_type>(protozero::decode_varint(dataptr, end)));
- auto timestamp = m_delta_timestamp.update(zvarint(dataptr, end));
- if (timestamp != 0) { // has timestamp
- object.set_timestamp(timestamp);
- object.set_changeset(m_delta_changeset.update(zvarint(dataptr, end)));
- if (*dataptr != end) {
- auto uid_user = decode_user(dataptr, end);
- object.set_uid(uid_user.first);
- user = uid_user.second;
- } else {
- object.set_uid(user_id_type(0));
- }
- }
- }
-
- return user;
- }
-
- void decode_node(const char* data, const char* const end) {
- osmium::builder::NodeBuilder builder(m_buffer);
- osmium::Node& node = builder.object();
-
- node.set_id(m_delta_id.update(zvarint(&data, end)));
-
- builder.add_user(decode_info(node, &data, end));
-
- if (data == end) {
- // no location, object is deleted
- builder.object().set_visible(false);
- builder.object().set_location(osmium::Location{});
- } else {
- auto lon = m_delta_lon.update(zvarint(&data, end));
- auto lat = m_delta_lat.update(zvarint(&data, end));
- builder.object().set_location(osmium::Location{lon, lat});
-
- if (data != end) {
- decode_tags(&builder, &data, end);
- }
- }
-
- m_buffer.commit();
- }
-
- void decode_way(const char* data, const char* const end) {
- osmium::builder::WayBuilder builder(m_buffer);
- osmium::Way& way = builder.object();
-
- way.set_id(m_delta_id.update(zvarint(&data, end)));
-
- builder.add_user(decode_info(way, &data, end));
-
- if (data == end) {
- // no reference section, object is deleted
- builder.object().set_visible(false);
- } else {
- auto reference_section_length = protozero::decode_varint(&data, end);
- if (reference_section_length > 0) {
- const char* const end_refs = data + reference_section_length;
- if (end_refs > end) {
- throw o5m_error("way nodes ref section too long");
- }
-
- osmium::builder::WayNodeListBuilder wn_builder(m_buffer, &builder);
-
- while (data < end_refs) {
- wn_builder.add_node_ref(m_delta_way_node_id.update(zvarint(&data, end)));
- }
- }
-
- if (data != end) {
- decode_tags(&builder, &data, end);
- }
- }
-
- m_buffer.commit();
- }
-
- osmium::item_type decode_member_type(char c) {
- if (c < '0' || c > '2') {
- throw o5m_error("unknown member type");
- }
- return osmium::nwr_index_to_item_type(c - '0');
- }
-
- std::pair<osmium::item_type, const char*> decode_role(const char** dataptr, const char* const end) {
- bool update_pointer = (**dataptr == 0x00);
- const char* data = decode_string(dataptr, end);
- const char* start = data;
-
- auto member_type = decode_member_type(*data++);
- if (data == end) {
- throw o5m_error("missing role");
- }
- const char* role = data;
-
- while (*data++) {
- if (data == end) {
- throw o5m_error("no null byte in role");
- }
- }
-
- if (update_pointer) {
- m_reference_table.add(start, data - start);
- *dataptr = data;
- }
-
- return std::make_pair(member_type, role);
- }
-
- void decode_relation(const char* data, const char* const end) {
- osmium::builder::RelationBuilder builder(m_buffer);
- osmium::Relation& relation = builder.object();
-
- relation.set_id(m_delta_id.update(zvarint(&data, end)));
-
- builder.add_user(decode_info(relation, &data, end));
-
- if (data == end) {
- // no reference section, object is deleted
- builder.object().set_visible(false);
- } else {
- auto reference_section_length = protozero::decode_varint(&data, end);
- if (reference_section_length > 0) {
- const char* const end_refs = data + reference_section_length;
- if (end_refs > end) {
- throw o5m_error("relation format error");
- }
-
- osmium::builder::RelationMemberListBuilder rml_builder(m_buffer, &builder);
-
- while (data < end_refs) {
- auto delta_id = zvarint(&data, end);
- if (data == end) {
- throw o5m_error("relation member format error");
- }
- auto type_role = decode_role(&data, end);
- auto i = osmium::item_type_to_nwr_index(type_role.first);
- auto ref = m_delta_member_ids[i].update(delta_id);
- rml_builder.add_member(type_role.first, ref, type_role.second);
- }
- }
-
- if (data != end) {
- decode_tags(&builder, &data, end);
- }
- }
-
- m_buffer.commit();
- }
-
- void decode_bbox(const char* data, const char* const end) {
- auto sw_lon = zvarint(&data, end);
- auto sw_lat = zvarint(&data, end);
- auto ne_lon = zvarint(&data, end);
- auto ne_lat = zvarint(&data, end);
-
- m_header.add_box(osmium::Box{osmium::Location{sw_lon, sw_lat},
- osmium::Location{ne_lon, ne_lat}});
- }
-
- void decode_timestamp(const char* data, const char* const end) {
- auto timestamp = osmium::Timestamp(zvarint(&data, end)).to_iso();
- m_header.set("o5m_timestamp", timestamp);
- m_header.set("timestamp", timestamp);
- }
-
- void flush() {
- osmium::memory::Buffer buffer(buffer_size);
- using std::swap;
- swap(m_buffer, buffer);
- send_to_output_queue(std::move(buffer));
- }
-
- enum class dataset_type : unsigned char {
- node = 0x10,
- way = 0x11,
- relation = 0x12,
- bounding_box = 0xdb,
- timestamp = 0xdc,
- header = 0xe0,
- sync = 0xee,
- jump = 0xef,
- reset = 0xff
- };
-
- void decode_data() {
- while (ensure_bytes_available(1)) {
- dataset_type ds_type = dataset_type(*m_data++);
- if (ds_type > dataset_type::jump) {
- if (ds_type == dataset_type::reset) {
- reset();
- }
- } else {
- ensure_bytes_available(protozero::max_varint_length);
-
- uint64_t length = 0;
- try {
- length = protozero::decode_varint(&m_data, m_end);
- } catch (protozero::end_of_buffer_exception&) {
- throw o5m_error("premature end of file");
- }
-
- if (! ensure_bytes_available(length)) {
- throw o5m_error("premature end of file");
- }
-
- switch (ds_type) {
- case dataset_type::node:
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::node) {
- decode_node(m_data, m_data + length);
- }
- break;
- case dataset_type::way:
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::way) {
- decode_way(m_data, m_data + length);
- }
- break;
- case dataset_type::relation:
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::relation) {
- decode_relation(m_data, m_data + length);
- }
- break;
- case dataset_type::bounding_box:
- decode_bbox(m_data, m_data + length);
- break;
- case dataset_type::timestamp:
- decode_timestamp(m_data, m_data + length);
- break;
- default:
- // ignore unknown datasets
- break;
- }
-
- if (read_types() == osmium::osm_entity_bits::nothing && header_is_done()) {
- break;
- }
-
- m_data += length;
-
- if (m_buffer.committed() > buffer_size / 10 * 9) {
- flush();
- }
- }
- }
-
- if (m_buffer.committed()) {
- flush();
- }
-
- mark_header_as_done();
- }
-
- public:
-
- O5mParser(future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_types) :
- Parser(input_queue, output_queue, header_promise, read_types),
- m_header(),
- m_buffer(buffer_size),
- m_input(),
- m_data(m_input.data()),
- m_end(m_data) {
- }
-
- ~O5mParser() noexcept = default;
-
- void run() override final {
- decode_header();
- decode_data();
- }
-
- }; // class O5mParser
-
- // we want the register_parser() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_o5m_parser = ParserFactory::instance().register_parser(
- file_format::o5m,
- [](future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_which_entities) {
- return std::unique_ptr<Parser>(new O5mParser(input_queue, output_queue, header_promise, read_which_entities));
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_o5m_parser() noexcept {
- return registered_o5m_parser;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_O5M_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/opl_output_format.hpp b/contrib/libosmium/osmium/io/detail/opl_output_format.hpp
deleted file mode 100644
index 5c40bf2..0000000
--- a/contrib/libosmium/osmium/io/detail/opl_output_format.hpp
+++ /dev/null
@@ -1,261 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_OPL_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_OPL_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cinttypes>
-#include <cstddef>
-#include <cstdint>
-#include <cstdio>
-#include <future>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- namespace io {
-
- class File;
-
- namespace detail {
-
- struct opl_output_options {
-
- /// Should metadata of objects be added?
- bool add_metadata;
-
- };
-
- /**
- * Writes out one buffer with OSM data in OPL format.
- */
- class OPLOutputBlock : public OutputBlock {
-
- opl_output_options m_options;
-
- void append_encoded_string(const char* data) {
- osmium::io::detail::append_utf8_encoded_string(*m_out, data);
- }
-
- void write_meta(const osmium::OSMObject& object) {
- output_formatted("%" PRId64, object.id());
- if (m_options.add_metadata) {
- output_formatted(" v%d d", object.version());
- *m_out += (object.visible() ? 'V' : 'D');
- output_formatted(" c%d t", object.changeset());
- *m_out += object.timestamp().to_iso();
- output_formatted(" i%d u", object.uid());
- append_encoded_string(object.user());
- }
- *m_out += " T";
- bool first = true;
- for (const auto& tag : object.tags()) {
- if (first) {
- first = false;
- } else {
- *m_out += ',';
- }
- append_encoded_string(tag.key());
- *m_out += '=';
- append_encoded_string(tag.value());
- }
- }
-
- void write_location(const osmium::Location& location, const char x, const char y) {
- if (location) {
- output_formatted(" %c%.7f %c%.7f", x, location.lon_without_check(), y, location.lat_without_check());
- } else {
- *m_out += ' ';
- *m_out += x;
- *m_out += ' ';
- *m_out += y;
- }
- }
-
- public:
-
- OPLOutputBlock(osmium::memory::Buffer&& buffer, const opl_output_options& options) :
- OutputBlock(std::move(buffer)),
- m_options(options) {
- }
-
- OPLOutputBlock(const OPLOutputBlock&) = default;
- OPLOutputBlock& operator=(const OPLOutputBlock&) = default;
-
- OPLOutputBlock(OPLOutputBlock&&) = default;
- OPLOutputBlock& operator=(OPLOutputBlock&&) = default;
-
- ~OPLOutputBlock() noexcept = default;
-
- std::string operator()() {
- osmium::apply(m_input_buffer->cbegin(), m_input_buffer->cend(), *this);
-
- std::string out;
- using std::swap;
- swap(out, *m_out);
-
- return out;
- }
-
- void node(const osmium::Node& node) {
- *m_out += 'n';
- write_meta(node);
- write_location(node.location(), 'x', 'y');
- *m_out += '\n';
- }
-
- void way(const osmium::Way& way) {
- *m_out += 'w';
- write_meta(way);
-
- *m_out += " N";
- bool first = true;
- for (const auto& node_ref : way.nodes()) {
- if (first) {
- first = false;
- } else {
- *m_out += ',';
- }
- output_formatted("n%" PRId64, node_ref.ref());
- }
- *m_out += '\n';
- }
-
- void relation(const osmium::Relation& relation) {
- *m_out += 'r';
- write_meta(relation);
-
- *m_out += " M";
- bool first = true;
- for (const auto& member : relation.members()) {
- if (first) {
- first = false;
- } else {
- *m_out += ',';
- }
- *m_out += item_type_to_char(member.type());
- output_formatted("%" PRId64 "@", member.ref());
- append_encoded_string(member.role());
- }
- *m_out += '\n';
- }
-
- void changeset(const osmium::Changeset& changeset) {
- output_formatted("c%d k%d s", changeset.id(), changeset.num_changes());
- *m_out += changeset.created_at().to_iso();
- *m_out += " e";
- *m_out += changeset.closed_at().to_iso();
- output_formatted(" d%d i%d u", changeset.num_comments(), changeset.uid());
- append_encoded_string(changeset.user());
- write_location(changeset.bounds().bottom_left(), 'x', 'y');
- write_location(changeset.bounds().top_right(), 'X', 'Y');
- *m_out += " T";
- bool first = true;
- for (const auto& tag : changeset.tags()) {
- if (first) {
- first = false;
- } else {
- *m_out += ',';
- }
- append_encoded_string(tag.key());
- *m_out += '=';
- append_encoded_string(tag.value());
- }
-
- *m_out += '\n';
- }
-
- }; // class OPLOutputBlock
-
- class OPLOutputFormat : public osmium::io::detail::OutputFormat {
-
- opl_output_options m_options;
-
- public:
-
- OPLOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
- OutputFormat(output_queue),
- m_options() {
- m_options.add_metadata = file.is_not_false("add_metadata");
- }
-
- OPLOutputFormat(const OPLOutputFormat&) = delete;
- OPLOutputFormat& operator=(const OPLOutputFormat&) = delete;
-
- ~OPLOutputFormat() noexcept = default;
-
- void write_buffer(osmium::memory::Buffer&& buffer) override final {
- m_output_queue.push(osmium::thread::Pool::instance().submit(OPLOutputBlock{std::move(buffer), m_options}));
- }
-
- }; // class OPLOutputFormat
-
- // we want the register_output_format() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_opl_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::opl,
- [](const osmium::io::File& file, future_string_queue_type& output_queue) {
- return new osmium::io::detail::OPLOutputFormat(file, output_queue);
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_opl_output() noexcept {
- return registered_opl_output;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_OPL_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/output_format.hpp b/contrib/libosmium/osmium/io/detail/output_format.hpp
deleted file mode 100644
index ba1fb41..0000000
--- a/contrib/libosmium/osmium/io/detail/output_format.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <functional>
-#include <map>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <utility>
-
-#include <osmium/handler.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/detail/string_util.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/memory/buffer.hpp>
-
-namespace osmium {
-
- namespace io {
- class Header;
- }
-
- namespace io {
-
- namespace detail {
-
- class OutputBlock : public osmium::handler::Handler {
-
- protected:
-
- std::shared_ptr<osmium::memory::Buffer> m_input_buffer;
-
- std::shared_ptr<std::string> m_out;
-
- explicit OutputBlock(osmium::memory::Buffer&& buffer) :
- m_input_buffer(std::make_shared<osmium::memory::Buffer>(std::move(buffer))),
- m_out(std::make_shared<std::string>()) {
- }
-
- template <typename... TArgs>
- void output_formatted(const char* format, TArgs&&... args) {
- append_printf_formatted_string(*m_out, format, std::forward<TArgs>(args)...);
- }
-
- }; // class OutputBlock;
-
- /**
- * Virtual base class for all classes writing OSM files in different
- * formats.
- *
- * Do not use this class or derived classes directly. Use the
- * osmium::io::Writer class instead.
- */
- class OutputFormat {
-
- protected:
-
- future_string_queue_type& m_output_queue;
-
- /**
- * Wrap the string into a future and add it to the output
- * queue.
- */
- void send_to_output_queue(std::string&& data) {
- add_to_queue(m_output_queue, std::move(data));
- }
-
- public:
-
- explicit OutputFormat(future_string_queue_type& output_queue) :
- m_output_queue(output_queue) {
- }
-
- OutputFormat(const OutputFormat&) = delete;
- OutputFormat(OutputFormat&&) = delete;
-
- OutputFormat& operator=(const OutputFormat&) = delete;
- OutputFormat& operator=(OutputFormat&&) = delete;
-
- virtual ~OutputFormat() noexcept = default;
-
- virtual void write_header(const osmium::io::Header&) {
- }
-
- virtual void write_buffer(osmium::memory::Buffer&&) = 0;
-
- virtual void write_end() {
- }
-
- }; // class OutputFormat
-
- /**
- * This factory class is used to create objects that write OSM data
- * into a specified output format.
- *
- * Do not use this class directly. Instead use the osmium::io::Writer
- * class.
- */
- class OutputFormatFactory {
-
- public:
-
- typedef std::function<osmium::io::detail::OutputFormat*(const osmium::io::File&, future_string_queue_type&)> create_output_type;
-
- private:
-
- typedef std::map<osmium::io::file_format, create_output_type> map_type;
-
- map_type m_callbacks;
-
- OutputFormatFactory() :
- m_callbacks() {
- }
-
- public:
-
- static OutputFormatFactory& instance() {
- static OutputFormatFactory factory;
- return factory;
- }
-
- bool register_output_format(osmium::io::file_format format, create_output_type create_function) {
- if (! m_callbacks.insert(map_type::value_type(format, create_function)).second) {
- return false;
- }
- return true;
- }
-
- std::unique_ptr<osmium::io::detail::OutputFormat> create_output(const osmium::io::File& file, future_string_queue_type& output_queue) {
- auto it = m_callbacks.find(file.format());
- if (it != m_callbacks.end()) {
- return std::unique_ptr<osmium::io::detail::OutputFormat>((it->second)(file, output_queue));
- }
-
- throw unsupported_file_format_error(
- std::string("Can not open file '") +
- file.filename() +
- "' with type '" +
- as_string(file.format()) +
- "'. No support for writing this format in this program.");
- }
-
- }; // class OutputFormatFactory
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf.hpp b/contrib/libosmium/osmium/io/detail/pbf.hpp
deleted file mode 100644
index 4a32a63..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf.hpp
+++ /dev/null
@@ -1,89 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_HPP
-#define OSMIUM_IO_DETAIL_PBF_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-
-// needed for htonl and ntohl
-#ifndef _WIN32
-# include <netinet/in.h>
-#else
-# include <winsock2.h>
-#endif
-
-#include <osmium/io/error.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown when there was a problem with parsing the PBF format of
- * a file.
- */
- struct pbf_error : public io_error {
-
- pbf_error(const std::string& what) :
- io_error(std::string("PBF error: ") + what) {
- }
-
- pbf_error(const char* what) :
- io_error(std::string("PBF error: ") + what) {
- }
-
- }; // struct pbf_error
-
- namespace io {
-
- namespace detail {
-
- // the maximum size of a blob header in bytes
- const int max_blob_header_size = 64 * 1024; // 64 kB
-
- // the maximum size of an uncompressed blob in bytes
- const uint64_t max_uncompressed_blob_size = 32 * 1024 * 1024; // 32 MB
-
- // resolution for longitude/latitude used for conversion
- // between representation as double and as int
- const int64_t lonlat_resolution = 1000 * 1000 * 1000;
-
- const int64_t resolution_convert = lonlat_resolution / osmium::Location::coordinate_precision;
-
- }
-
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf_decoder.hpp b/contrib/libosmium/osmium/io/detail/pbf_decoder.hpp
deleted file mode 100644
index 09e09bf..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf_decoder.hpp
+++ /dev/null
@@ -1,777 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_DECODER_HPP
-#define OSMIUM_IO_DETAIL_PBF_DECODER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <algorithm>
-#include <limits>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <utility>
-#include <vector>
-
-#include <protozero/pbf_message.hpp>
-
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/io/detail/pbf.hpp> // IWYU pragma: export
-#include <osmium/io/detail/protobuf_tags.hpp>
-#include <osmium/io/detail/zlib.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/delta.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- using ptr_len_type = std::pair<const char*, size_t>;
- using osm_string_len_type = std::pair<const char*, osmium::string_size_type>;
-
- class PBFPrimitiveBlockDecoder {
-
- static constexpr size_t initial_buffer_size = 2 * 1024 * 1024;
-
- ptr_len_type m_data;
- std::vector<osm_string_len_type> m_stringtable;
-
- int64_t m_lon_offset = 0;
- int64_t m_lat_offset = 0;
- int64_t m_date_factor = 1000;
- int32_t m_granularity = 100;
-
- osmium::osm_entity_bits::type m_read_types;
-
- osmium::memory::Buffer m_buffer { initial_buffer_size };
-
- void decode_stringtable(const ptr_len_type& data) {
- if (!m_stringtable.empty()) {
- throw osmium::pbf_error("more than one stringtable in pbf file");
- }
-
- protozero::pbf_message<OSMFormat::StringTable> pbf_string_table(data);
- while (pbf_string_table.next(OSMFormat::StringTable::repeated_bytes_s)) {
- auto str_len = pbf_string_table.get_data();
- if (str_len.second > osmium::max_osm_string_length) {
- throw osmium::pbf_error("overlong string in string table");
- }
- m_stringtable.emplace_back(str_len.first, osmium::string_size_type(str_len.second));
- }
- }
-
- void decode_primitive_block_metadata() {
- protozero::pbf_message<OSMFormat::PrimitiveBlock> pbf_primitive_block(m_data);
- while (pbf_primitive_block.next()) {
- switch (pbf_primitive_block.tag()) {
- case OSMFormat::PrimitiveBlock::required_StringTable_stringtable:
- decode_stringtable(pbf_primitive_block.get_data());
- break;
- case OSMFormat::PrimitiveBlock::optional_int32_granularity:
- m_granularity = pbf_primitive_block.get_int32();
- break;
- case OSMFormat::PrimitiveBlock::optional_int32_date_granularity:
- m_date_factor = pbf_primitive_block.get_int32();
- break;
- case OSMFormat::PrimitiveBlock::optional_int64_lat_offset:
- m_lat_offset = pbf_primitive_block.get_int64();
- break;
- case OSMFormat::PrimitiveBlock::optional_int64_lon_offset:
- m_lon_offset = pbf_primitive_block.get_int64();
- break;
- default:
- pbf_primitive_block.skip();
- }
- }
- }
-
- void decode_primitive_block_data() {
- protozero::pbf_message<OSMFormat::PrimitiveBlock> pbf_primitive_block(m_data);
- while (pbf_primitive_block.next(OSMFormat::PrimitiveBlock::repeated_PrimitiveGroup_primitivegroup)) {
- protozero::pbf_message<OSMFormat::PrimitiveGroup> pbf_primitive_group = pbf_primitive_block.get_message();
- while (pbf_primitive_group.next()) {
- switch (pbf_primitive_group.tag()) {
- case OSMFormat::PrimitiveGroup::repeated_Node_nodes:
- if (m_read_types & osmium::osm_entity_bits::node) {
- decode_node(pbf_primitive_group.get_data());
- } else {
- pbf_primitive_group.skip();
- }
- break;
- case OSMFormat::PrimitiveGroup::optional_DenseNodes_dense:
- if (m_read_types & osmium::osm_entity_bits::node) {
- decode_dense_nodes(pbf_primitive_group.get_data());
- } else {
- pbf_primitive_group.skip();
- }
- break;
- case OSMFormat::PrimitiveGroup::repeated_Way_ways:
- if (m_read_types & osmium::osm_entity_bits::way) {
- decode_way(pbf_primitive_group.get_data());
- } else {
- pbf_primitive_group.skip();
- }
- break;
- case OSMFormat::PrimitiveGroup::repeated_Relation_relations:
- if (m_read_types & osmium::osm_entity_bits::relation) {
- decode_relation(pbf_primitive_group.get_data());
- } else {
- pbf_primitive_group.skip();
- }
- break;
- default:
- pbf_primitive_group.skip();
- }
- }
- }
- }
-
- osm_string_len_type decode_info(const ptr_len_type& data, osmium::OSMObject& object) {
- osm_string_len_type user = std::make_pair("", 0);
-
- protozero::pbf_message<OSMFormat::Info> pbf_info(data);
- while (pbf_info.next()) {
- switch (pbf_info.tag()) {
- case OSMFormat::Info::optional_int32_version:
- {
- auto version = pbf_info.get_int32();
- if (version < 0) {
- throw osmium::pbf_error("object version must not be negative");
- }
- object.set_version(static_cast_with_assert<object_version_type>(version));
- }
- break;
- case OSMFormat::Info::optional_int64_timestamp:
- object.set_timestamp(pbf_info.get_int64() * m_date_factor / 1000);
- break;
- case OSMFormat::Info::optional_int64_changeset:
- {
- auto changeset_id = pbf_info.get_int64();
- if (changeset_id < 0) {
- throw osmium::pbf_error("object changeset_id must not be negative");
- }
- object.set_changeset(static_cast_with_assert<changeset_id_type>(changeset_id));
- }
- break;
- case OSMFormat::Info::optional_int32_uid:
- object.set_uid_from_signed(pbf_info.get_int32());
- break;
- case OSMFormat::Info::optional_uint32_user_sid:
- user = m_stringtable.at(pbf_info.get_uint32());
- break;
- case OSMFormat::Info::optional_bool_visible:
- object.set_visible(pbf_info.get_bool());
- break;
- default:
- pbf_info.skip();
- }
- }
-
- return user;
- }
-
- using kv_type = std::pair<protozero::pbf_reader::const_uint32_iterator, protozero::pbf_reader::const_uint32_iterator>;
-
- void build_tag_list(osmium::builder::Builder& builder, const kv_type& keys, const kv_type& vals) {
- if (keys.first != keys.second) {
- osmium::builder::TagListBuilder tl_builder(m_buffer, &builder);
- auto kit = keys.first;
- auto vit = vals.first;
- while (kit != keys.second) {
- if (vit == vals.second) {
- // this is against the spec, must have same number of elements
- throw osmium::pbf_error("PBF format error");
- }
- const auto& k = m_stringtable.at(*kit++);
- const auto& v = m_stringtable.at(*vit++);
- tl_builder.add_tag(k.first, k.second, v.first, v.second);
- }
- }
- }
-
- int32_t convert_pbf_coordinate(int64_t c) const {
- return int32_t((c * m_granularity + m_lon_offset) / resolution_convert);
- }
-
- void decode_node(const ptr_len_type& data) {
- osmium::builder::NodeBuilder builder(m_buffer);
- osmium::Node& node = builder.object();
-
- kv_type keys;
- kv_type vals;
- int64_t lon = std::numeric_limits<int64_t>::max();
- int64_t lat = std::numeric_limits<int64_t>::max();
-
- osm_string_len_type user = { "", 0 };
-
- protozero::pbf_message<OSMFormat::Node> pbf_node(data);
- while (pbf_node.next()) {
- switch (pbf_node.tag()) {
- case OSMFormat::Node::required_sint64_id:
- node.set_id(pbf_node.get_sint64());
- break;
- case OSMFormat::Node::packed_uint32_keys:
- keys = pbf_node.get_packed_uint32();
- break;
- case OSMFormat::Node::packed_uint32_vals:
- vals = pbf_node.get_packed_uint32();
- break;
- case OSMFormat::Node::optional_Info_info:
- user = decode_info(pbf_node.get_data(), builder.object());
- break;
- case OSMFormat::Node::required_sint64_lat:
- lat = pbf_node.get_sint64();
- break;
- case OSMFormat::Node::required_sint64_lon:
- lon = pbf_node.get_sint64();
- break;
- default:
- pbf_node.skip();
- }
- }
-
- if (node.visible()) {
- if (lon == std::numeric_limits<int64_t>::max() ||
- lat == std::numeric_limits<int64_t>::max()) {
- throw osmium::pbf_error("illegal coordinate format");
- }
- node.set_location(osmium::Location(
- convert_pbf_coordinate(lon),
- convert_pbf_coordinate(lat)
- ));
- }
-
- builder.add_user(user.first, user.second);
-
- build_tag_list(builder, keys, vals);
-
- m_buffer.commit();
- }
-
- void decode_way(const ptr_len_type& data) {
- osmium::builder::WayBuilder builder(m_buffer);
-
- kv_type keys;
- kv_type vals;
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> refs;
-
- osm_string_len_type user = { "", 0 };
-
- protozero::pbf_message<OSMFormat::Way> pbf_way(data);
- while (pbf_way.next()) {
- switch (pbf_way.tag()) {
- case OSMFormat::Way::required_int64_id:
- builder.object().set_id(pbf_way.get_int64());
- break;
- case OSMFormat::Way::packed_uint32_keys:
- keys = pbf_way.get_packed_uint32();
- break;
- case OSMFormat::Way::packed_uint32_vals:
- vals = pbf_way.get_packed_uint32();
- break;
- case OSMFormat::Way::optional_Info_info:
- user = decode_info(pbf_way.get_data(), builder.object());
- break;
- case OSMFormat::Way::packed_sint64_refs:
- refs = pbf_way.get_packed_sint64();
- break;
- default:
- pbf_way.skip();
- }
- }
-
- builder.add_user(user.first, user.second);
-
- if (refs.first != refs.second) {
- osmium::builder::WayNodeListBuilder wnl_builder(m_buffer, &builder);
- osmium::util::DeltaDecode<int64_t> ref;
- while (refs.first != refs.second) {
- wnl_builder.add_node_ref(ref.update(*refs.first++));
- }
- }
-
- build_tag_list(builder, keys, vals);
-
- m_buffer.commit();
- }
-
- void decode_relation(const ptr_len_type& data) {
- osmium::builder::RelationBuilder builder(m_buffer);
-
- kv_type keys;
- kv_type vals;
- std::pair<protozero::pbf_reader::const_int32_iterator, protozero::pbf_reader::const_int32_iterator> roles;
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> refs;
- std::pair<protozero::pbf_reader::const_int32_iterator, protozero::pbf_reader::const_int32_iterator> types;
-
- osm_string_len_type user = { "", 0 };
-
- protozero::pbf_message<OSMFormat::Relation> pbf_relation(data);
- while (pbf_relation.next()) {
- switch (pbf_relation.tag()) {
- case OSMFormat::Relation::required_int64_id:
- builder.object().set_id(pbf_relation.get_int64());
- break;
- case OSMFormat::Relation::packed_uint32_keys:
- keys = pbf_relation.get_packed_uint32();
- break;
- case OSMFormat::Relation::packed_uint32_vals:
- vals = pbf_relation.get_packed_uint32();
- break;
- case OSMFormat::Relation::optional_Info_info:
- user = decode_info(pbf_relation.get_data(), builder.object());
- break;
- case OSMFormat::Relation::packed_int32_roles_sid:
- roles = pbf_relation.get_packed_int32();
- break;
- case OSMFormat::Relation::packed_sint64_memids:
- refs = pbf_relation.get_packed_sint64();
- break;
- case OSMFormat::Relation::packed_MemberType_types:
- types = pbf_relation.get_packed_enum();
- break;
- default:
- pbf_relation.skip();
- }
- }
-
- builder.add_user(user.first, user.second);
-
- if (refs.first != refs.second) {
- osmium::builder::RelationMemberListBuilder rml_builder(m_buffer, &builder);
- osmium::util::DeltaDecode<int64_t> ref;
- while (roles.first != roles.second && refs.first != refs.second && types.first != types.second) {
- const auto& r = m_stringtable.at(*roles.first++);
- int type = *types.first++;
- if (type < 0 || type > 2) {
- throw osmium::pbf_error("unknown relation member type");
- }
- rml_builder.add_member(
- osmium::item_type(type + 1),
- ref.update(*refs.first++),
- r.first,
- r.second
- );
- }
- }
-
- build_tag_list(builder, keys, vals);
-
- m_buffer.commit();
- }
-
- void decode_dense_nodes(const ptr_len_type& data) {
- bool has_info = false;
- bool has_visibles = false;
-
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> ids;
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> lats;
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> lons;
-
- std::pair<protozero::pbf_reader::const_int32_iterator, protozero::pbf_reader::const_int32_iterator> tags;
-
- std::pair<protozero::pbf_reader::const_int32_iterator, protozero::pbf_reader::const_int32_iterator> versions;
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> timestamps;
- std::pair<protozero::pbf_reader::const_sint64_iterator, protozero::pbf_reader::const_sint64_iterator> changesets;
- std::pair<protozero::pbf_reader::const_sint32_iterator, protozero::pbf_reader::const_sint32_iterator> uids;
- std::pair<protozero::pbf_reader::const_sint32_iterator, protozero::pbf_reader::const_sint32_iterator> user_sids;
- std::pair<protozero::pbf_reader::const_int32_iterator, protozero::pbf_reader::const_int32_iterator> visibles;
-
- protozero::pbf_message<OSMFormat::DenseNodes> pbf_dense_nodes(data);
- while (pbf_dense_nodes.next()) {
- switch (pbf_dense_nodes.tag()) {
- case OSMFormat::DenseNodes::packed_sint64_id:
- ids = pbf_dense_nodes.get_packed_sint64();
- break;
- case OSMFormat::DenseNodes::optional_DenseInfo_denseinfo:
- {
- has_info = true;
- protozero::pbf_message<OSMFormat::DenseInfo> pbf_dense_info = pbf_dense_nodes.get_message();
- while (pbf_dense_info.next()) {
- switch (pbf_dense_info.tag()) {
- case OSMFormat::DenseInfo::packed_int32_version:
- versions = pbf_dense_info.get_packed_int32();
- break;
- case OSMFormat::DenseInfo::packed_sint64_timestamp:
- timestamps = pbf_dense_info.get_packed_sint64();
- break;
- case OSMFormat::DenseInfo::packed_sint64_changeset:
- changesets = pbf_dense_info.get_packed_sint64();
- break;
- case OSMFormat::DenseInfo::packed_sint32_uid:
- uids = pbf_dense_info.get_packed_sint32();
- break;
- case OSMFormat::DenseInfo::packed_sint32_user_sid:
- user_sids = pbf_dense_info.get_packed_sint32();
- break;
- case OSMFormat::DenseInfo::packed_bool_visible:
- has_visibles = true;
- visibles = pbf_dense_info.get_packed_bool();
- break;
- default:
- pbf_dense_info.skip();
- }
- }
- }
- break;
- case OSMFormat::DenseNodes::packed_sint64_lat:
- lats = pbf_dense_nodes.get_packed_sint64();
- break;
- case OSMFormat::DenseNodes::packed_sint64_lon:
- lons = pbf_dense_nodes.get_packed_sint64();
- break;
- case OSMFormat::DenseNodes::packed_int32_keys_vals:
- tags = pbf_dense_nodes.get_packed_int32();
- break;
- default:
- pbf_dense_nodes.skip();
- }
- }
-
- osmium::util::DeltaDecode<int64_t> dense_id;
- osmium::util::DeltaDecode<int64_t> dense_latitude;
- osmium::util::DeltaDecode<int64_t> dense_longitude;
- osmium::util::DeltaDecode<int64_t> dense_uid;
- osmium::util::DeltaDecode<int64_t> dense_user_sid;
- osmium::util::DeltaDecode<int64_t> dense_changeset;
- osmium::util::DeltaDecode<int64_t> dense_timestamp;
-
- auto tag_it = tags.first;
-
- while (ids.first != ids.second) {
- if (lons.first == lons.second ||
- lats.first == lats.second) {
- // this is against the spec, must have same number of elements
- throw osmium::pbf_error("PBF format error");
- }
-
- bool visible = true;
-
- osmium::builder::NodeBuilder builder(m_buffer);
- osmium::Node& node = builder.object();
-
- node.set_id(dense_id.update(*ids.first++));
-
- if (has_info) {
- if (versions.first == versions.second ||
- changesets.first == changesets.second ||
- timestamps.first == timestamps.second ||
- uids.first == uids.second ||
- user_sids.first == user_sids.second) {
- // this is against the spec, must have same number of elements
- throw osmium::pbf_error("PBF format error");
- }
-
- auto version = *versions.first++;
- if (version < 0) {
- throw osmium::pbf_error("object version must not be negative");
- }
- node.set_version(static_cast<osmium::object_version_type>(version));
-
- auto changeset_id = dense_changeset.update(*changesets.first++);
- if (changeset_id < 0) {
- throw osmium::pbf_error("object changeset_id must not be negative");
- }
- node.set_changeset(static_cast<osmium::changeset_id_type>(changeset_id));
-
- node.set_timestamp(dense_timestamp.update(*timestamps.first++) * m_date_factor / 1000);
- node.set_uid_from_signed(static_cast<osmium::signed_user_id_type>(dense_uid.update(*uids.first++)));
-
- if (has_visibles) {
- if (visibles.first == visibles.second) {
- // this is against the spec, must have same number of elements
- throw osmium::pbf_error("PBF format error");
- }
- visible = (*visibles.first++) != 0;
- }
- node.set_visible(visible);
-
- const auto& u = m_stringtable.at(dense_user_sid.update(*user_sids.first++));
- builder.add_user(u.first, u.second);
- } else {
- builder.add_user("");
- }
-
- // even if the node isn't visible, there's still a record
- // of its lat/lon in the dense arrays.
- const auto lon = dense_longitude.update(*lons.first++);
- const auto lat = dense_latitude.update(*lats.first++);
- if (visible) {
- builder.object().set_location(osmium::Location(
- convert_pbf_coordinate(lon),
- convert_pbf_coordinate(lat)
- ));
- }
-
- if (tag_it != tags.second) {
- osmium::builder::TagListBuilder tl_builder(m_buffer, &builder);
- while (tag_it != tags.second && *tag_it != 0) {
- const auto& k = m_stringtable.at(*tag_it++);
- if (tag_it == tags.second) {
- throw osmium::pbf_error("PBF format error"); // this is against the spec, keys/vals must come in pairs
- }
- const auto& v = m_stringtable.at(*tag_it++);
- tl_builder.add_tag(k.first, k.second, v.first, v.second);
- }
-
- if (tag_it != tags.second) {
- ++tag_it;
- }
- }
-
- m_buffer.commit();
- }
-
- }
-
- public:
-
- PBFPrimitiveBlockDecoder(const ptr_len_type& data, osmium::osm_entity_bits::type read_types) :
- m_data(data),
- m_read_types(read_types) {
- }
-
- PBFPrimitiveBlockDecoder(const PBFPrimitiveBlockDecoder&) = delete;
- PBFPrimitiveBlockDecoder& operator=(const PBFPrimitiveBlockDecoder&) = delete;
-
- PBFPrimitiveBlockDecoder(PBFPrimitiveBlockDecoder&&) = delete;
- PBFPrimitiveBlockDecoder& operator=(PBFPrimitiveBlockDecoder&&) = delete;
-
- ~PBFPrimitiveBlockDecoder() noexcept = default;
-
- osmium::memory::Buffer operator()() {
- try {
- decode_primitive_block_metadata();
- decode_primitive_block_data();
- } catch (std::out_of_range&) {
- throw osmium::pbf_error("string id out of range");
- }
-
- return std::move(m_buffer);
- }
-
- }; // class PBFPrimitiveBlockDecoder
-
- inline ptr_len_type decode_blob(const std::string& blob_data, std::string& output) {
- int32_t raw_size = 0;
- std::pair<const char*, protozero::pbf_length_type> zlib_data = {nullptr, 0};
-
- protozero::pbf_message<FileFormat::Blob> pbf_blob(blob_data);
- while (pbf_blob.next()) {
- switch (pbf_blob.tag()) {
- case FileFormat::Blob::optional_bytes_raw:
- {
- auto data_len = pbf_blob.get_data();
- if (data_len.second > max_uncompressed_blob_size) {
- throw osmium::pbf_error("illegal blob size");
- }
- return data_len;
- }
- case FileFormat::Blob::optional_int32_raw_size:
- raw_size = pbf_blob.get_int32();
- if (raw_size <= 0 || uint32_t(raw_size) > max_uncompressed_blob_size) {
- throw osmium::pbf_error("illegal blob size");
- }
- break;
- case FileFormat::Blob::optional_bytes_zlib_data:
- zlib_data = pbf_blob.get_data();
- break;
- case FileFormat::Blob::optional_bytes_lzma_data:
- throw osmium::pbf_error("lzma blobs not implemented");
- default:
- throw osmium::pbf_error("unknown compression");
- }
- }
-
- if (zlib_data.second != 0 && raw_size != 0) {
- return osmium::io::detail::zlib_uncompress_string(
- zlib_data.first,
- static_cast<unsigned long>(zlib_data.second),
- static_cast<unsigned long>(raw_size),
- output
- );
- }
-
- throw osmium::pbf_error("blob contains no data");
- }
-
- inline osmium::Box decode_header_bbox(const ptr_len_type& data) {
- int64_t left = std::numeric_limits<int64_t>::max();
- int64_t right = std::numeric_limits<int64_t>::max();
- int64_t top = std::numeric_limits<int64_t>::max();
- int64_t bottom = std::numeric_limits<int64_t>::max();
-
- protozero::pbf_message<OSMFormat::HeaderBBox> pbf_header_bbox(data);
- while (pbf_header_bbox.next()) {
- switch (pbf_header_bbox.tag()) {
- case OSMFormat::HeaderBBox::required_sint64_left:
- left = pbf_header_bbox.get_sint64();
- break;
- case OSMFormat::HeaderBBox::required_sint64_right:
- right = pbf_header_bbox.get_sint64();
- break;
- case OSMFormat::HeaderBBox::required_sint64_top:
- top = pbf_header_bbox.get_sint64();
- break;
- case OSMFormat::HeaderBBox::required_sint64_bottom:
- bottom = pbf_header_bbox.get_sint64();
- break;
- default:
- pbf_header_bbox.skip();
- }
- }
-
- if (left == std::numeric_limits<int64_t>::max() ||
- right == std::numeric_limits<int64_t>::max() ||
- top == std::numeric_limits<int64_t>::max() ||
- bottom == std::numeric_limits<int64_t>::max()) {
- throw osmium::pbf_error("invalid bbox");
- }
-
- osmium::Box box;
- box.extend(osmium::Location(left / resolution_convert, bottom / resolution_convert));
- box.extend(osmium::Location(right / resolution_convert, top / resolution_convert));
-
- return box;
- }
-
- inline osmium::io::Header decode_header_block(const ptr_len_type& data) {
- osmium::io::Header header;
- int i = 0;
-
- protozero::pbf_message<OSMFormat::HeaderBlock> pbf_header_block(data);
- while (pbf_header_block.next()) {
- switch (pbf_header_block.tag()) {
- case OSMFormat::HeaderBlock::optional_HeaderBBox_bbox:
- header.add_box(decode_header_bbox(pbf_header_block.get_data()));
- break;
- case OSMFormat::HeaderBlock::repeated_string_required_features:
- {
- auto feature = pbf_header_block.get_data();
- if (!strncmp("OsmSchema-V0.6", feature.first, feature.second)) {
- // intentionally left blank
- } else if (!strncmp("DenseNodes", feature.first, feature.second)) {
- header.set("pbf_dense_nodes", true);
- } else if (!strncmp("HistoricalInformation", feature.first, feature.second)) {
- header.set_has_multiple_object_versions(true);
- } else {
- std::string msg("required feature not supported: ");
- msg.append(feature.first, feature.second);
- throw osmium::pbf_error(msg);
- }
- }
- break;
- case OSMFormat::HeaderBlock::repeated_string_optional_features:
- header.set("pbf_optional_feature_" + std::to_string(i++), pbf_header_block.get_string());
- break;
- case OSMFormat::HeaderBlock::optional_string_writingprogram:
- header.set("generator", pbf_header_block.get_string());
- break;
- case OSMFormat::HeaderBlock::optional_int64_osmosis_replication_timestamp:
- {
- auto timestamp = osmium::Timestamp(pbf_header_block.get_int64()).to_iso();
- header.set("osmosis_replication_timestamp", timestamp);
- header.set("timestamp", timestamp);
- }
- break;
- case OSMFormat::HeaderBlock::optional_int64_osmosis_replication_sequence_number:
- header.set("osmosis_replication_sequence_number", std::to_string(pbf_header_block.get_int64()));
- break;
- case OSMFormat::HeaderBlock::optional_string_osmosis_replication_base_url:
- header.set("osmosis_replication_base_url", pbf_header_block.get_string());
- break;
- default:
- pbf_header_block.skip();
- }
- }
-
- return header;
- }
-
- /**
- * Decode HeaderBlock.
- *
- * @param header_block_data Input data
- * @returns Header object
- * @throws osmium::pbf_error If there was a parsing error
- */
- inline osmium::io::Header decode_header(const std::string& header_block_data) {
- std::string output;
-
- return decode_header_block(decode_blob(header_block_data, output));
- }
-
- class PBFDataBlobDecoder {
-
- std::shared_ptr<std::string> m_input_buffer;
- osmium::osm_entity_bits::type m_read_types;
-
- public:
-
- PBFDataBlobDecoder(std::string&& input_buffer, osmium::osm_entity_bits::type read_types) :
- m_input_buffer(std::make_shared<std::string>(std::move(input_buffer))),
- m_read_types(read_types) {
- }
-
- PBFDataBlobDecoder(const PBFDataBlobDecoder&) = default;
- PBFDataBlobDecoder& operator=(const PBFDataBlobDecoder&) = default;
-
- PBFDataBlobDecoder(PBFDataBlobDecoder&&) = default;
- PBFDataBlobDecoder& operator=(PBFDataBlobDecoder&&) = default;
-
- ~PBFDataBlobDecoder() noexcept = default;
-
- osmium::memory::Buffer operator()() {
- std::string output;
- PBFPrimitiveBlockDecoder decoder(decode_blob(*m_input_buffer, output), m_read_types);
- return decoder();
- }
-
- }; // class PBFDataBlobDecoder
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_DECODER_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf_input_format.hpp b/contrib/libosmium/osmium/io/detail/pbf_input_format.hpp
deleted file mode 100644
index 4464fd7..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf_input_format.hpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_PBF_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <memory>
-#include <sstream>
-#include <string>
-#include <thread>
-#include <type_traits>
-
-#include <protozero/pbf_message.hpp>
-
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/pbf.hpp> // IWYU pragma: export
-#include <osmium/io/detail/pbf_decoder.hpp>
-#include <osmium/io/detail/protobuf_tags.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/thread/util.hpp>
-#include <osmium/util/config.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- class PBFParser : public Parser {
-
- std::string m_input_buffer;
-
- /**
- * Read the given number of bytes from the input queue.
- *
- * @param size Number of bytes to read
- * @returns String with the data
- * @throws osmium::pbf_error If size bytes can't be read
- */
- std::string read_from_input_queue(size_t size) {
- while (m_input_buffer.size() < size) {
- std::string new_data = get_input();
- if (input_done()) {
- throw osmium::pbf_error("truncated data (EOF encountered)");
- }
- m_input_buffer += new_data;
- }
-
- std::string output { m_input_buffer.substr(size) };
- m_input_buffer.resize(size);
-
- using std::swap;
- swap(output, m_input_buffer);
-
- return output;
- }
-
- /**
- * Read 4 bytes in network byte order from file. They contain
- * the length of the following BlobHeader.
- */
- uint32_t read_blob_header_size_from_file() {
- uint32_t size_in_network_byte_order;
-
- try {
- const std::string input_data = read_from_input_queue(sizeof(size_in_network_byte_order));
- size_in_network_byte_order = *reinterpret_cast<const uint32_t*>(input_data.data());
- } catch (osmium::pbf_error&) {
- return 0; // EOF
- }
-
- const uint32_t size = ntohl(size_in_network_byte_order);
- if (size > static_cast<uint32_t>(max_blob_header_size)) {
- throw osmium::pbf_error("invalid BlobHeader size (> max_blob_header_size)");
- }
-
- return size;
- }
-
- /**
- * Decode the BlobHeader. Make sure it contains the expected
- * type. Return the size of the following Blob.
- */
- size_t decode_blob_header(protozero::pbf_message<FileFormat::BlobHeader>&& pbf_blob_header, const char* expected_type) {
- std::pair<const char*, size_t> blob_header_type;
- size_t blob_header_datasize = 0;
-
- while (pbf_blob_header.next()) {
- switch (pbf_blob_header.tag()) {
- case FileFormat::BlobHeader::required_string_type:
- blob_header_type = pbf_blob_header.get_data();
- break;
- case FileFormat::BlobHeader::required_int32_datasize:
- blob_header_datasize = pbf_blob_header.get_int32();
- break;
- default:
- pbf_blob_header.skip();
- }
- }
-
- if (blob_header_datasize == 0) {
- throw osmium::pbf_error("PBF format error: BlobHeader.datasize missing or zero.");
- }
-
- if (strncmp(expected_type, blob_header_type.first, blob_header_type.second)) {
- throw osmium::pbf_error("blob does not have expected type (OSMHeader in first blob, OSMData in following blobs)");
- }
-
- return blob_header_datasize;
- }
-
- size_t check_type_and_get_blob_size(const char* expected_type) {
- assert(expected_type);
-
- const auto size = read_blob_header_size_from_file();
- if (size == 0) { // EOF
- return 0;
- }
-
- const std::string blob_header = read_from_input_queue(size);
-
- return decode_blob_header(protozero::pbf_message<FileFormat::BlobHeader>(blob_header), expected_type);
- }
-
- std::string read_from_input_queue_with_check(size_t size) {
- if (size > max_uncompressed_blob_size) {
- throw osmium::pbf_error(std::string("invalid blob size: " +
- std::to_string(size)));
- }
- return read_from_input_queue(size);
- }
-
- // Parse the header in the PBF OSMHeader blob.
- void parse_header_blob() {
- osmium::io::Header header;
- const auto size = check_type_and_get_blob_size("OSMHeader");
- header = decode_header(read_from_input_queue_with_check(size));
- set_header_value(header);
- }
-
- void parse_data_blobs() {
- while (const auto size = check_type_and_get_blob_size("OSMData")) {
- std::string input_buffer = read_from_input_queue_with_check(size);
-
- PBFDataBlobDecoder data_blob_parser{ std::move(input_buffer), read_types() };
-
- if (osmium::config::use_pool_threads_for_pbf_parsing()) {
- send_to_output_queue(osmium::thread::Pool::instance().submit(std::move(data_blob_parser)));
- } else {
- send_to_output_queue(data_blob_parser());
- }
- }
- }
-
- public:
-
- PBFParser(future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_types) :
- Parser(input_queue, output_queue, header_promise, read_types),
- m_input_buffer() {
- }
-
- ~PBFParser() noexcept = default;
-
- void run() override final {
- osmium::thread::set_thread_name("_osmium_pbf_in");
-
- parse_header_blob();
-
- if (read_types() != osmium::osm_entity_bits::nothing) {
- parse_data_blobs();
- }
- }
-
- }; // class PBFParser
-
- // we want the register_parser() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_pbf_parser = ParserFactory::instance().register_parser(
- file_format::pbf,
- [](future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_which_entities) {
- return std::unique_ptr<Parser>(new PBFParser(input_queue, output_queue, header_promise, read_which_entities));
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_pbf_parser() noexcept {
- return registered_pbf_parser;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/pbf_output_format.hpp b/contrib/libosmium/osmium/io/detail/pbf_output_format.hpp
deleted file mode 100644
index 97b143b..0000000
--- a/contrib/libosmium/osmium/io/detail/pbf_output_format.hpp
+++ /dev/null
@@ -1,643 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PBF_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_PBF_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cmath>
-#include <cstdint>
-#include <cstdlib>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <time.h>
-#include <utility>
-
-// needed for older boost libraries
-#define BOOST_RESULT_OF_USE_DECLTYPE
-#include <boost/iterator/transform_iterator.hpp>
-
-#include <protozero/pbf_builder.hpp>
-
-#include <osmium/handler.hpp>
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/detail/pbf.hpp> // IWYU pragma: export
-#include <osmium/io/detail/protobuf_tags.hpp>
-#include <osmium/io/detail/string_table.hpp>
-#include <osmium/io/detail/zlib.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/delta.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- struct pbf_output_options {
-
- /// Should nodes be encoded in DenseNodes?
- bool use_dense_nodes;
-
- /**
- * Should the PBF blobs contain zlib compressed data?
- *
- * The zlib compression is optional, it's possible to store the
- * blobs in raw format. Disabling the compression can improve
- * the writing speed a little but the output will be 2x to 3x
- * bigger.
- */
- bool use_compression;
-
- /// Should metadata of objects be written?
- bool add_metadata;
-
- /// Add the "HistoricalInformation" header flag.
- bool add_historical_information_flag;
-
- /// Should the visible flag be added to all OSM objects?
- bool add_visible_flag;
-
- };
-
- /**
- * Maximum number of items in a primitive block.
- *
- * The uncompressed length of a Blob *should* be less
- * than 16 megabytes and *must* be less than 32 megabytes.
- *
- * A block may contain any number of entities, as long as
- * the size limits for the surrounding blob are obeyed.
- * However, for simplicity, the current Osmosis (0.38)
- * as well as Osmium implementation always
- * uses at most 8k entities in a block.
- */
- constexpr int32_t max_entities_per_block = 8000;
-
- constexpr int location_granularity = 100;
-
- /**
- * convert a double lat or lon value to an int, respecting the granularity
- */
- inline int64_t lonlat2int(double lonlat) {
- return static_cast<int64_t>(std::round(lonlat * lonlat_resolution / location_granularity));
- }
-
- enum class pbf_blob_type {
- header = 0,
- data = 1
- };
-
- class SerializeBlob {
-
- std::string m_msg;
-
- pbf_blob_type m_blob_type;
-
- bool m_use_compression;
-
- public:
-
- /**
- * Initialize a blob serializer.
- *
- * @param msg Protobuf-message containing the blob data
- * @param type Type of blob.
- * @param use_compression Should the output be compressed using
- * zlib?
- */
- SerializeBlob(std::string&& msg, pbf_blob_type type, bool use_compression) :
- m_msg(std::move(msg)),
- m_blob_type(type),
- m_use_compression(use_compression) {
- }
-
- /**
- * Serialize a protobuf message into a Blob, optionally apply
- * compression and return it together with a BlobHeader ready
- * to be written to a file.
- */
- std::string operator()() {
- assert(m_msg.size() <= max_uncompressed_blob_size);
-
- std::string blob_data;
- protozero::pbf_builder<FileFormat::Blob> pbf_blob(blob_data);
-
- if (m_use_compression) {
- pbf_blob.add_int32(FileFormat::Blob::optional_int32_raw_size, int32_t(m_msg.size()));
- pbf_blob.add_bytes(FileFormat::Blob::optional_bytes_zlib_data, osmium::io::detail::zlib_compress(m_msg));
- } else {
- pbf_blob.add_bytes(FileFormat::Blob::optional_bytes_raw, m_msg);
- }
-
- std::string blob_header_data;
- protozero::pbf_builder<FileFormat::BlobHeader> pbf_blob_header(blob_header_data);
-
- pbf_blob_header.add_string(FileFormat::BlobHeader::required_string_type, m_blob_type == pbf_blob_type::data ? "OSMData" : "OSMHeader");
- pbf_blob_header.add_int32(FileFormat::BlobHeader::required_int32_datasize, static_cast_with_assert<int32_t>(blob_data.size()));
-
- uint32_t sz = htonl(static_cast_with_assert<uint32_t>(blob_header_data.size()));
-
- // write to output: the 4-byte BlobHeader-Size followed by the BlobHeader followed by the Blob
- std::string output;
- output.reserve(sizeof(sz) + blob_header_data.size() + blob_data.size());
- output.append(reinterpret_cast<const char*>(&sz), sizeof(sz));
- output.append(blob_header_data);
- output.append(blob_data);
-
- return output;
- }
-
- }; // class SerializeBlob
-
- /**
- * Contains the code to pack any number of nodes into a DenseNode
- * structure.
- *
- * Because this needs to allocate a lot of memory on the heap,
- * only one object of this class will be created and then re-used
- * after calling clear() on it.
- */
- class DenseNodes {
-
- StringTable& m_stringtable;
-
- std::vector<int64_t> m_ids;
-
- std::vector<int32_t> m_versions;
- std::vector<int64_t> m_timestamps;
- std::vector<int64_t> m_changesets;
- std::vector<int32_t> m_uids;
- std::vector<int32_t> m_user_sids;
- std::vector<bool> m_visibles;
-
- std::vector<int64_t> m_lats;
- std::vector<int64_t> m_lons;
- std::vector<int32_t> m_tags;
-
- osmium::util::DeltaEncode<object_id_type, int64_t> m_delta_id;
-
- osmium::util::DeltaEncode<time_t, int64_t> m_delta_timestamp;
- osmium::util::DeltaEncode<changeset_id_type, int64_t> m_delta_changeset;
- osmium::util::DeltaEncode<user_id_type, int32_t> m_delta_uid;
- osmium::util::DeltaEncode<uint32_t, int32_t> m_delta_user_sid;
-
- osmium::util::DeltaEncode<int64_t, int64_t> m_delta_lat;
- osmium::util::DeltaEncode<int64_t, int64_t> m_delta_lon;
-
- const pbf_output_options& m_options;
-
- public:
-
- DenseNodes(StringTable& stringtable, const pbf_output_options& options) :
- m_stringtable(stringtable),
- m_options(options) {
- }
-
- /// Clear object for re-use. Keep the allocated memory.
- void clear() {
- m_ids.clear();
-
- m_versions.clear();
- m_timestamps.clear();
- m_changesets.clear();
- m_uids.clear();
- m_user_sids.clear();
- m_visibles.clear();
-
- m_lats.clear();
- m_lons.clear();
- m_tags.clear();
-
- m_delta_id.clear();
-
- m_delta_timestamp.clear();
- m_delta_changeset.clear();
- m_delta_uid.clear();
- m_delta_user_sid.clear();
-
- m_delta_lat.clear();
- m_delta_lon.clear();
- }
-
- size_t size() const {
- return m_ids.size() * 3 * sizeof(int64_t);
- }
-
- void add_node(const osmium::Node& node) {
- m_ids.push_back(m_delta_id.update(node.id()));
-
- if (m_options.add_metadata) {
- m_versions.push_back(static_cast_with_assert<int32_t>(node.version()));
- m_timestamps.push_back(m_delta_timestamp.update(node.timestamp()));
- m_changesets.push_back(m_delta_changeset.update(node.changeset()));
- m_uids.push_back(m_delta_uid.update(node.uid()));
- m_user_sids.push_back(m_delta_user_sid.update(m_stringtable.add(node.user())));
- if (m_options.add_visible_flag) {
- m_visibles.push_back(node.visible());
- }
- }
-
- m_lats.push_back(m_delta_lat.update(lonlat2int(node.location().lat_without_check())));
- m_lons.push_back(m_delta_lon.update(lonlat2int(node.location().lon_without_check())));
-
- for (const auto& tag : node.tags()) {
- m_tags.push_back(static_cast_with_assert<int32_t>(m_stringtable.add(tag.key())));
- m_tags.push_back(static_cast_with_assert<int32_t>(m_stringtable.add(tag.value())));
- }
- m_tags.push_back(0);
- }
-
- std::string serialize() const {
- std::string data;
- protozero::pbf_builder<OSMFormat::DenseNodes> pbf_dense_nodes(data);
-
- pbf_dense_nodes.add_packed_sint64(OSMFormat::DenseNodes::packed_sint64_id, m_ids.cbegin(), m_ids.cend());
-
- if (m_options.add_metadata) {
- protozero::pbf_builder<OSMFormat::DenseInfo> pbf_dense_info(pbf_dense_nodes, OSMFormat::DenseNodes::optional_DenseInfo_denseinfo);
- pbf_dense_info.add_packed_int32(OSMFormat::DenseInfo::packed_int32_version, m_versions.cbegin(), m_versions.cend());
- pbf_dense_info.add_packed_sint64(OSMFormat::DenseInfo::packed_sint64_timestamp, m_timestamps.cbegin(), m_timestamps.cend());
- pbf_dense_info.add_packed_sint64(OSMFormat::DenseInfo::packed_sint64_changeset, m_changesets.cbegin(), m_changesets.cend());
- pbf_dense_info.add_packed_sint32(OSMFormat::DenseInfo::packed_sint32_uid, m_uids.cbegin(), m_uids.cend());
- pbf_dense_info.add_packed_sint32(OSMFormat::DenseInfo::packed_sint32_user_sid, m_user_sids.cbegin(), m_user_sids.cend());
-
- if (m_options.add_visible_flag) {
- pbf_dense_info.add_packed_bool(OSMFormat::DenseInfo::packed_bool_visible, m_visibles.cbegin(), m_visibles.cend());
- }
- }
-
- pbf_dense_nodes.add_packed_sint64(OSMFormat::DenseNodes::packed_sint64_lat, m_lats.cbegin(), m_lats.cend());
- pbf_dense_nodes.add_packed_sint64(OSMFormat::DenseNodes::packed_sint64_lon, m_lons.cbegin(), m_lons.cend());
-
- pbf_dense_nodes.add_packed_int32(OSMFormat::DenseNodes::packed_int32_keys_vals, m_tags.cbegin(), m_tags.cend());
-
- return data;
- }
-
- }; // class DenseNodes
-
- class PrimitiveBlock {
-
- std::string m_pbf_primitive_group_data;
- protozero::pbf_builder<OSMFormat::PrimitiveGroup> m_pbf_primitive_group;
- StringTable m_stringtable;
- DenseNodes m_dense_nodes;
- OSMFormat::PrimitiveGroup m_type;
- int m_count;
-
- public:
-
- PrimitiveBlock(const pbf_output_options& options) :
- m_pbf_primitive_group_data(),
- m_pbf_primitive_group(m_pbf_primitive_group_data),
- m_stringtable(),
- m_dense_nodes(m_stringtable, options),
- m_type(OSMFormat::PrimitiveGroup::unknown),
- m_count(0) {
- }
-
- const std::string& group_data() {
- if (type() == OSMFormat::PrimitiveGroup::optional_DenseNodes_dense) {
- m_pbf_primitive_group.add_message(OSMFormat::PrimitiveGroup::optional_DenseNodes_dense, m_dense_nodes.serialize());
- }
- return m_pbf_primitive_group_data;
- }
-
- void reset(OSMFormat::PrimitiveGroup type) {
- m_pbf_primitive_group_data.clear();
- m_stringtable.clear();
- m_dense_nodes.clear();
- m_type = type;
- m_count = 0;
- }
-
- void write_stringtable(protozero::pbf_builder<OSMFormat::StringTable>& pbf_string_table) {
- for (const char* s : m_stringtable) {
- pbf_string_table.add_bytes(OSMFormat::StringTable::repeated_bytes_s, s);
- }
- }
-
- protozero::pbf_builder<OSMFormat::PrimitiveGroup>& group() {
- ++m_count;
- return m_pbf_primitive_group;
- }
-
- void add_dense_node(const osmium::Node& node) {
- m_dense_nodes.add_node(node);
- ++m_count;
- }
-
- uint32_t store_in_stringtable(const char* s) {
- return m_stringtable.add(s);
- }
-
- int count() const {
- return m_count;
- }
-
- OSMFormat::PrimitiveGroup type() const {
- return m_type;
- }
-
- size_t size() const {
- return m_pbf_primitive_group_data.size() + m_stringtable.size() + m_dense_nodes.size();
- }
-
- /**
- * The output buffer (block) will be filled to about
- * 95% and then written to disk. This leaves more than
- * enough space for the string table (which typically
- * needs about 0.1 to 0.3% of the block size).
- */
- constexpr static size_t max_used_blob_size = max_uncompressed_blob_size * 95 / 100;
-
- bool can_add(OSMFormat::PrimitiveGroup type) const {
- if (type != m_type) {
- return false;
- }
- if (count() >= max_entities_per_block) {
- return false;
- }
- return size() < max_used_blob_size;
- }
-
- }; // class PrimitiveBlock
-
- class PBFOutputFormat : public osmium::io::detail::OutputFormat, public osmium::handler::Handler {
-
- pbf_output_options m_options;
-
- PrimitiveBlock m_primitive_block;
-
- void store_primitive_block() {
- if (m_primitive_block.count() == 0) {
- return;
- }
-
- std::string primitive_block_data;
- protozero::pbf_builder<OSMFormat::PrimitiveBlock> primitive_block(primitive_block_data);
-
- {
- protozero::pbf_builder<OSMFormat::StringTable> pbf_string_table(primitive_block, OSMFormat::PrimitiveBlock::required_StringTable_stringtable);
- m_primitive_block.write_stringtable(pbf_string_table);
- }
-
- primitive_block.add_message(OSMFormat::PrimitiveBlock::repeated_PrimitiveGroup_primitivegroup, m_primitive_block.group_data());
-
- m_output_queue.push(osmium::thread::Pool::instance().submit(
- SerializeBlob{std::move(primitive_block_data),
- pbf_blob_type::data,
- m_options.use_compression}
- ));
- }
-
- template <typename T>
- void add_meta(const osmium::OSMObject& object, T& pbf_object) {
- const osmium::TagList& tags = object.tags();
-
- auto map_tag_key = [this](const osmium::Tag& tag) -> uint32_t {
- return m_primitive_block.store_in_stringtable(tag.key());
- };
- auto map_tag_value = [this](const osmium::Tag& tag) -> uint32_t {
- return m_primitive_block.store_in_stringtable(tag.value());
- };
-
- pbf_object.add_packed_uint32(T::enum_type::packed_uint32_keys,
- boost::make_transform_iterator(tags.begin(), map_tag_key),
- boost::make_transform_iterator(tags.end(), map_tag_key));
-
- pbf_object.add_packed_uint32(T::enum_type::packed_uint32_vals,
- boost::make_transform_iterator(tags.begin(), map_tag_value),
- boost::make_transform_iterator(tags.end(), map_tag_value));
-
- if (m_options.add_metadata) {
- protozero::pbf_builder<OSMFormat::Info> pbf_info(pbf_object, T::enum_type::optional_Info_info);
-
- pbf_info.add_int32(OSMFormat::Info::optional_int32_version, static_cast_with_assert<int32_t>(object.version()));
- pbf_info.add_int64(OSMFormat::Info::optional_int64_timestamp, object.timestamp());
- pbf_info.add_int64(OSMFormat::Info::optional_int64_changeset, object.changeset());
- pbf_info.add_int32(OSMFormat::Info::optional_int32_uid, static_cast_with_assert<int32_t>(object.uid()));
- pbf_info.add_uint32(OSMFormat::Info::optional_uint32_user_sid, m_primitive_block.store_in_stringtable(object.user()));
- if (m_options.add_visible_flag) {
- pbf_info.add_bool(OSMFormat::Info::optional_bool_visible, object.visible());
- }
- }
- }
-
- void switch_primitive_block_type(OSMFormat::PrimitiveGroup type) {
- if (!m_primitive_block.can_add(type)) {
- store_primitive_block();
- m_primitive_block.reset(type);
- }
- }
-
- public:
-
- PBFOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
- OutputFormat(output_queue),
- m_options(),
- m_primitive_block(m_options) {
- m_options.use_dense_nodes = file.is_not_false("pbf_dense_nodes");
- m_options.use_compression = file.get("pbf_compression") != "none" && file.is_not_false("pbf_compression");
- m_options.add_metadata = file.is_not_false("pbf_add_metadata") && file.is_not_false("add_metadata");
- m_options.add_historical_information_flag = file.has_multiple_object_versions();
- m_options.add_visible_flag = file.has_multiple_object_versions();
- }
-
- PBFOutputFormat(const PBFOutputFormat&) = delete;
- PBFOutputFormat& operator=(const PBFOutputFormat&) = delete;
-
- ~PBFOutputFormat() noexcept = default;
-
- void write_header(const osmium::io::Header& header) override final {
- std::string data;
- protozero::pbf_builder<OSMFormat::HeaderBlock> pbf_header_block(data);
-
- if (!header.boxes().empty()) {
- protozero::pbf_builder<OSMFormat::HeaderBBox> pbf_header_bbox(pbf_header_block, OSMFormat::HeaderBlock::optional_HeaderBBox_bbox);
-
- osmium::Box box = header.joined_boxes();
- pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_left, int64_t(box.bottom_left().lon() * lonlat_resolution));
- pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_right, int64_t(box.top_right().lon() * lonlat_resolution));
- pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_top, int64_t(box.top_right().lat() * lonlat_resolution));
- pbf_header_bbox.add_sint64(OSMFormat::HeaderBBox::required_sint64_bottom, int64_t(box.bottom_left().lat() * lonlat_resolution));
- }
-
- pbf_header_block.add_string(OSMFormat::HeaderBlock::repeated_string_required_features, "OsmSchema-V0.6");
-
- if (m_options.use_dense_nodes) {
- pbf_header_block.add_string(OSMFormat::HeaderBlock::repeated_string_required_features, "DenseNodes");
- }
-
- if (m_options.add_historical_information_flag) {
- pbf_header_block.add_string(OSMFormat::HeaderBlock::repeated_string_required_features, "HistoricalInformation");
- }
-
- pbf_header_block.add_string(OSMFormat::HeaderBlock::optional_string_writingprogram, header.get("generator"));
-
- std::string osmosis_replication_timestamp = header.get("osmosis_replication_timestamp");
- if (!osmosis_replication_timestamp.empty()) {
- osmium::Timestamp ts(osmosis_replication_timestamp.c_str());
- pbf_header_block.add_int64(OSMFormat::HeaderBlock::optional_int64_osmosis_replication_timestamp, ts);
- }
-
- std::string osmosis_replication_sequence_number = header.get("osmosis_replication_sequence_number");
- if (!osmosis_replication_sequence_number.empty()) {
- pbf_header_block.add_int64(OSMFormat::HeaderBlock::optional_int64_osmosis_replication_sequence_number, std::atoll(osmosis_replication_sequence_number.c_str()));
- }
-
- std::string osmosis_replication_base_url = header.get("osmosis_replication_base_url");
- if (!osmosis_replication_base_url.empty()) {
- pbf_header_block.add_string(OSMFormat::HeaderBlock::optional_string_osmosis_replication_base_url, osmosis_replication_base_url);
- }
-
- m_output_queue.push(osmium::thread::Pool::instance().submit(
- SerializeBlob{std::move(data),
- pbf_blob_type::header,
- m_options.use_compression}
- ));
- }
-
- void write_buffer(osmium::memory::Buffer&& buffer) override final {
- osmium::apply(buffer.cbegin(), buffer.cend(), *this);
- }
-
- void write_end() override final {
- store_primitive_block();
- }
-
- void node(const osmium::Node& node) {
- if (m_options.use_dense_nodes) {
- switch_primitive_block_type(OSMFormat::PrimitiveGroup::optional_DenseNodes_dense);
- m_primitive_block.add_dense_node(node);
- return;
- }
-
- switch_primitive_block_type(OSMFormat::PrimitiveGroup::repeated_Node_nodes);
- protozero::pbf_builder<OSMFormat::Node> pbf_node{ m_primitive_block.group(), OSMFormat::PrimitiveGroup::repeated_Node_nodes };
-
- pbf_node.add_sint64(OSMFormat::Node::required_sint64_id, node.id());
- add_meta(node, pbf_node);
-
- pbf_node.add_sint64(OSMFormat::Node::required_sint64_lat, lonlat2int(node.location().lat_without_check()));
- pbf_node.add_sint64(OSMFormat::Node::required_sint64_lon, lonlat2int(node.location().lon_without_check()));
- }
-
- void way(const osmium::Way& way) {
- switch_primitive_block_type(OSMFormat::PrimitiveGroup::repeated_Way_ways);
- protozero::pbf_builder<OSMFormat::Way> pbf_way{ m_primitive_block.group(), OSMFormat::PrimitiveGroup::repeated_Way_ways };
-
- pbf_way.add_int64(OSMFormat::Way::required_int64_id, way.id());
- add_meta(way, pbf_way);
-
- static auto map_node_ref = [](osmium::NodeRefList::const_iterator node_ref) noexcept -> osmium::object_id_type {
- return node_ref->ref();
- };
- typedef osmium::util::DeltaEncodeIterator<osmium::NodeRefList::const_iterator, decltype(map_node_ref), osmium::object_id_type> it_type;
-
- const auto& nodes = way.nodes();
- it_type first { nodes.cbegin(), nodes.cend(), map_node_ref };
- it_type last { nodes.cend(), nodes.cend(), map_node_ref };
- pbf_way.add_packed_sint64(OSMFormat::Way::packed_sint64_refs, first, last);
- }
-
- void relation(const osmium::Relation& relation) {
- switch_primitive_block_type(OSMFormat::PrimitiveGroup::repeated_Relation_relations);
- protozero::pbf_builder<OSMFormat::Relation> pbf_relation { m_primitive_block.group(), OSMFormat::PrimitiveGroup::repeated_Relation_relations };
-
- pbf_relation.add_int64(OSMFormat::Relation::required_int64_id, relation.id());
- add_meta(relation, pbf_relation);
-
- auto map_member_role = [this](const osmium::RelationMember& member) -> uint32_t {
- return m_primitive_block.store_in_stringtable(member.role());
- };
- pbf_relation.add_packed_int32(OSMFormat::Relation::packed_int32_roles_sid,
- boost::make_transform_iterator(relation.members().begin(), map_member_role),
- boost::make_transform_iterator(relation.members().end(), map_member_role));
-
- static auto map_member_ref = [](osmium::RelationMemberList::const_iterator member) noexcept -> osmium::object_id_type {
- return member->ref();
- };
- typedef osmium::util::DeltaEncodeIterator<osmium::RelationMemberList::const_iterator, decltype(map_member_ref), osmium::object_id_type> it_type;
- const auto& members = relation.members();
- it_type first { members.cbegin(), members.cend(), map_member_ref };
- it_type last { members.cend(), members.cend(), map_member_ref };
- pbf_relation.add_packed_sint64(OSMFormat::Relation::packed_sint64_memids, first, last);
-
- static auto map_member_type = [](const osmium::RelationMember& member) noexcept -> int32_t {
- return int32_t(osmium::item_type_to_nwr_index(member.type()));
- };
- pbf_relation.add_packed_int32(OSMFormat::Relation::packed_MemberType_types,
- boost::make_transform_iterator(relation.members().begin(), map_member_type),
- boost::make_transform_iterator(relation.members().end(), map_member_type));
- }
-
- }; // class PBFOutputFormat
-
- // we want the register_output_format() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_pbf_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::pbf,
- [](const osmium::io::File& file, future_string_queue_type& output_queue) {
- return new osmium::io::detail::PBFOutputFormat(file, output_queue);
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_pbf_output() noexcept {
- return registered_pbf_output;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PBF_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/protobuf_tags.hpp b/contrib/libosmium/osmium/io/detail/protobuf_tags.hpp
deleted file mode 100644
index 3f23087..0000000
--- a/contrib/libosmium/osmium/io/detail/protobuf_tags.hpp
+++ /dev/null
@@ -1,170 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_PROTOBUF_TAGS_HPP
-#define OSMIUM_IO_DETAIL_PROTOBUF_TAGS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <protozero/pbf_types.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- // directly translated from
- // https://github.com/scrosby/OSM-binary/blob/master/src/fileformat.proto
-
- namespace FileFormat {
-
- enum class Blob : protozero::pbf_tag_type {
- optional_bytes_raw = 1,
- optional_int32_raw_size = 2,
- optional_bytes_zlib_data = 3,
- optional_bytes_lzma_data = 4
- };
-
- enum class BlobHeader : protozero::pbf_tag_type {
- required_string_type = 1,
- optional_bytes_indexdata = 2,
- required_int32_datasize = 3
- };
-
- } // namespace FileFormat
-
- // directly translated from
- // https://github.com/scrosby/OSM-binary/blob/master/src/osmformat.proto
-
- namespace OSMFormat {
-
- enum class HeaderBlock : protozero::pbf_tag_type {
- optional_HeaderBBox_bbox = 1,
- repeated_string_required_features = 4,
- repeated_string_optional_features = 5,
- optional_string_writingprogram = 16,
- optional_string_source = 17,
- optional_int64_osmosis_replication_timestamp = 32,
- optional_int64_osmosis_replication_sequence_number = 33,
- optional_string_osmosis_replication_base_url = 34
- };
-
- enum class HeaderBBox : protozero::pbf_tag_type {
- required_sint64_left = 1,
- required_sint64_right = 2,
- required_sint64_top = 3,
- required_sint64_bottom = 4
- };
-
- enum class PrimitiveBlock : protozero::pbf_tag_type {
- required_StringTable_stringtable = 1,
- repeated_PrimitiveGroup_primitivegroup = 2,
- optional_int32_granularity = 17,
- optional_int32_date_granularity = 18,
- optional_int64_lat_offset = 19,
- optional_int64_lon_offset = 20
- };
-
- enum class PrimitiveGroup : protozero::pbf_tag_type {
- unknown = 0,
- repeated_Node_nodes = 1,
- optional_DenseNodes_dense = 2,
- repeated_Way_ways = 3,
- repeated_Relation_relations = 4,
- repeated_ChangeSet_changesets = 5
- };
-
- enum class StringTable : protozero::pbf_tag_type {
- repeated_bytes_s = 1
- };
-
- enum class Info : protozero::pbf_tag_type {
- optional_int32_version = 1,
- optional_int64_timestamp = 2,
- optional_int64_changeset = 3,
- optional_int32_uid = 4,
- optional_uint32_user_sid = 5,
- optional_bool_visible = 6
- };
-
- enum class DenseInfo : protozero::pbf_tag_type {
- packed_int32_version = 1,
- packed_sint64_timestamp = 2,
- packed_sint64_changeset = 3,
- packed_sint32_uid = 4,
- packed_sint32_user_sid = 5,
- packed_bool_visible = 6
- };
-
- enum class Node : protozero::pbf_tag_type {
- required_sint64_id = 1,
- packed_uint32_keys = 2,
- packed_uint32_vals = 3,
- optional_Info_info = 4,
- required_sint64_lat = 8,
- required_sint64_lon = 9
- };
-
- enum class DenseNodes : protozero::pbf_tag_type {
- packed_sint64_id = 1,
- optional_DenseInfo_denseinfo = 5,
- packed_sint64_lat = 8,
- packed_sint64_lon = 9,
- packed_int32_keys_vals = 10
- };
-
- enum class Way : protozero::pbf_tag_type {
- required_int64_id = 1,
- packed_uint32_keys = 2,
- packed_uint32_vals = 3,
- optional_Info_info = 4,
- packed_sint64_refs = 8
- };
-
- enum class Relation : protozero::pbf_tag_type {
- required_int64_id = 1,
- packed_uint32_keys = 2,
- packed_uint32_vals = 3,
- optional_Info_info = 4,
- packed_int32_roles_sid = 8,
- packed_sint64_memids = 9,
- packed_MemberType_types = 10
- };
-
- } // namespace OSMFormat
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_PROTOBUF_TAGS_HPP
diff --git a/contrib/libosmium/osmium/io/detail/queue_util.hpp b/contrib/libosmium/osmium/io/detail/queue_util.hpp
deleted file mode 100644
index d410df1..0000000
--- a/contrib/libosmium/osmium/io/detail/queue_util.hpp
+++ /dev/null
@@ -1,157 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_QUEUE_UTIL_HPP
-#define OSMIUM_IO_DETAIL_QUEUE_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <exception>
-#include <future>
-#include <string>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/thread/queue.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- /**
- * This type of queue contains buffers with OSM data in them.
- * The "end of file" is marked by an invalid Buffer.
- * The buffers are wrapped in a std::future so that they can also
- * transport exceptions. The future also helps with keeping the
- * data in order.
- */
- using future_buffer_queue_type = osmium::thread::Queue<std::future<osmium::memory::Buffer>>;
-
- /**
- * This type of queue contains OSM file data in the form it is
- * stored on disk, ie encoded as XML, PBF, etc.
- * The "end of file" is marked by an empty string.
- */
- using string_queue_type = osmium::thread::Queue<std::string>;
-
- /**
- * This type of queue contains OSM file data in the form it is
- * stored on disk, ie encoded as XML, PBF, etc.
- * The "end of file" is marked by an empty string.
- * The strings are wrapped in a std::future so that they can also
- * transport exceptions. The future also helps with keeping the
- * data in order.
- */
- using future_string_queue_type = osmium::thread::Queue<std::future<std::string>>;
-
- template <typename T>
- inline void add_to_queue(osmium::thread::Queue<std::future<T>>& queue, T&& data) {
- std::promise<T> promise;
- queue.push(promise.get_future());
- promise.set_value(std::forward<T>(data));
- }
-
- template <typename T>
- inline void add_to_queue(osmium::thread::Queue<std::future<T>>& queue, std::exception_ptr&& exception) {
- std::promise<T> promise;
- queue.push(promise.get_future());
- promise.set_exception(std::move(exception));
- }
-
- template <typename T>
- inline void add_end_of_data_to_queue(osmium::thread::Queue<std::future<T>>& queue) {
- add_to_queue<T>(queue, T{});
- }
-
- inline bool at_end_of_data(const std::string& data) {
- return data.empty();
- }
-
- inline bool at_end_of_data(osmium::memory::Buffer& buffer) {
- return !buffer;
- }
-
- template <typename T>
- class queue_wrapper {
-
- using queue_type = osmium::thread::Queue<std::future<T>>;
-
- queue_type& m_queue;
- bool m_has_reached_end_of_data;
-
- public:
-
- queue_wrapper(queue_type& queue) :
- m_queue(queue),
- m_has_reached_end_of_data(false) {
- }
-
- ~queue_wrapper() noexcept {
- drain();
- }
-
- void drain() {
- while (!m_has_reached_end_of_data) {
- try {
- pop();
- } catch (...) {
- // Ignore any exceptions.
- }
- }
- }
-
- bool has_reached_end_of_data() const noexcept {
- return m_has_reached_end_of_data;
- }
-
- T pop() {
- T data;
- if (!m_has_reached_end_of_data) {
- std::future<T> data_future;
- m_queue.wait_and_pop(data_future);
- data = std::move(data_future.get());
- if (at_end_of_data(data)) {
- m_has_reached_end_of_data = true;
- }
- }
- return data;
- }
-
- }; // class queue_wrapper
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_QUEUE_UTIL_HPP
diff --git a/contrib/libosmium/osmium/io/detail/read_thread.hpp b/contrib/libosmium/osmium/io/detail/read_thread.hpp
deleted file mode 100644
index 6f96c0b..0000000
--- a/contrib/libosmium/osmium/io/detail/read_thread.hpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_READ_THREAD_HPP
-#define OSMIUM_IO_DETAIL_READ_THREAD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <atomic>
-#include <exception>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- /**
- * This code uses an internally managed thread to read data from
- * the input file and (optionally) decompress it. The result is
- * sent to the given queue. Any exceptions will also be send to
- * the queue.
- */
- class ReadThreadManager {
-
- // only used in the sub-thread
- osmium::io::Decompressor& m_decompressor;
- future_string_queue_type& m_queue;
-
- // used in both threads
- std::atomic<bool> m_done;
-
- // only used in the main thread
- std::thread m_thread;
-
- void run_in_thread() {
- osmium::thread::set_thread_name("_osmium_read");
-
- try {
- while (!m_done) {
- std::string data {m_decompressor.read()};
- if (at_end_of_data(data)) {
- break;
- }
- add_to_queue(m_queue, std::move(data));
- }
-
- m_decompressor.close();
- } catch (...) {
- add_to_queue(m_queue, std::current_exception());
- }
-
- add_end_of_data_to_queue(m_queue);
- }
-
- public:
-
- ReadThreadManager(osmium::io::Decompressor& decompressor,
- future_string_queue_type& queue) :
- m_decompressor(decompressor),
- m_queue(queue),
- m_done(false),
- m_thread(std::thread(&ReadThreadManager::run_in_thread, this)) {
- }
-
- ReadThreadManager(const ReadThreadManager&) = delete;
- ReadThreadManager& operator=(const ReadThreadManager&) = delete;
-
- ReadThreadManager(ReadThreadManager&&) = delete;
- ReadThreadManager& operator=(ReadThreadManager&&) = delete;
-
- ~ReadThreadManager() noexcept {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- void stop() noexcept {
- m_done = true;
- }
-
- void close() {
- stop();
- if (m_thread.joinable()) {
- m_thread.join();
- }
- }
-
- }; // class ReadThreadManager
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_READ_THREAD_HPP
diff --git a/contrib/libosmium/osmium/io/detail/read_write.hpp b/contrib/libosmium/osmium/io/detail/read_write.hpp
deleted file mode 100644
index 5d1fa26..0000000
--- a/contrib/libosmium/osmium/io/detail/read_write.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_READ_WRITE_HPP
-#define OSMIUM_IO_DETAIL_READ_WRITE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <cstddef>
-#include <errno.h>
-#include <fcntl.h>
-#include <string>
-#include <system_error>
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#else
-# include <io.h>
-#endif
-
-#include <osmium/io/writer_options.hpp>
-
-namespace osmium {
-
- namespace io {
-
- /**
- * @brief Namespace for Osmium internal use
- */
- namespace detail {
-
- /**
- * Open file for writing. If the file exists, it is truncated, if
- * not, it is created. If the file name is empty or "-", no file
- * is opened and the stdout file descriptor (1) is returned.
- *
- * @param filename Name of file to be opened.
- * @param allow_overwrite If the file exists, should it be overwritten?
- * @returns File descriptor of open file.
- * @throws system_error if the file can't be opened.
- */
- inline int open_for_writing(const std::string& filename, osmium::io::overwrite allow_overwrite = osmium::io::overwrite::no) {
- if (filename == "" || filename == "-") {
-#ifdef _WIN32
- _setmode(1, _O_BINARY);
-#endif
- return 1; // stdout
- } else {
- int flags = O_WRONLY | O_CREAT;
- if (allow_overwrite == osmium::io::overwrite::allow) {
- flags |= O_TRUNC;
- } else {
- flags |= O_EXCL;
- }
-#ifdef _WIN32
- flags |= O_BINARY;
-#endif
- int fd = ::open(filename.c_str(), flags, 0666);
- if (fd < 0) {
- throw std::system_error(errno, std::system_category(), std::string("Open failed for '") + filename + "'");
- }
- return fd;
- }
- }
-
- /**
- * Open file for reading. If the file name is empty or "-", no file
- * is opened and the stdin file descriptor (0) is returned.
- *
- * @param filename Name of file to be opened.
- * @returns File descriptor of open file.
- * @throws system_error if the file can't be opened.
- */
- inline int open_for_reading(const std::string& filename) {
- if (filename == "" || filename == "-") {
- return 0; // stdin
- } else {
- int flags = O_RDONLY;
-#ifdef _WIN32
- flags |= O_BINARY;
-#endif
- int fd = ::open(filename.c_str(), flags);
- if (fd < 0) {
- throw std::system_error(errno, std::system_category(), std::string("Open failed for '") + filename + "'");
- }
- return fd;
- }
- }
-
- /**
- * Writes the given number of bytes from the output_buffer to the file descriptor.
- * This is just a wrapper around write(2), because write(2) can write less than
- * the given number of bytes.
- *
- * @param fd File descriptor.
- * @param output_buffer Buffer with data to be written. Must be at least size bytes long.
- * @param size Number of bytes to write.
- * @throws std::system_error On error.
- */
- inline void reliable_write(const int fd, const unsigned char* output_buffer, const size_t size) {
- constexpr size_t max_write = 100L * 1024L * 1024L; // Max 100 MByte per write
- size_t offset = 0;
- do {
- auto write_count = size - offset;
- if (write_count > max_write) {
- write_count = max_write;
- }
- auto length = ::write(fd, output_buffer + offset, static_cast<unsigned int>(write_count));
- if (length < 0) {
- throw std::system_error(errno, std::system_category(), "Write failed");
- }
- offset += static_cast<size_t>(length);
- } while (offset < size);
- }
-
- /**
- * Writes the given number of bytes from the output_buffer to the file descriptor.
- * This is just a wrapper around write(2), because write(2) can write less than
- * the given number of bytes.
- *
- * @param fd File descriptor.
- * @param output_buffer Buffer with data to be written. Must be at least size bytes long.
- * @param size Number of bytes to write.
- * @throws std::system_error On error.
- */
- inline void reliable_write(const int fd, const char* output_buffer, const size_t size) {
- reliable_write(fd, reinterpret_cast<const unsigned char*>(output_buffer), size);
- }
-
- inline void reliable_fsync(const int fd) {
-#ifdef _WIN32
- if (_commit(fd) != 0) {
-#else
- if (::fsync(fd) != 0) {
-#endif
- throw std::system_error(errno, std::system_category(), "Fsync failed");
- }
- }
-
- inline void reliable_close(const int fd) {
- if (::close(fd) != 0) {
- throw std::system_error(errno, std::system_category(), "Close failed");
- }
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_READ_WRITE_HPP
diff --git a/contrib/libosmium/osmium/io/detail/string_table.hpp b/contrib/libosmium/osmium/io/detail/string_table.hpp
deleted file mode 100644
index a23035d..0000000
--- a/contrib/libosmium/osmium/io/detail/string_table.hpp
+++ /dev/null
@@ -1,265 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_STRING_TABLE_HPP
-#define OSMIUM_IO_DETAIL_STRING_TABLE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstdint>
-#include <cstdlib>
-#include <cstring>
-#include <iterator>
-#include <list>
-#include <map>
-#include <string>
-
-#include <osmium/io/detail/pbf.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- /**
- * class StringStore
- *
- * Storage of lots of strings (const char *). Memory is allocated in chunks.
- * If a string is added and there is no space in the current chunk, a new
- * chunk will be allocated. Strings added to the store must not be larger
- * than the chunk size.
- *
- * All memory is released when the destructor is called. There is no other way
- * to release all or part of the memory.
- *
- */
- class StringStore {
-
- size_t m_chunk_size;
-
- std::list<std::string> m_chunks;
-
- void add_chunk() {
- m_chunks.push_front(std::string());
- m_chunks.front().reserve(m_chunk_size);
- }
-
- public:
-
- StringStore(size_t chunk_size) :
- m_chunk_size(chunk_size),
- m_chunks() {
- add_chunk();
- }
-
- void clear() noexcept {
- m_chunks.erase(std::next(m_chunks.begin()), m_chunks.end());
- m_chunks.front().clear();
- }
-
- /**
- * Add a null terminated string to the store. This will
- * automatically get more memory if we are out.
- * Returns a pointer to the copy of the string we have
- * allocated.
- */
- const char* add(const char* string) {
- size_t len = std::strlen(string) + 1;
-
- assert(len <= m_chunk_size);
-
- size_t chunk_len = m_chunks.front().size();
- if (chunk_len + len > m_chunks.front().capacity()) {
- add_chunk();
- chunk_len = 0;
- }
-
- m_chunks.front().append(string);
- m_chunks.front().append(1, '\0');
-
- return m_chunks.front().c_str() + chunk_len;
- }
-
- class const_iterator : public std::iterator<std::forward_iterator_tag, const char*> {
-
- typedef std::list<std::string>::const_iterator it_type;
- it_type m_it;
- const it_type m_last;
- const char* m_pos;
-
- public:
-
- const_iterator(it_type it, it_type last) :
- m_it(it),
- m_last(last),
- m_pos(it == last ? nullptr : m_it->c_str()) {
- }
-
- const_iterator& operator++() {
- assert(m_it != m_last);
- auto last_pos = m_it->c_str() + m_it->size();
- while (m_pos != last_pos && *m_pos) ++m_pos;
- if (m_pos != last_pos) ++m_pos;
- if (m_pos == last_pos) {
- ++m_it;
- if (m_it != m_last) {
- m_pos = m_it->c_str();
- } else {
- m_pos = nullptr;
- }
- }
- return *this;
- }
-
- const_iterator operator++(int) {
- const_iterator tmp(*this);
- operator++();
- return tmp;
- }
-
- bool operator==(const const_iterator& rhs) const {
- return m_it == rhs.m_it && m_pos == rhs.m_pos;
- }
-
- bool operator!=(const const_iterator& rhs) const {
- return !(*this == rhs);
- }
-
- const char* operator*() const {
- assert(m_it != m_last);
- assert(m_pos != nullptr);
- return m_pos;
- }
-
- }; // class const_iterator
-
- const_iterator begin() const {
- if (m_chunks.front().empty()) {
- return end();
- }
- return const_iterator(m_chunks.begin(), m_chunks.end());
- }
-
- const_iterator end() const {
- return const_iterator(m_chunks.end(), m_chunks.end());
- }
-
- // These functions get you some idea how much memory was
- // used.
- size_t get_chunk_size() const noexcept {
- return m_chunk_size;
- }
-
- size_t get_chunk_count() const noexcept {
- return m_chunks.size();
- }
-
- size_t get_used_bytes_in_last_chunk() const noexcept {
- return m_chunks.front().size();
- }
-
- }; // class StringStore
-
- struct StrComp {
-
- bool operator()(const char* lhs, const char* rhs) const {
- return strcmp(lhs, rhs) < 0;
- }
-
- }; // struct StrComp
-
- class StringTable {
-
- // This is the maximum number of entries in a string table.
- // This should never be reached in practice but we better
- // make sure it doesn't. If we had max_uncompressed_blob_size
- // many entries, we are sure they would never fit into a PBF
- // Blob.
- static constexpr const uint32_t max_entries = max_uncompressed_blob_size;
-
- StringStore m_strings;
- std::map<const char*, size_t, StrComp> m_index;
- uint32_t m_size;
-
- public:
-
- StringTable() :
- m_strings(1024 * 1024),
- m_index(),
- m_size(0) {
- m_strings.add("");
- }
-
- void clear() {
- m_strings.clear();
- m_index.clear();
- m_size = 0;
- m_strings.add("");
- }
-
- uint32_t size() const noexcept {
- return m_size + 1;
- }
-
- uint32_t add(const char* s) {
- auto f = m_index.find(s);
- if (f != m_index.end()) {
- return uint32_t(f->second);
- }
-
- const char* cs = m_strings.add(s);
- m_index[cs] = ++m_size;
-
- if (m_size > max_entries) {
- throw osmium::pbf_error("string table has too many entries");
- }
-
- return m_size;
- }
-
- StringStore::const_iterator begin() const {
- return m_strings.begin();
- }
-
- StringStore::const_iterator end() const {
- return m_strings.end();
- }
-
- }; // class StringTable
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_STRING_TABLE_HPP
diff --git a/contrib/libosmium/osmium/io/detail/string_util.hpp b/contrib/libosmium/osmium/io/detail/string_util.hpp
deleted file mode 100644
index 672266a..0000000
--- a/contrib/libosmium/osmium/io/detail/string_util.hpp
+++ /dev/null
@@ -1,206 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_STRING_UTIL_HPP
-#define OSMIUM_IO_DETAIL_STRING_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstdint>
-#include <cstring>
-#include <string>
-#include <utility>
-
-#include <utf8.h>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
-#ifndef _MSC_VER
-# define SNPRINTF std::snprintf
-#else
-# define SNPRINTF _snprintf
-#endif
-
- template <typename... TArgs>
- inline int string_snprintf(std::string& out,
- size_t old_size,
- size_t max_size,
- const char* format,
- TArgs&&... args) {
- out.resize(old_size + max_size);
-
- return SNPRINTF(max_size ? const_cast<char*>(out.c_str()) + old_size : nullptr,
- max_size,
- format,
- std::forward<TArgs>(args)...);
- }
-
-#undef SNPRINTF
-
- /**
- * This is a helper function for writing printf-like formatted
- * data into a std::string.
- *
- * @param out The data will be appended to this string.
- * @param format A string with formatting instructions a la printf.
- * @param args Any further arguments like in printf.
- * @throws std::bad_alloc If the string needed to grow and there
- * wasn't enough memory.
- */
- template <typename... TArgs>
- inline void append_printf_formatted_string(std::string& out,
- const char* format,
- TArgs&&... args) {
-
- // First try to write string with the max_size, if that doesn't
- // work snprintf will tell us how much space it needs. We
- // reserve that much space and try again. So this will always
- // work, even if the output is larger than the given max_size.
- //
- // Unfortunately this trick doesn't work on Windows, because
- // the _snprintf() function there only returns the length it
- // needs if max_size==0 and the buffer pointer is the null
- // pointer. So we have to take this into account.
-
-#ifndef _MSC_VER
- static const size_t max_size = 100;
-#else
- static const size_t max_size = 0;
-#endif
-
- size_t old_size = out.size();
-
- int len = string_snprintf(out,
- old_size,
- max_size,
- format,
- std::forward<TArgs>(args)...);
- assert(len > 0);
-
- if (size_t(len) >= max_size) {
- int len2 = string_snprintf(out,
- old_size,
- size_t(len) + 1,
- format,
- std::forward<TArgs>(args)...);
- assert(len2 == len);
- }
-
- out.resize(old_size + size_t(len));
- }
-
- inline void append_utf8_encoded_string(std::string& out, const char* data) {
- const char* end = data + std::strlen(data);
-
- while (data != end) {
- const char* last = data;
- uint32_t c = utf8::next(data, end);
-
- // This is a list of Unicode code points that we let
- // through instead of escaping them. It is incomplete
- // and can be extended later.
- // Generally we don't want to let through any character
- // that has special meaning in the OPL format such as
- // space, comma, @, etc. and any non-printing characters.
- if ((0x0021 <= c && c <= 0x0024) ||
- (0x0026 <= c && c <= 0x002b) ||
- (0x002d <= c && c <= 0x003c) ||
- (0x003e <= c && c <= 0x003f) ||
- (0x0041 <= c && c <= 0x007e) ||
- (0x00a1 <= c && c <= 0x00ac) ||
- (0x00ae <= c && c <= 0x05ff)) {
- out.append(last, data);
- } else {
- out += '%';
- if (c <= 0xff) {
- append_printf_formatted_string(out, "%02x", c);
- } else {
- append_printf_formatted_string(out, "%04x", c);
- }
- out += '%';
- }
- }
- }
-
- inline void append_xml_encoded_string(std::string& out, const char* data) {
- for (; *data != '\0'; ++data) {
- switch(*data) {
- case '&': out += "&"; break;
- case '\"': out += """; break;
- case '\'': out += "'"; break;
- case '<': out += "<"; break;
- case '>': out += ">"; break;
- case '\n': out += "
"; break;
- case '\r': out += "
"; break;
- case '\t': out += "	"; break;
- default: out += *data; break;
- }
- }
- }
-
- inline void append_debug_encoded_string(std::string& out, const char* data, const char* prefix, const char* suffix) {
- const char* end = data + std::strlen(data);
-
- while (data != end) {
- const char* last = data;
- uint32_t c = utf8::next(data, end);
-
- // This is a list of Unicode code points that we let
- // through instead of escaping them. It is incomplete
- // and can be extended later.
- // Generally we don't want to let through any
- // non-printing characters.
- if ((0x0020 <= c && c <= 0x0021) ||
- (0x0023 <= c && c <= 0x003b) ||
- (0x003d == c) ||
- (0x003f <= c && c <= 0x007e) ||
- (0x00a1 <= c && c <= 0x00ac) ||
- (0x00ae <= c && c <= 0x05ff)) {
- out.append(last, data);
- } else {
- out.append(prefix);
- append_printf_formatted_string(out, "<U+%04X>", c);
- out.append(suffix);
- }
- }
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_STRING_UTIL_HPP
diff --git a/contrib/libosmium/osmium/io/detail/write_thread.hpp b/contrib/libosmium/osmium/io/detail/write_thread.hpp
deleted file mode 100644
index 81ab194..0000000
--- a/contrib/libosmium/osmium/io/detail/write_thread.hpp
+++ /dev/null
@@ -1,107 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_WRITE_THREAD_HPP
-#define OSMIUM_IO_DETAIL_WRITE_THREAD_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <exception>
-#include <future>
-#include <string>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- /**
- * This codes runs in its own thread, getting data from the given
- * queue, (optionally) compressing it, and writing it to the output
- * file.
- */
- class WriteThread {
-
- queue_wrapper<std::string> m_queue;
- std::unique_ptr<osmium::io::Compressor> m_compressor;
- std::promise<bool> m_promise;
-
- public:
-
- WriteThread(future_string_queue_type& input_queue,
- std::unique_ptr<osmium::io::Compressor>&& compressor,
- std::promise<bool>&& promise) :
- m_queue(input_queue),
- m_compressor(std::move(compressor)),
- m_promise(std::move(promise)) {
- }
-
- WriteThread(const WriteThread&) = delete;
- WriteThread& operator=(const WriteThread&) = delete;
-
- WriteThread(WriteThread&&) = delete;
- WriteThread& operator=(WriteThread&&) = delete;
-
- ~WriteThread() noexcept = default;
-
- void operator()() {
- osmium::thread::set_thread_name("_osmium_write");
-
- try {
- while (true) {
- std::string data = m_queue.pop();
- if (at_end_of_data(data)) {
- break;
- }
- m_compressor->write(data);
- }
- m_compressor->close();
- m_promise.set_value(true);
- } catch (...) {
- m_promise.set_exception(std::current_exception());
- m_queue.drain();
- }
- }
-
- }; // class WriteThread
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_WRITE_THREAD_HPP
diff --git a/contrib/libosmium/osmium/io/detail/xml_input_format.hpp b/contrib/libosmium/osmium/io/detail/xml_input_format.hpp
deleted file mode 100644
index 45dbde0..0000000
--- a/contrib/libosmium/osmium/io/detail/xml_input_format.hpp
+++ /dev/null
@@ -1,679 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_XML_INPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_XML_INPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <cstdlib>
-#include <cstring>
-#include <exception>
-#include <future>
-#include <memory>
-#include <string>
-#include <utility>
-
-#include <expat.h>
-
-#include <osmium/builder/builder.hpp>
-#include <osmium/builder/osm_object_builder.hpp>
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/types_from_string.hpp>
-#include <osmium/thread/queue.hpp>
-#include <osmium/thread/util.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown when the XML parser failed. The exception contains
- * (if available) information about the place where the error happened
- * and the type of error.
- */
- struct xml_error : public io_error {
-
- unsigned long line;
- unsigned long column;
- XML_Error error_code;
- std::string error_string;
-
- explicit xml_error(XML_Parser parser) :
- io_error(std::string("XML parsing error at line ")
- + std::to_string(XML_GetCurrentLineNumber(parser))
- + ", column "
- + std::to_string(XML_GetCurrentColumnNumber(parser))
- + ": "
- + XML_ErrorString(XML_GetErrorCode(parser))),
- line(XML_GetCurrentLineNumber(parser)),
- column(XML_GetCurrentColumnNumber(parser)),
- error_code(XML_GetErrorCode(parser)),
- error_string(XML_ErrorString(error_code)) {
- }
-
- explicit xml_error(const std::string& message) :
- io_error(message),
- line(0),
- column(0),
- error_code(),
- error_string(message) {
- }
-
- }; // struct xml_error
-
- /**
- * Exception thrown when an OSM XML files contains no version attribute
- * on the 'osm' element or if the version is unknown.
- */
- struct format_version_error : public io_error {
-
- std::string version;
-
- explicit format_version_error() :
- io_error("Can not read file without version (missing version attribute on osm element)."),
- version() {
- }
-
- explicit format_version_error(const char* v) :
- io_error(std::string("Can not read file with version ") + v),
- version(v) {
- }
-
- }; // struct format_version_error
-
- namespace io {
-
- namespace detail {
-
- class XMLParser : public Parser {
-
- static constexpr int buffer_size = 2 * 1000 * 1000;
-
- enum class context {
- root,
- top,
- node,
- way,
- relation,
- changeset,
- discussion,
- comment,
- comment_text,
- ignored_node,
- ignored_way,
- ignored_relation,
- ignored_changeset,
- in_object
- }; // enum class context
-
- context m_context;
- context m_last_context;
-
- /**
- * This is used only for change files which contain create, modify,
- * and delete sections.
- */
- bool m_in_delete_section;
-
- osmium::io::Header m_header;
-
- osmium::memory::Buffer m_buffer;
-
- std::unique_ptr<osmium::builder::NodeBuilder> m_node_builder;
- std::unique_ptr<osmium::builder::WayBuilder> m_way_builder;
- std::unique_ptr<osmium::builder::RelationBuilder> m_relation_builder;
- std::unique_ptr<osmium::builder::ChangesetBuilder> m_changeset_builder;
- std::unique_ptr<osmium::builder::ChangesetDiscussionBuilder> m_changeset_discussion_builder;
-
- std::unique_ptr<osmium::builder::TagListBuilder> m_tl_builder;
- std::unique_ptr<osmium::builder::WayNodeListBuilder> m_wnl_builder;
- std::unique_ptr<osmium::builder::RelationMemberListBuilder> m_rml_builder;
-
- std::string m_comment_text;
-
- /**
- * A C++ wrapper for the Expat parser that makes sure no memory is leaked.
- */
- template <typename T>
- class ExpatXMLParser {
-
- XML_Parser m_parser;
-
- static void XMLCALL start_element_wrapper(void* data, const XML_Char* element, const XML_Char** attrs) {
- static_cast<XMLParser*>(data)->start_element(element, attrs);
- }
-
- static void XMLCALL end_element_wrapper(void* data, const XML_Char* element) {
- static_cast<XMLParser*>(data)->end_element(element);
- }
-
- static void XMLCALL character_data_wrapper(void* data, const XML_Char* text, int len) {
- static_cast<XMLParser*>(data)->characters(text, len);
- }
-
- public:
-
- ExpatXMLParser(T* callback_object) :
- m_parser(XML_ParserCreate(nullptr)) {
- if (!m_parser) {
- throw osmium::io_error("Internal error: Can not create parser");
- }
- XML_SetUserData(m_parser, callback_object);
- XML_SetElementHandler(m_parser, start_element_wrapper, end_element_wrapper);
- XML_SetCharacterDataHandler(m_parser, character_data_wrapper);
- }
-
- ExpatXMLParser(const ExpatXMLParser&) = delete;
- ExpatXMLParser(ExpatXMLParser&&) = delete;
-
- ExpatXMLParser& operator=(const ExpatXMLParser&) = delete;
- ExpatXMLParser& operator=(ExpatXMLParser&&) = delete;
-
- ~ExpatXMLParser() noexcept {
- XML_ParserFree(m_parser);
- }
-
- void operator()(const std::string& data, bool last) {
- if (XML_Parse(m_parser, data.data(), static_cast_with_assert<int>(data.size()), last) == XML_STATUS_ERROR) {
- throw osmium::xml_error(m_parser);
- }
- }
-
- }; // class ExpatXMLParser
-
- template <typename T>
- static void check_attributes(const XML_Char** attrs, T check) {
- while (*attrs) {
- check(attrs[0], attrs[1]);
- attrs += 2;
- }
- }
-
- const char* init_object(osmium::OSMObject& object, const XML_Char** attrs) {
- const char* user = "";
-
- if (m_in_delete_section) {
- object.set_visible(false);
- }
-
- osmium::Location location;
-
- check_attributes(attrs, [&location, &user, &object](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "lon")) {
- location.set_lon(std::atof(value)); // XXX doesn't detect garbage after the number
- } else if (!strcmp(name, "lat")) {
- location.set_lat(std::atof(value)); // XXX doesn't detect garbage after the number
- } else if (!strcmp(name, "user")) {
- user = value;
- } else {
- object.set_attribute(name, value);
- }
- });
-
- if (location && object.type() == osmium::item_type::node) {
- static_cast<osmium::Node&>(object).set_location(location);
- }
-
- return user;
- }
-
- void init_changeset(osmium::builder::ChangesetBuilder* builder, const XML_Char** attrs) {
- const char* user = "";
- osmium::Changeset& new_changeset = builder->object();
-
- osmium::Location min;
- osmium::Location max;
- check_attributes(attrs, [&min, &max, &user, &new_changeset](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "min_lon")) {
- min.set_lon(atof(value));
- } else if (!strcmp(name, "min_lat")) {
- min.set_lat(atof(value));
- } else if (!strcmp(name, "max_lon")) {
- max.set_lon(atof(value));
- } else if (!strcmp(name, "max_lat")) {
- max.set_lat(atof(value));
- } else if (!strcmp(name, "user")) {
- user = value;
- } else {
- new_changeset.set_attribute(name, value);
- }
- });
-
- new_changeset.bounds().extend(min);
- new_changeset.bounds().extend(max);
-
- builder->add_user(user);
- }
-
- void get_tag(osmium::builder::Builder* builder, const XML_Char** attrs) {
- const char* k = "";
- const char* v = "";
- check_attributes(attrs, [&k, &v](const XML_Char* name, const XML_Char* value) {
- if (name[0] == 'k' && name[1] == 0) {
- k = value;
- } else if (name[0] == 'v' && name[1] == 0) {
- v = value;
- }
- });
- if (!m_tl_builder) {
- m_tl_builder = std::unique_ptr<osmium::builder::TagListBuilder>(new osmium::builder::TagListBuilder(m_buffer, builder));
- }
- m_tl_builder->add_tag(k, v);
- }
-
- void mark_header_as_done() {
- set_header_value(m_header);
- }
-
- void start_element(const XML_Char* element, const XML_Char** attrs) {
- switch (m_context) {
- case context::root:
- if (!strcmp(element, "osm") || !strcmp(element, "osmChange")) {
- if (!strcmp(element, "osmChange")) {
- m_header.set_has_multiple_object_versions(true);
- }
- check_attributes(attrs, [this](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "version")) {
- m_header.set("version", value);
- if (strcmp(value, "0.6")) {
- throw osmium::format_version_error(value);
- }
- } else if (!strcmp(name, "generator")) {
- m_header.set("generator", value);
- }
- });
- if (m_header.get("version") == "") {
- throw osmium::format_version_error();
- }
- } else {
- throw osmium::xml_error(std::string("Unknown top-level element: ") + element);
- }
- m_context = context::top;
- break;
- case context::top:
- assert(!m_tl_builder);
- if (!strcmp(element, "node")) {
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::node) {
- m_node_builder = std::unique_ptr<osmium::builder::NodeBuilder>(new osmium::builder::NodeBuilder(m_buffer));
- m_node_builder->add_user(init_object(m_node_builder->object(), attrs));
- m_context = context::node;
- } else {
- m_context = context::ignored_node;
- }
- } else if (!strcmp(element, "way")) {
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::way) {
- m_way_builder = std::unique_ptr<osmium::builder::WayBuilder>(new osmium::builder::WayBuilder(m_buffer));
- m_way_builder->add_user(init_object(m_way_builder->object(), attrs));
- m_context = context::way;
- } else {
- m_context = context::ignored_way;
- }
- } else if (!strcmp(element, "relation")) {
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::relation) {
- m_relation_builder = std::unique_ptr<osmium::builder::RelationBuilder>(new osmium::builder::RelationBuilder(m_buffer));
- m_relation_builder->add_user(init_object(m_relation_builder->object(), attrs));
- m_context = context::relation;
- } else {
- m_context = context::ignored_relation;
- }
- } else if (!strcmp(element, "changeset")) {
- mark_header_as_done();
- if (read_types() & osmium::osm_entity_bits::changeset) {
- m_changeset_builder = std::unique_ptr<osmium::builder::ChangesetBuilder>(new osmium::builder::ChangesetBuilder(m_buffer));
- init_changeset(m_changeset_builder.get(), attrs);
- m_context = context::changeset;
- } else {
- m_context = context::ignored_changeset;
- }
- } else if (!strcmp(element, "bounds")) {
- osmium::Location min;
- osmium::Location max;
- check_attributes(attrs, [&min, &max](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "minlon")) {
- min.set_lon(atof(value));
- } else if (!strcmp(name, "minlat")) {
- min.set_lat(atof(value));
- } else if (!strcmp(name, "maxlon")) {
- max.set_lon(atof(value));
- } else if (!strcmp(name, "maxlat")) {
- max.set_lat(atof(value));
- }
- });
- osmium::Box box;
- box.extend(min).extend(max);
- m_header.add_box(box);
- } else if (!strcmp(element, "delete")) {
- m_in_delete_section = true;
- }
- break;
- case context::node:
- m_last_context = context::node;
- m_context = context::in_object;
- if (!strcmp(element, "tag")) {
- get_tag(m_node_builder.get(), attrs);
- }
- break;
- case context::way:
- m_last_context = context::way;
- m_context = context::in_object;
- if (!strcmp(element, "nd")) {
- m_tl_builder.reset();
-
- if (!m_wnl_builder) {
- m_wnl_builder = std::unique_ptr<osmium::builder::WayNodeListBuilder>(new osmium::builder::WayNodeListBuilder(m_buffer, m_way_builder.get()));
- }
-
- check_attributes(attrs, [this](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "ref")) {
- m_wnl_builder->add_node_ref(osmium::string_to_object_id(value));
- }
- });
- } else if (!strcmp(element, "tag")) {
- m_wnl_builder.reset();
- get_tag(m_way_builder.get(), attrs);
- }
- break;
- case context::relation:
- m_last_context = context::relation;
- m_context = context::in_object;
- if (!strcmp(element, "member")) {
- m_tl_builder.reset();
-
- if (!m_rml_builder) {
- m_rml_builder = std::unique_ptr<osmium::builder::RelationMemberListBuilder>(new osmium::builder::RelationMemberListBuilder(m_buffer, m_relation_builder.get()));
- }
-
- item_type type = item_type::undefined;
- object_id_type ref = 0;
- const char* role = "";
- check_attributes(attrs, [&type, &ref, &role](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "type")) {
- type = char_to_item_type(value[0]);
- } else if (!strcmp(name, "ref")) {
- ref = osmium::string_to_object_id(value);
- } else if (!strcmp(name, "role")) {
- role = static_cast<const char*>(value);
- }
- });
- if (type != item_type::node && type != item_type::way && type != item_type::relation) {
- throw osmium::xml_error("Unknown type on relation member");
- }
- if (ref == 0) {
- throw osmium::xml_error("Missing ref on relation member");
- }
- m_rml_builder->add_member(type, ref, role);
- } else if (!strcmp(element, "tag")) {
- m_rml_builder.reset();
- get_tag(m_relation_builder.get(), attrs);
- }
- break;
- case context::changeset:
- m_last_context = context::changeset;
- if (!strcmp(element, "discussion")) {
- m_context = context::discussion;
- m_tl_builder.reset();
- if (!m_changeset_discussion_builder) {
- m_changeset_discussion_builder = std::unique_ptr<osmium::builder::ChangesetDiscussionBuilder>(new osmium::builder::ChangesetDiscussionBuilder(m_buffer, m_changeset_builder.get()));
- }
- } else if (!strcmp(element, "tag")) {
- m_context = context::in_object;
- m_changeset_discussion_builder.reset();
- get_tag(m_changeset_builder.get(), attrs);
- }
- break;
- case context::discussion:
- if (!strcmp(element, "comment")) {
- m_context = context::comment;
- osmium::Timestamp date;
- osmium::user_id_type uid = 0;
- const char* user = "";
- check_attributes(attrs, [&date, &uid, &user](const XML_Char* name, const XML_Char* value) {
- if (!strcmp(name, "date")) {
- date = osmium::Timestamp(value);
- } else if (!strcmp(name, "uid")) {
- uid = osmium::string_to_user_id(value);
- } else if (!strcmp(name, "user")) {
- user = static_cast<const char*>(value);
- }
- });
- m_changeset_discussion_builder->add_comment(date, uid, user);
- }
- break;
- case context::comment:
- if (!strcmp(element, "text")) {
- m_context = context::comment_text;
- }
- break;
- case context::comment_text:
- break;
- case context::ignored_node:
- break;
- case context::ignored_way:
- break;
- case context::ignored_relation:
- break;
- case context::ignored_changeset:
- break;
- case context::in_object:
- assert(false); // should never be here
- break;
- }
- }
-
- void end_element(const XML_Char* element) {
- switch (m_context) {
- case context::root:
- assert(false); // should never be here
- break;
- case context::top:
- if (!strcmp(element, "osm") || !strcmp(element, "osmChange")) {
- mark_header_as_done();
- m_context = context::root;
- } else if (!strcmp(element, "delete")) {
- m_in_delete_section = false;
- }
- break;
- case context::node:
- assert(!strcmp(element, "node"));
- m_tl_builder.reset();
- m_node_builder.reset();
- m_buffer.commit();
- m_context = context::top;
- flush_buffer();
- break;
- case context::way:
- assert(!strcmp(element, "way"));
- m_tl_builder.reset();
- m_wnl_builder.reset();
- m_way_builder.reset();
- m_buffer.commit();
- m_context = context::top;
- flush_buffer();
- break;
- case context::relation:
- assert(!strcmp(element, "relation"));
- m_tl_builder.reset();
- m_rml_builder.reset();
- m_relation_builder.reset();
- m_buffer.commit();
- m_context = context::top;
- flush_buffer();
- break;
- case context::changeset:
- assert(!strcmp(element, "changeset"));
- m_tl_builder.reset();
- m_changeset_discussion_builder.reset();
- m_changeset_builder.reset();
- m_buffer.commit();
- m_context = context::top;
- flush_buffer();
- break;
- case context::discussion:
- assert(!strcmp(element, "discussion"));
- m_context = context::changeset;
- break;
- case context::comment:
- assert(!strcmp(element, "comment"));
- m_context = context::discussion;
- break;
- case context::comment_text:
- assert(!strcmp(element, "text"));
- m_context = context::comment;
- m_changeset_discussion_builder->add_comment_text(m_comment_text);
- break;
- case context::in_object:
- m_context = m_last_context;
- break;
- case context::ignored_node:
- if (!strcmp(element, "node")) {
- m_context = context::top;
- }
- break;
- case context::ignored_way:
- if (!strcmp(element, "way")) {
- m_context = context::top;
- }
- break;
- case context::ignored_relation:
- if (!strcmp(element, "relation")) {
- m_context = context::top;
- }
- break;
- case context::ignored_changeset:
- if (!strcmp(element, "changeset")) {
- m_context = context::top;
- }
- break;
- }
- }
-
- void characters(const XML_Char* text, int len) {
- if (m_context == context::comment_text) {
- m_comment_text.append(text, len);
- } else {
- m_comment_text.resize(0);
- }
- }
-
- void flush_buffer() {
- if (m_buffer.committed() > buffer_size / 10 * 9) {
- send_to_output_queue(std::move(m_buffer));
- osmium::memory::Buffer buffer(buffer_size);
- using std::swap;
- swap(m_buffer, buffer);
- }
- }
-
- public:
-
- XMLParser(future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_types) :
- Parser(input_queue, output_queue, header_promise, read_types),
- m_context(context::root),
- m_last_context(context::root),
- m_in_delete_section(false),
- m_header(),
- m_buffer(buffer_size),
- m_node_builder(),
- m_way_builder(),
- m_relation_builder(),
- m_changeset_builder(),
- m_changeset_discussion_builder(),
- m_tl_builder(),
- m_wnl_builder(),
- m_rml_builder() {
- }
-
- ~XMLParser() noexcept = default;
-
- void run() override final {
- osmium::thread::set_thread_name("_osmium_xml_in");
-
- ExpatXMLParser<XMLParser> parser(this);
-
- while (!input_done()) {
- std::string data = get_input();
- parser(data, input_done());
- if (read_types() == osmium::osm_entity_bits::nothing && header_is_done()) {
- break;
- }
- }
-
- mark_header_as_done();
-
- if (m_buffer.committed() > 0) {
- send_to_output_queue(std::move(m_buffer));
- }
- }
-
- }; // class XMLParser
-
- // we want the register_parser() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_xml_parser = ParserFactory::instance().register_parser(
- file_format::xml,
- [](future_string_queue_type& input_queue,
- future_buffer_queue_type& output_queue,
- std::promise<osmium::io::Header>& header_promise,
- osmium::osm_entity_bits::type read_which_entities) {
- return std::unique_ptr<Parser>(new XMLParser(input_queue, output_queue, header_promise, read_which_entities));
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_xml_parser() noexcept {
- return registered_xml_parser;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_XML_INPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/xml_output_format.hpp b/contrib/libosmium/osmium/io/detail/xml_output_format.hpp
deleted file mode 100644
index b91b051..0000000
--- a/contrib/libosmium/osmium/io/detail/xml_output_format.hpp
+++ /dev/null
@@ -1,473 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_XML_OUTPUT_FORMAT_HPP
-#define OSMIUM_IO_DETAIL_XML_OUTPUT_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cinttypes>
-#include <cstddef>
-#include <cstdio>
-#include <future>
-#include <iterator>
-#include <memory>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/changeset.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/node.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/way.hpp>
-#include <osmium/thread/pool.hpp>
-#include <osmium/visitor.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- struct XMLWriteError {};
-
- struct xml_output_options {
-
- /// Should metadata of objects be added?
- bool add_metadata;
-
- /// Should the visible flag be added to all OSM objects?
- bool add_visible_flag;
-
- /**
- * Should <create>, <modify>, <delete> "operations" be added?
- * (This is used for .osc files.)
- */
- bool use_change_ops;
-
- };
-
- class XMLOutputBlock : public OutputBlock {
-
- // operation (create, modify, delete) for osc files
- enum class operation {
- op_none = 0,
- op_create = 1,
- op_modify = 2,
- op_delete = 3
- }; // enum class operation
-
- operation m_last_op {operation::op_none};
-
- xml_output_options m_options;
-
- void write_spaces(int num) {
- for (; num != 0; --num) {
- *m_out += ' ';
- }
- }
-
- int prefix_spaces() {
- return m_options.use_change_ops ? 4 : 2;
- }
-
- void write_prefix() {
- write_spaces(prefix_spaces());
- }
-
- void write_meta(const osmium::OSMObject& object) {
- output_formatted(" id=\"%" PRId64 "\"", object.id());
-
- if (m_options.add_metadata) {
- if (object.version()) {
- output_formatted(" version=\"%d\"", object.version());
- }
-
- if (object.timestamp()) {
- *m_out += " timestamp=\"";
- *m_out += object.timestamp().to_iso();
- *m_out += "\"";
- }
-
- if (!object.user_is_anonymous()) {
- output_formatted(" uid=\"%d\" user=\"", object.uid());
- append_xml_encoded_string(*m_out, object.user());
- *m_out += "\"";
- }
-
- if (object.changeset()) {
- output_formatted(" changeset=\"%d\"", object.changeset());
- }
-
- if (m_options.add_visible_flag) {
- if (object.visible()) {
- *m_out += " visible=\"true\"";
- } else {
- *m_out += " visible=\"false\"";
- }
- }
- }
- }
-
- void write_tags(const osmium::TagList& tags, int spaces) {
- for (const auto& tag : tags) {
- write_spaces(spaces);
- *m_out += " <tag k=\"";
- append_xml_encoded_string(*m_out, tag.key());
- *m_out += "\" v=\"";
- append_xml_encoded_string(*m_out, tag.value());
- *m_out += "\"/>\n";
- }
- }
-
- void write_discussion(const osmium::ChangesetDiscussion& comments) {
- for (const auto& comment : comments) {
- output_formatted(" <comment uid=\"%d\" user=\"", comment.uid());
- append_xml_encoded_string(*m_out, comment.user());
- *m_out += "\" date=\"";
- *m_out += comment.date().to_iso();
- *m_out += "\">\n";
- *m_out += " <text>";
- append_xml_encoded_string(*m_out, comment.text());
- *m_out += "</text>\n </comment>\n";
- }
- *m_out += " </discussion>\n";
- }
-
- void open_close_op_tag(const operation op = operation::op_none) {
- if (op == m_last_op) {
- return;
- }
-
- switch (m_last_op) {
- case operation::op_none:
- break;
- case operation::op_create:
- *m_out += " </create>\n";
- break;
- case operation::op_modify:
- *m_out += " </modify>\n";
- break;
- case operation::op_delete:
- *m_out += " </delete>\n";
- break;
- }
-
- switch (op) {
- case operation::op_none:
- break;
- case operation::op_create:
- *m_out += " <create>\n";
- break;
- case operation::op_modify:
- *m_out += " <modify>\n";
- break;
- case operation::op_delete:
- *m_out += " <delete>\n";
- break;
- }
-
- m_last_op = op;
- }
-
- public:
-
- XMLOutputBlock(osmium::memory::Buffer&& buffer, const xml_output_options& options) :
- OutputBlock(std::move(buffer)),
- m_options(options) {
- }
-
- XMLOutputBlock(const XMLOutputBlock&) = default;
- XMLOutputBlock& operator=(const XMLOutputBlock&) = default;
-
- XMLOutputBlock(XMLOutputBlock&&) = default;
- XMLOutputBlock& operator=(XMLOutputBlock&&) = default;
-
- ~XMLOutputBlock() noexcept = default;
-
- std::string operator()() {
- osmium::apply(m_input_buffer->cbegin(), m_input_buffer->cend(), *this);
-
- if (m_options.use_change_ops) {
- open_close_op_tag();
- }
-
- std::string out;
- using std::swap;
- swap(out, *m_out);
-
- return out;
- }
-
- void node(const osmium::Node& node) {
- if (m_options.use_change_ops) {
- open_close_op_tag(node.visible() ? (node.version() == 1 ? operation::op_create : operation::op_modify) : operation::op_delete);
- }
-
- write_prefix();
- *m_out += "<node";
-
- write_meta(node);
-
- if (node.location()) {
- *m_out += " lat=\"";
- osmium::util::double2string(std::back_inserter(*m_out), node.location().lat_without_check(), 7);
- *m_out += "\" lon=\"";
- osmium::util::double2string(std::back_inserter(*m_out), node.location().lon_without_check(), 7);
- *m_out += "\"";
- }
-
- if (node.tags().empty()) {
- *m_out += "/>\n";
- return;
- }
-
- *m_out += ">\n";
-
- write_tags(node.tags(), prefix_spaces());
-
- write_prefix();
- *m_out += "</node>\n";
- }
-
- void way(const osmium::Way& way) {
- if (m_options.use_change_ops) {
- open_close_op_tag(way.visible() ? (way.version() == 1 ? operation::op_create : operation::op_modify) : operation::op_delete);
- }
-
- write_prefix();
- *m_out += "<way";
- write_meta(way);
-
- if (way.tags().empty() && way.nodes().empty()) {
- *m_out += "/>\n";
- return;
- }
-
- *m_out += ">\n";
-
- for (const auto& node_ref : way.nodes()) {
- write_prefix();
- output_formatted(" <nd ref=\"%" PRId64 "\"/>\n", node_ref.ref());
- }
-
- write_tags(way.tags(), prefix_spaces());
-
- write_prefix();
- *m_out += "</way>\n";
- }
-
- void relation(const osmium::Relation& relation) {
- if (m_options.use_change_ops) {
- open_close_op_tag(relation.visible() ? (relation.version() == 1 ? operation::op_create : operation::op_modify) : operation::op_delete);
- }
-
- write_prefix();
- *m_out += "<relation";
- write_meta(relation);
-
- if (relation.tags().empty() && relation.members().empty()) {
- *m_out += "/>\n";
- return;
- }
-
- *m_out += ">\n";
-
- for (const auto& member : relation.members()) {
- write_prefix();
- *m_out += " <member type=\"";
- *m_out += item_type_to_name(member.type());
- output_formatted("\" ref=\"%" PRId64 "\" role=\"", member.ref());
- append_xml_encoded_string(*m_out, member.role());
- *m_out += "\"/>\n";
- }
-
- write_tags(relation.tags(), prefix_spaces());
-
- write_prefix();
- *m_out += "</relation>\n";
- }
-
- void changeset(const osmium::Changeset& changeset) {
- *m_out += " <changeset";
-
- output_formatted(" id=\"%" PRId32 "\"", changeset.id());
-
- if (changeset.created_at()) {
- *m_out += " created_at=\"";
- *m_out += changeset.created_at().to_iso();
- *m_out += "\"";
- }
-
- if (changeset.closed_at()) {
- *m_out += " closed_at=\"";
- *m_out += changeset.closed_at().to_iso();
- *m_out += "\" open=\"false\"";
- } else {
- *m_out += " open=\"true\"";
- }
-
- if (!changeset.user_is_anonymous()) {
- *m_out += " user=\"";
- append_xml_encoded_string(*m_out, changeset.user());
- output_formatted("\" uid=\"%d\"", changeset.uid());
- }
-
- if (changeset.bounds()) {
- output_formatted(" min_lat=\"%.7f\"", changeset.bounds().bottom_left().lat_without_check());
- output_formatted(" min_lon=\"%.7f\"", changeset.bounds().bottom_left().lon_without_check());
- output_formatted(" max_lat=\"%.7f\"", changeset.bounds().top_right().lat_without_check());
- output_formatted(" max_lon=\"%.7f\"", changeset.bounds().top_right().lon_without_check());
- }
-
- output_formatted(" num_changes=\"%" PRId32 "\"", changeset.num_changes());
- output_formatted(" comments_count=\"%" PRId32 "\"", changeset.num_comments());
-
- // If there are no tags and no comments, we can close the
- // tag right here and are done.
- if (changeset.tags().empty() && changeset.num_comments() == 0) {
- *m_out += "/>\n";
- return;
- }
-
- *m_out += ">\n";
-
- write_tags(changeset.tags(), 0);
-
- if (changeset.num_comments() > 0) {
- *m_out += " <discussion>\n";
- write_discussion(changeset.discussion());
- }
-
- *m_out += " </changeset>\n";
- }
-
- }; // class XMLOutputBlock
-
- class XMLOutputFormat : public osmium::io::detail::OutputFormat, public osmium::handler::Handler {
-
- xml_output_options m_options;
-
- public:
-
- XMLOutputFormat(const osmium::io::File& file, future_string_queue_type& output_queue) :
- OutputFormat(output_queue),
- m_options() {
- m_options.add_metadata = file.is_not_false("add_metadata");
- m_options.use_change_ops = file.is_true("xml_change_format");
- m_options.add_visible_flag = (file.has_multiple_object_versions() || file.is_true("force_visible_flag")) && !m_options.use_change_ops;
- }
-
- XMLOutputFormat(const XMLOutputFormat&) = delete;
- XMLOutputFormat& operator=(const XMLOutputFormat&) = delete;
-
- ~XMLOutputFormat() noexcept = default;
-
- void write_header(const osmium::io::Header& header) override final {
- std::string out = "<?xml version='1.0' encoding='UTF-8'?>\n";
-
- if (m_options.use_change_ops) {
- out += "<osmChange version=\"0.6\" generator=\"";
- } else {
- out += "<osm version=\"0.6\"";
-
- std::string xml_josm_upload = header.get("xml_josm_upload");
- if (xml_josm_upload == "true" || xml_josm_upload == "false") {
- out += " upload=\"";
- out += xml_josm_upload;
- out += "\"";
- }
- out += " generator=\"";
- }
- append_xml_encoded_string(out, header.get("generator").c_str());
- out += "\">\n";
-
- for (const auto& box : header.boxes()) {
- out += " <bounds";
- append_printf_formatted_string(out, " minlon=\"%.7f\"", box.bottom_left().lon());
- append_printf_formatted_string(out, " minlat=\"%.7f\"", box.bottom_left().lat());
- append_printf_formatted_string(out, " maxlon=\"%.7f\"", box.top_right().lon());
- append_printf_formatted_string(out, " maxlat=\"%.7f\"/>\n", box.top_right().lat());
- }
-
- send_to_output_queue(std::move(out));
- }
-
- void write_buffer(osmium::memory::Buffer&& buffer) override final {
- m_output_queue.push(osmium::thread::Pool::instance().submit(XMLOutputBlock{std::move(buffer), m_options}));
- }
-
- void write_end() override final {
- std::string out;
-
- if (m_options.use_change_ops) {
- out += "</osmChange>\n";
- } else {
- out += "</osm>\n";
- }
-
- send_to_output_queue(std::move(out));
- }
-
- }; // class XMLOutputFormat
-
- // we want the register_output_format() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_xml_output = osmium::io::detail::OutputFormatFactory::instance().register_output_format(osmium::io::file_format::xml,
- [](const osmium::io::File& file, future_string_queue_type& output_queue) {
- return new osmium::io::detail::XMLOutputFormat(file, output_queue);
- });
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_xml_output() noexcept {
- return registered_xml_output;
- }
-
- } // namespace detail
-
- } // namespace output
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_XML_OUTPUT_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/detail/zlib.hpp b/contrib/libosmium/osmium/io/detail/zlib.hpp
deleted file mode 100644
index 4d86168..0000000
--- a/contrib/libosmium/osmium/io/detail/zlib.hpp
+++ /dev/null
@@ -1,115 +0,0 @@
-#ifndef OSMIUM_IO_DETAIL_ZLIB_HPP
-#define OSMIUM_IO_DETAIL_ZLIB_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <memory>
-#include <stdexcept>
-#include <string>
-
-#include <zlib.h>
-
-#include <osmium/io/error.hpp>
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
- namespace io {
-
- namespace detail {
-
- /**
- * Compress data using zlib.
- *
- * Note that this function can not compress data larger than
- * what fits in an unsigned long, on Windows this is usually 32bit.
- *
- * @param input Data to compress.
- * @returns Compressed data.
- */
- inline std::string zlib_compress(const std::string& input) {
- unsigned long output_size = ::compressBound(osmium::static_cast_with_assert<unsigned long>(input.size()));
-
- std::string output(output_size, '\0');
-
- auto result = ::compress(
- reinterpret_cast<unsigned char*>(const_cast<char *>(output.data())),
- &output_size,
- reinterpret_cast<const unsigned char*>(input.data()),
- osmium::static_cast_with_assert<unsigned long>(input.size())
- );
-
- if (result != Z_OK) {
- throw io_error(std::string("failed to compress data: ") + zError(result));
- }
-
- output.resize(output_size);
-
- return output;
- }
-
- /**
- * Uncompress data using zlib.
- *
- * Note that this function can not uncompress data larger than
- * what fits in an unsigned long, on Windows this is usually 32bit.
- *
- * @param input Compressed input data.
- * @param raw_size Size of uncompressed data.
- * @param output Uncompressed result data.
- * @returns Pointer and size to incompressed data.
- */
- inline std::pair<const char*, size_t> zlib_uncompress_string(const char* input, unsigned long input_size, unsigned long raw_size, std::string& output) {
- output.resize(raw_size);
-
- auto result = ::uncompress(
- reinterpret_cast<unsigned char*>(&*output.begin()),
- &raw_size,
- reinterpret_cast<const unsigned char*>(input),
- input_size
- );
-
- if (result != Z_OK) {
- throw io_error(std::string("failed to uncompress data: ") + zError(result));
- }
-
- return std::make_pair(output.data(), output.size());
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_DETAIL_ZLIB_HPP
diff --git a/contrib/libosmium/osmium/io/error.hpp b/contrib/libosmium/osmium/io/error.hpp
deleted file mode 100644
index 0b5393f..0000000
--- a/contrib/libosmium/osmium/io/error.hpp
+++ /dev/null
@@ -1,70 +0,0 @@
-#ifndef OSMIUM_IO_ERROR_HPP
-#define OSMIUM_IO_ERROR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <stdexcept>
-#include <string>
-
-namespace osmium {
-
- /**
- * Exception thrown when some kind of input/output operation failed.
- */
- struct io_error : public std::runtime_error {
-
- io_error(const std::string& what) :
- std::runtime_error(what) {
- }
-
- io_error(const char* what) :
- std::runtime_error(what) {
- }
-
- }; // struct io_error
-
- struct unsupported_file_format_error : public io_error {
-
- unsupported_file_format_error(const std::string& what) :
- io_error(what) {
- }
-
- unsupported_file_format_error(const char* what) :
- io_error(what) {
- }
-
- }; // struct unsupported_file_format_error
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_ERROR_HPP
diff --git a/contrib/libosmium/osmium/io/file.hpp b/contrib/libosmium/osmium/io/file.hpp
deleted file mode 100644
index 87fcc37..0000000
--- a/contrib/libosmium/osmium/io/file.hpp
+++ /dev/null
@@ -1,328 +0,0 @@
-#ifndef OSMIUM_IO_FILE_HPP
-#define OSMIUM_IO_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <stdexcept>
-#include <sstream>
-#include <string>
-#include <vector>
-
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_format.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/util/options.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- /**
- * @brief Everything related to input and output of OSM data.
- */
- namespace io {
-
- namespace detail {
-
- inline std::vector<std::string> split(const std::string& in, const char delim) {
- std::vector<std::string> result;
- std::stringstream ss(in);
- std::string item;
- while (std::getline(ss, item, delim)) {
- result.push_back(item);
- }
- return result;
- }
-
- } // namespace detail
-
- /**
- * This class describes an OSM file in one of several different formats.
- *
- * If the filename is empty or "-", this means stdin or stdout is used.
- */
- class File : public osmium::util::Options {
-
- private:
-
- std::string m_filename;
-
- const char* m_buffer;
- size_t m_buffer_size;
-
- std::string m_format_string;
-
- file_format m_file_format {file_format::unknown};
-
- file_compression m_file_compression {file_compression::none};
-
- bool m_has_multiple_object_versions {false};
-
- public:
-
- /**
- * Create File using type and encoding from filename or given
- * format specification.
- *
- * @param filename Filename including suffix. The type and encoding
- * of the file will be taken from the suffix.
- * An empty filename or "-" means stdin or stdout.
- * @param format File format as string. See the description of the
- * parse_format() function for details. If this is
- * empty the format will be deduced from the suffix
- * of the filename.
- */
- explicit File(const std::string& filename = "", const std::string& format = "") :
- Options(),
- m_filename(filename),
- m_buffer(nullptr),
- m_buffer_size(0),
- m_format_string(format) {
-
- // stdin/stdout
- if (m_filename == "-") {
- m_filename = "";
- }
-
- // if filename is a URL, default to XML format
- std::string protocol = m_filename.substr(0, m_filename.find_first_of(':'));
- if (protocol == "http" || protocol == "https") {
- m_file_format = file_format::xml;
- }
-
- if (format.empty()) {
- detect_format_from_suffix(m_filename);
- } else {
- parse_format(format);
- }
- }
-
- /**
- * Create File using buffer pointer and size and type and encoding
- * from given format specification.
- *
- * @param buffer Pointer to buffer with data.
- * @param size Size of buffer.
- * @param format File format as string. See the description of the
- * parse_format() function for details.
- */
- explicit File(const char* buffer, size_t size, const std::string& format = "") :
- Options(),
- m_filename(),
- m_buffer(buffer),
- m_buffer_size(size),
- m_format_string(format) {
- if (format != "") {
- parse_format(format);
- }
- }
-
- File(const File&) = default;
- File& operator=(const File&) = default;
-
- File(File&&) = default;
- File& operator=(File&&) = default;
-
- ~File() = default;
-
- const char* buffer() const noexcept {
- return m_buffer;
- }
-
- size_t buffer_size() const noexcept {
- return m_buffer_size;
- }
-
- void parse_format(const std::string& format) {
- std::vector<std::string> options = detail::split(format, ',');
-
- // if the first item in the format list doesn't contain
- // an equals sign, it is a format
- if (!options.empty() && options[0].find_first_of('=') == std::string::npos) {
- detect_format_from_suffix(options[0]);
- options.erase(options.begin());
- }
-
- for (auto& option : options) {
- size_t pos = option.find_first_of('=');
- if (pos == std::string::npos) {
- set(option, true);
- } else {
- std::string value = option.substr(pos+1);
- option.erase(pos);
- set(option, value);
- }
- }
-
- if (get("history") == "true") {
- m_has_multiple_object_versions = true;
- } else if (get("history") == "false") {
- m_has_multiple_object_versions = false;
- }
- }
-
- void detect_format_from_suffix(const std::string& name) {
- std::vector<std::string> suffixes = detail::split(name, '.');
-
- if (suffixes.empty()) return;
-
- // if the last suffix is one of a known set of compressions,
- // set that compression
- if (suffixes.back() == "gz") {
- m_file_compression = file_compression::gzip;
- suffixes.pop_back();
- } else if (suffixes.back() == "bz2") {
- m_file_compression = file_compression::bzip2;
- suffixes.pop_back();
- }
-
- if (suffixes.empty()) return;
-
- // if the last suffix is one of a known set of formats,
- // set that format
- if (suffixes.back() == "pbf") {
- m_file_format = file_format::pbf;
- suffixes.pop_back();
- } else if (suffixes.back() == "xml") {
- m_file_format = file_format::xml;
- suffixes.pop_back();
- } else if (suffixes.back() == "opl") {
- m_file_format = file_format::opl;
- suffixes.pop_back();
- } else if (suffixes.back() == "json") {
- m_file_format = file_format::json;
- suffixes.pop_back();
- } else if (suffixes.back() == "o5m") {
- m_file_format = file_format::o5m;
- suffixes.pop_back();
- } else if (suffixes.back() == "o5c") {
- m_file_format = file_format::o5m;
- m_has_multiple_object_versions = true;
- set("o5c_change_format", true);
- suffixes.pop_back();
- } else if (suffixes.back() == "debug") {
- m_file_format = file_format::debug;
- suffixes.pop_back();
- }
-
- if (suffixes.empty()) return;
-
- if (suffixes.back() == "osm") {
- if (m_file_format == file_format::unknown) m_file_format = file_format::xml;
- suffixes.pop_back();
- } else if (suffixes.back() == "osh") {
- if (m_file_format == file_format::unknown) m_file_format = file_format::xml;
- m_has_multiple_object_versions = true;
- suffixes.pop_back();
- } else if (suffixes.back() == "osc") {
- if (m_file_format == file_format::unknown) m_file_format = file_format::xml;
- m_has_multiple_object_versions = true;
- set("xml_change_format", true);
- suffixes.pop_back();
- }
- }
-
- /**
- * Check file format etc. for consistency and throw exception if
- * there is a problem.
- *
- * @throws osmium::io_error
- */
- const File& check() const {
- if (m_file_format == file_format::unknown) {
- std::string msg = "Could not detect file format";
- if (!m_format_string.empty()) {
- msg += " from format string '";
- msg += m_format_string;
- msg += "'";
- }
- if (m_filename.empty()) {
- msg += " for stdin/stdout";
- } else {
- msg += " for filename '";
- msg += m_filename;
- msg += "'";
- }
- msg += ".";
- throw io_error(msg);
- }
- return *this;
- }
-
- file_format format() const noexcept {
- return m_file_format;
- }
-
- File& set_format(file_format format) noexcept {
- m_file_format = format;
- return *this;
- }
-
- file_compression compression() const noexcept {
- return m_file_compression;
- }
-
- File& set_compression(file_compression compression) noexcept {
- m_file_compression = compression;
- return *this;
- }
-
- bool has_multiple_object_versions() const noexcept {
- return m_has_multiple_object_versions;
- }
-
- File& set_has_multiple_object_versions(bool value) noexcept {
- m_has_multiple_object_versions = value;
- return *this;
- }
-
- File& filename(const std::string& filename) {
- if (filename == "-") {
- m_filename = "";
- } else {
- m_filename = filename;
- }
- return *this;
- }
-
- const std::string& filename() const noexcept {
- return m_filename;
- }
-
- }; // class File
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_FILE_HPP
diff --git a/contrib/libosmium/osmium/io/file_compression.hpp b/contrib/libosmium/osmium/io/file_compression.hpp
deleted file mode 100644
index 292ddcf..0000000
--- a/contrib/libosmium/osmium/io/file_compression.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef OSMIUM_IO_FILE_COMPRESSION_HPP
-#define OSMIUM_IO_FILE_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iosfwd>
-
-namespace osmium {
-
- namespace io {
-
- enum class file_compression {
- none = 0,
- gzip = 1,
- bzip2 = 2
- };
-
-// avoid g++ false positive
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wreturn-type"
- inline const char* as_string(file_compression compression) {
- switch (compression) {
- case file_compression::none:
- return "none";
- case file_compression::gzip:
- return "gzip";
- case file_compression::bzip2:
- return "bzip2";
- }
- }
-#pragma GCC diagnostic pop
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const file_compression compression) {
- return out << as_string(compression);
- }
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_FILE_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/file_format.hpp b/contrib/libosmium/osmium/io/file_format.hpp
deleted file mode 100644
index edfb1ff..0000000
--- a/contrib/libosmium/osmium/io/file_format.hpp
+++ /dev/null
@@ -1,84 +0,0 @@
-#ifndef OSMIUM_IO_FILE_FORMAT_HPP
-#define OSMIUM_IO_FILE_FORMAT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iosfwd>
-
-namespace osmium {
-
- namespace io {
-
- enum class file_format {
- unknown = 0,
- xml = 1,
- pbf = 2,
- opl = 3,
- json = 4,
- o5m = 5,
- debug = 6
- };
-
-// avoid g++ false positive
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wreturn-type"
- inline const char* as_string(file_format format) {
- switch (format) {
- case file_format::unknown:
- return "unknown";
- case file_format::xml:
- return "XML";
- case file_format::pbf:
- return "PBF";
- case file_format::opl:
- return "OPL";
- case file_format::json:
- return "JSON";
- case file_format::o5m:
- return "O5M";
- case file_format::debug:
- return "DEBUG";
- }
- }
-#pragma GCC diagnostic pop
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const file_format format) {
- return out << as_string(format);
- }
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_FILE_FORMAT_HPP
diff --git a/contrib/libosmium/osmium/io/gzip_compression.hpp b/contrib/libosmium/osmium/io/gzip_compression.hpp
deleted file mode 100644
index 705f416..0000000
--- a/contrib/libosmium/osmium/io/gzip_compression.hpp
+++ /dev/null
@@ -1,277 +0,0 @@
-#ifndef OSMIUM_IO_GZIP_COMPRESSION_HPP
-#define OSMIUM_IO_GZIP_COMPRESSION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read or write gzip-compressed OSM XML
- * files.
- *
- * @attention If you include this file, you'll need to link with `libz`.
- */
-
-#include <stdexcept>
-#include <string>
-
-#include <errno.h>
-#include <zlib.h>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file_compression.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/util/cast.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown when there are problems compressing or
- * decompressing gzip files.
- */
- struct gzip_error : public io_error {
-
- int gzip_error_code;
- int system_errno;
-
- gzip_error(const std::string& what, int error_code) :
- io_error(what),
- gzip_error_code(error_code),
- system_errno(error_code == Z_ERRNO ? errno : 0) {
- }
-
- }; // struct gzip_error
-
- namespace io {
-
- namespace detail {
-
- OSMIUM_NORETURN inline void throw_gzip_error(gzFile gzfile, const char* msg, int zlib_error = 0) {
- std::string error("gzip error: ");
- error += msg;
- error += ": ";
- int errnum = zlib_error;
- if (zlib_error) {
- error += std::to_string(zlib_error);
- } else {
- error += ::gzerror(gzfile, &errnum);
- }
- throw osmium::gzip_error(error, errnum);
- }
-
- } // namespace detail
-
- class GzipCompressor : public Compressor {
-
- int m_fd;
- gzFile m_gzfile;
-
- public:
-
- explicit GzipCompressor(int fd, fsync sync) :
- Compressor(sync),
- m_fd(dup(fd)),
- m_gzfile(::gzdopen(fd, "w")) {
- if (!m_gzfile) {
- detail::throw_gzip_error(m_gzfile, "write initialization failed");
- }
- }
-
- ~GzipCompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- void write(const std::string& data) override final {
- if (!data.empty()) {
- int nwrite = ::gzwrite(m_gzfile, data.data(), static_cast_with_assert<unsigned int>(data.size()));
- if (nwrite == 0) {
- detail::throw_gzip_error(m_gzfile, "write failed");
- }
- }
- }
-
- void close() override final {
- if (m_gzfile) {
- int result = ::gzclose(m_gzfile);
- m_gzfile = nullptr;
- if (result != Z_OK) {
- detail::throw_gzip_error(m_gzfile, "write close failed", result);
- }
- if (do_fsync()) {
- osmium::io::detail::reliable_fsync(m_fd);
- }
- osmium::io::detail::reliable_close(m_fd);
- }
- }
-
- }; // class GzipCompressor
-
- class GzipDecompressor : public Decompressor {
-
- gzFile m_gzfile;
-
- public:
-
- explicit GzipDecompressor(int fd) :
- Decompressor(),
- m_gzfile(::gzdopen(fd, "r")) {
- if (!m_gzfile) {
- detail::throw_gzip_error(m_gzfile, "read initialization failed");
- }
- }
-
- ~GzipDecompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- std::string read() override final {
- std::string buffer(osmium::io::Decompressor::input_buffer_size, '\0');
- int nread = ::gzread(m_gzfile, const_cast<char*>(buffer.data()), static_cast_with_assert<unsigned int>(buffer.size()));
- if (nread < 0) {
- detail::throw_gzip_error(m_gzfile, "read failed");
- }
- buffer.resize(static_cast<std::string::size_type>(nread));
- return buffer;
- }
-
- void close() override final {
- if (m_gzfile) {
- int result = ::gzclose(m_gzfile);
- m_gzfile = nullptr;
- if (result != Z_OK) {
- detail::throw_gzip_error(m_gzfile, "read close failed", result);
- }
- }
- }
-
- }; // class GzipDecompressor
-
- class GzipBufferDecompressor : public Decompressor {
-
- const char* m_buffer;
- size_t m_buffer_size;
- z_stream m_zstream;
-
- public:
-
- GzipBufferDecompressor(const char* buffer, size_t size) :
- m_buffer(buffer),
- m_buffer_size(size),
- m_zstream() {
- m_zstream.next_in = reinterpret_cast<unsigned char*>(const_cast<char*>(buffer));
- m_zstream.avail_in = static_cast_with_assert<unsigned int>(size);
- int result = inflateInit2(&m_zstream, MAX_WBITS | 32);
- if (result != Z_OK) {
- std::string message("gzip error: decompression init failed: ");
- if (m_zstream.msg) {
- message.append(m_zstream.msg);
- }
- throw osmium::gzip_error(message, result);
- }
- }
-
- ~GzipBufferDecompressor() noexcept override final {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- std::string read() override final {
- std::string output;
-
- if (m_buffer) {
- const size_t buffer_size = 10240;
- output.append(buffer_size, '\0');
- m_zstream.next_out = reinterpret_cast<unsigned char*>(const_cast<char*>(output.data()));
- m_zstream.avail_out = buffer_size;
- int result = inflate(&m_zstream, Z_SYNC_FLUSH);
-
- if (result != Z_OK) {
- m_buffer = nullptr;
- m_buffer_size = 0;
- }
-
- if (result != Z_OK && result != Z_STREAM_END) {
- std::string message("gzip error: inflate failed: ");
- if (m_zstream.msg) {
- message.append(m_zstream.msg);
- }
- throw osmium::gzip_error(message, result);
- }
-
- output.resize(static_cast<unsigned long>(m_zstream.next_out - reinterpret_cast<const unsigned char*>(output.data())));
- }
-
- return output;
- }
-
- void close() override final {
- inflateEnd(&m_zstream);
- }
-
- }; // class GzipBufferDecompressor
-
- namespace detail {
-
- // we want the register_compression() function to run, setting
- // the variable is only a side-effect, it will never be used
- const bool registered_gzip_compression = osmium::io::CompressionFactory::instance().register_compression(osmium::io::file_compression::gzip,
- [](int fd, fsync sync) { return new osmium::io::GzipCompressor(fd, sync); },
- [](int fd) { return new osmium::io::GzipDecompressor(fd); },
- [](const char* buffer, size_t size) { return new osmium::io::GzipBufferDecompressor(buffer, size); }
- );
-
- // dummy function to silence the unused variable warning from above
- inline bool get_registered_gzip_compression() noexcept {
- return registered_gzip_compression;
- }
-
- } // namespace detail
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_GZIP_COMPRESSION_HPP
diff --git a/contrib/libosmium/osmium/io/header.hpp b/contrib/libosmium/osmium/io/header.hpp
deleted file mode 100644
index 4b0830a..0000000
--- a/contrib/libosmium/osmium/io/header.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#ifndef OSMIUM_IO_HEADER_HPP
-#define OSMIUM_IO_HEADER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <initializer_list>
-#include <vector>
-
-#include <osmium/osm/box.hpp>
-#include <osmium/util/options.hpp>
-
-namespace osmium {
-
- namespace io {
-
- /**
- * Meta information from the header of an OSM file.
- */
- class Header : public osmium::util::Options {
-
- /// Bounding boxes
- std::vector<osmium::Box> m_boxes;
-
- /**
- * Are there possibly multiple versions of the same object in this stream of objects?
- * This is true for history files and for change files, but not for normal OSM files.
- */
- bool m_has_multiple_object_versions = false;
-
- public:
-
- Header() = default;
-
- explicit Header(const std::initializer_list<osmium::util::Options::value_type>& values) :
- Options(values) {
- }
-
- Header(const Header&) = default;
- Header& operator=(const Header&) = default;
-
- Header(Header&&) = default;
- Header& operator=(Header&&) = default;
-
- ~Header() = default;
-
- std::vector<osmium::Box>& boxes() noexcept {
- return m_boxes;
- }
-
- const std::vector<osmium::Box>& boxes() const noexcept {
- return m_boxes;
- }
-
- Header& boxes(const std::vector<osmium::Box>& boxes) noexcept {
- m_boxes = boxes;
- return *this;
- }
-
- osmium::Box box() const {
- return m_boxes.empty() ? osmium::Box() : m_boxes.front();
- }
-
- osmium::Box joined_boxes() const {
- osmium::Box box;
- for (const auto& b : m_boxes) {
- box.extend(b.bottom_left());
- box.extend(b.top_right());
- }
- return box;
- }
-
- Header& add_box(const osmium::Box& box) {
- m_boxes.push_back(box);
- return *this;
- }
-
- bool has_multiple_object_versions() const noexcept {
- return m_has_multiple_object_versions;
- }
-
- Header& set_has_multiple_object_versions(bool value) noexcept {
- m_has_multiple_object_versions = value;
- return *this;
- }
-
- }; // class Header
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_HEADER_HPP
diff --git a/contrib/libosmium/osmium/io/input_iterator.hpp b/contrib/libosmium/osmium/io/input_iterator.hpp
deleted file mode 100644
index 8647763..0000000
--- a/contrib/libosmium/osmium/io/input_iterator.hpp
+++ /dev/null
@@ -1,178 +0,0 @@
-#ifndef OSMIUM_IO_INPUT_ITERATOR_HPP
-#define OSMIUM_IO_INPUT_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <iterator>
-#include <memory>
-#include <type_traits>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- namespace io {
-
- /**
- * This iterator class allows you to iterate over all items from a
- * source. It hides all the buffer handling and makes the contents of a
- * source accessible as a normal STL input iterator.
- */
- template <typename TSource, typename TItem = osmium::memory::Item>
- class InputIterator {
-
- static_assert(std::is_base_of<osmium::memory::Item, TItem>::value, "TItem must derive from osmium::buffer::Item");
-
- typedef typename osmium::memory::Buffer::t_iterator<TItem> item_iterator;
-
- TSource* m_source;
- std::shared_ptr<osmium::memory::Buffer> m_buffer;
- item_iterator m_iter {};
-
- void update_buffer() {
- do {
- m_buffer = std::make_shared<osmium::memory::Buffer>(std::move(m_source->read()));
- if (!m_buffer || !*m_buffer) { // end of input
- m_source = nullptr;
- m_buffer.reset();
- m_iter = item_iterator();
- return;
- }
- m_iter = m_buffer->begin<TItem>();
- } while (m_iter == m_buffer->end<TItem>());
- }
-
- public:
-
- typedef std::input_iterator_tag iterator_category;
- typedef TItem value_type;
- typedef ptrdiff_t difference_type;
- typedef TItem* pointer;
- typedef TItem& reference;
-
- explicit InputIterator(TSource& source) :
- m_source(&source) {
- update_buffer();
- }
-
- // end iterator
- InputIterator() noexcept :
- m_source(nullptr) {
- }
-
- InputIterator& operator++() {
- assert(m_source);
- assert(m_buffer);
- assert(m_iter);
- ++m_iter;
- if (m_iter == m_buffer->end<TItem>()) {
- update_buffer();
- }
- return *this;
- }
-
- InputIterator operator++(int) {
- InputIterator tmp(*this);
- operator++();
- return tmp;
- }
-
- bool operator==(const InputIterator& rhs) const noexcept {
- return m_source == rhs.m_source &&
- m_buffer == rhs.m_buffer &&
- m_iter == rhs.m_iter;
- }
-
- bool operator!=(const InputIterator& rhs) const noexcept {
- return !(*this == rhs);
- }
-
- reference operator*() const {
- assert(m_iter);
- return static_cast<reference>(*m_iter);
- }
-
- pointer operator->() const {
- assert(m_iter);
- return &static_cast<reference>(*m_iter);
- }
-
- }; // class InputIterator
-
- template <typename TSource, typename TItem = osmium::memory::Item>
- class InputIteratorRange {
-
- InputIterator<TSource, TItem> m_begin;
- InputIterator<TSource, TItem> m_end;
-
- public:
-
- InputIteratorRange(InputIterator<TSource, TItem>&& begin,
- InputIterator<TSource, TItem>&& end) :
- m_begin(std::move(begin)),
- m_end(std::move(end)) {
- }
-
- InputIterator<TSource, TItem> begin() const noexcept {
- return m_begin;
- }
-
- InputIterator<TSource, TItem> end() const noexcept {
- return m_end;
- }
-
- const InputIterator<TSource, TItem> cbegin() const noexcept {
- return m_begin;
- }
-
- const InputIterator<TSource, TItem> cend() const noexcept {
- return m_end;
- }
-
- }; // class InputIteratorRange
-
- template <typename TItem, typename TSource>
- InputIteratorRange<TSource, TItem> make_input_iterator_range(TSource& source) {
- using it_type = InputIterator<TSource, TItem>;
- return InputIteratorRange<TSource, TItem>(it_type{source}, it_type{});
- }
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_INPUT_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/io/o5m_input.hpp b/contrib/libosmium/osmium/io/o5m_input.hpp
deleted file mode 100644
index b63f728..0000000
--- a/contrib/libosmium/osmium/io/o5m_input.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef OSMIUM_IO_O5M_INPUT_HPP
-#define OSMIUM_IO_O5M_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read OSM o5m and o5c files.
- */
-
-#include <osmium/io/reader.hpp> // IWYU pragma: export
-#include <osmium/io/detail/o5m_input_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_O5M_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/opl_output.hpp b/contrib/libosmium/osmium/io/opl_output.hpp
deleted file mode 100644
index 04385d9..0000000
--- a/contrib/libosmium/osmium/io/opl_output.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OSMIUM_IO_OPL_OUTPUT_HPP
-#define OSMIUM_IO_OPL_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/opl_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_OPL_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/output_iterator.hpp b/contrib/libosmium/osmium/io/output_iterator.hpp
deleted file mode 100644
index 3d60fe6..0000000
--- a/contrib/libosmium/osmium/io/output_iterator.hpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#ifndef OSMIUM_IO_OUTPUT_ITERATOR_HPP
-#define OSMIUM_IO_OUTPUT_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <iterator>
-#include <memory>
-#include <utility>
-
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/diff_object.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- namespace memory {
- class Item;
- } // namespace memory
-
- namespace io {
-
- template <typename TDest>
- class OutputIterator : public std::iterator<std::output_iterator_tag, osmium::memory::Item> {
-
- TDest* m_destination;
-
- public:
-
- explicit OutputIterator(TDest& destination) :
- m_destination(&destination) {
- }
-
- /**
- * Warning! Use of buffer size argument on OutputIterator
- * constructor is deprecated. Call Writer::set_buffer_size()
- * instead if you want to change the default.
- */
- OSMIUM_DEPRECATED OutputIterator(TDest& destination, const size_t buffer_size) :
- m_destination(&destination) {
- destination.set_buffer_size(buffer_size);
- }
-
- OutputIterator(const OutputIterator&) = default;
- OutputIterator(OutputIterator&&) = default;
-
- OutputIterator& operator=(const OutputIterator&) = default;
- OutputIterator& operator=(OutputIterator&&) = default;
-
- ~OutputIterator() = default;
-
- /**
- * Warning! Calling OutputIterator<Writer>::flush() is usually not
- * needed any more. Call flush() on the Writer instead if needed.
- */
- OSMIUM_DEPRECATED void flush() {
- m_destination->flush();
- }
-
- OutputIterator& operator=(const osmium::memory::Item& item) {
- (*m_destination)(item);
- return *this;
- }
-
- OutputIterator& operator=(const osmium::DiffObject& diff) {
- return this->operator=(diff.curr());
- }
-
- OutputIterator& operator*() {
- return *this;
- }
-
- OutputIterator& operator++() {
- return *this;
- }
-
- OutputIterator& operator++(int) {
- return *this;
- }
-
- }; // class OutputIterator
-
- template <typename TDest>
- OutputIterator<TDest> make_output_iterator(TDest& destination) {
- return OutputIterator<TDest>{destination};
- }
-
- /**
- * Warning! Use of buffer size argument on make_output_iterator is
- * deprecated. Call Writer::set_buffer_size() instead if you want to
- * change the default.
- */
- template <typename TDest>
- OSMIUM_DEPRECATED OutputIterator<TDest> make_output_iterator(TDest& destination, const size_t buffer_size) {
- destination.set_buffer_size(buffer_size);
- return OutputIterator<TDest>{destination};
- }
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_OUTPUT_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/io/overwrite.hpp b/contrib/libosmium/osmium/io/overwrite.hpp
deleted file mode 100644
index f9fbc71..0000000
--- a/contrib/libosmium/osmium/io/overwrite.hpp
+++ /dev/null
@@ -1,39 +0,0 @@
-#ifndef OSMIUM_IO_OVERWRITE_HPP
-#define OSMIUM_IO_OVERWRITE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#pragma message("Including overwrite.hpp is deprecated, #include <osmium/io/writer_options.hpp> instead.")
-#include <osmium/io/writer_options.hpp>
-
-#endif // OSMIUM_IO_OVERWRITE_HPP
diff --git a/contrib/libosmium/osmium/io/pbf_input.hpp b/contrib/libosmium/osmium/io/pbf_input.hpp
deleted file mode 100644
index d7f3787..0000000
--- a/contrib/libosmium/osmium/io/pbf_input.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_PBF_INPUT_HPP
-#define OSMIUM_IO_PBF_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read OSM PBF files.
- *
- * @attention If you include this file, you'll need to link with
- * `libz`, and enable multithreading.
- */
-
-#include <osmium/io/reader.hpp> // IWYU pragma: export
-#include <osmium/io/detail/pbf_input_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_PBF_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/pbf_output.hpp b/contrib/libosmium/osmium/io/pbf_output.hpp
deleted file mode 100644
index dad1013..0000000
--- a/contrib/libosmium/osmium/io/pbf_output.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_PBF_OUTPUT_HPP
-#define OSMIUM_IO_PBF_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to write OSM PBF files.
- *
- * @attention If you include this file, you'll need to link with
- * `libz`, and enable multithreading.
- */
-
-#include <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/pbf_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_PBF_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/io/reader.hpp b/contrib/libosmium/osmium/io/reader.hpp
deleted file mode 100644
index 54c518e..0000000
--- a/contrib/libosmium/osmium/io/reader.hpp
+++ /dev/null
@@ -1,380 +0,0 @@
-#ifndef OSMIUM_IO_READER_HPP
-#define OSMIUM_IO_READER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <cstdlib>
-#include <fcntl.h>
-#include <future>
-#include <memory>
-#include <string>
-#include <system_error>
-#include <thread>
-#include <utility>
-
-#ifndef _WIN32
-# include <sys/wait.h>
-#endif
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#endif
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/input_format.hpp>
-#include <osmium/io/detail/read_thread.hpp>
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
- namespace io {
-
- /**
- * This is the user-facing interface for reading OSM files. Instantiate
- * an object of this class with a file name or osmium::io::File object
- * and then call read() on it in a loop until it returns an invalid
- * Buffer.
- */
- class Reader {
-
- static constexpr size_t max_input_queue_size = 20; // XXX
- static constexpr size_t max_osmdata_queue_size = 20; // XXX
-
- osmium::io::File m_file;
- osmium::osm_entity_bits::type m_read_which_entities;
-
- enum class status {
- okay = 0, // normal reading
- error = 1, // some error occurred while reading
- closed = 2, // close() called successfully after eof
- eof = 3 // eof of file was reached without error
- } m_status;
-
- int m_childpid;
-
- detail::future_string_queue_type m_input_queue;
-
- std::unique_ptr<osmium::io::Decompressor> m_decompressor;
-
- osmium::io::detail::ReadThreadManager m_read_thread_manager;
-
- detail::future_buffer_queue_type m_osmdata_queue;
- detail::queue_wrapper<osmium::memory::Buffer> m_osmdata_queue_wrapper;
-
- std::future<osmium::io::Header> m_header_future;
- osmium::io::Header m_header;
-
- osmium::thread::thread_handler m_thread;
-
- // This function will run in a separate thread.
- static void parser_thread(const osmium::io::File& file,
- detail::future_string_queue_type& input_queue,
- detail::future_buffer_queue_type& osmdata_queue,
- std::promise<osmium::io::Header>&& header_promise,
- osmium::osm_entity_bits::type read_which_entities) {
- std::promise<osmium::io::Header> promise = std::move(header_promise);
- auto creator = detail::ParserFactory::instance().get_creator_function(file);
- auto parser = creator(input_queue, osmdata_queue, promise, read_which_entities);
- parser->parse();
- }
-
-#ifndef _WIN32
- /**
- * Fork and execute the given command in the child.
- * A pipe is created between the child and the parent.
- * The child writes to the pipe, the parent reads from it.
- * This function never returns in the child.
- *
- * @param command Command to execute in the child.
- * @param filename Filename to give to command as argument.
- * @returns File descriptor of pipe in the parent.
- * @throws std::system_error if a system call fails.
- */
- static int execute(const std::string& command, const std::string& filename, int* childpid) {
- int pipefd[2];
- if (pipe(pipefd) < 0) {
- throw std::system_error(errno, std::system_category(), "opening pipe failed");
- }
- pid_t pid = fork();
- if (pid < 0) {
- throw std::system_error(errno, std::system_category(), "fork failed");
- }
- if (pid == 0) { // child
- // close all file descriptors except one end of the pipe
- for (int i = 0; i < 32; ++i) {
- if (i != pipefd[1]) {
- ::close(i);
- }
- }
- if (dup2(pipefd[1], 1) < 0) { // put end of pipe as stdout/stdin
- exit(1);
- }
-
- ::open("/dev/null", O_RDONLY); // stdin
- ::open("/dev/null", O_WRONLY); // stderr
- // hack: -g switches off globbing in curl which allows [] to be used in file names
- // this is important for XAPI URLs
- // in theory this execute() function could be used for other commands, but it is
- // only used for curl at the moment, so this is okay.
- if (::execlp(command.c_str(), command.c_str(), "-g", filename.c_str(), nullptr) < 0) {
- exit(1);
- }
- }
- // parent
- *childpid = pid;
- ::close(pipefd[1]);
- return pipefd[0];
- }
-#endif
-
- /**
- * Open File for reading. Handles URLs or normal files. URLs
- * are opened by executing the "curl" program (which must be installed)
- * and reading from its output.
- *
- * @returns File descriptor of open file or pipe.
- * @throws std::system_error if a system call fails.
- */
- static int open_input_file_or_url(const std::string& filename, int* childpid) {
- std::string protocol = filename.substr(0, filename.find_first_of(':'));
- if (protocol == "http" || protocol == "https" || protocol == "ftp" || protocol == "file") {
-#ifndef _WIN32
- return execute("curl", filename, childpid);
-#else
- throw io_error("Reading OSM files from the network currently not supported on Windows.");
-#endif
- } else {
- return osmium::io::detail::open_for_reading(filename);
- }
- }
-
- public:
-
- /**
- * Create new Reader object.
- *
- * @param file The file we want to open.
- * @param read_which_entities Which OSM entities (nodes, ways, relations, and/or changesets)
- * should be read from the input file. It can speed the read up
- * significantly if objects that are not needed anyway are not
- * parsed.
- */
- explicit Reader(const osmium::io::File& file, osmium::osm_entity_bits::type read_which_entities = osmium::osm_entity_bits::all) :
- m_file(file.check()),
- m_read_which_entities(read_which_entities),
- m_status(status::okay),
- m_childpid(0),
- m_input_queue(max_input_queue_size, "raw_input"),
- m_decompressor(m_file.buffer() ?
- osmium::io::CompressionFactory::instance().create_decompressor(file.compression(), m_file.buffer(), m_file.buffer_size()) :
- osmium::io::CompressionFactory::instance().create_decompressor(file.compression(), open_input_file_or_url(m_file.filename(), &m_childpid))),
- m_read_thread_manager(*m_decompressor.get(), m_input_queue),
- m_osmdata_queue(max_osmdata_queue_size, "parser_results"),
- m_osmdata_queue_wrapper(m_osmdata_queue),
- m_header_future(),
- m_header(),
- m_thread() {
- std::promise<osmium::io::Header> header_promise;
- m_header_future = header_promise.get_future();
- m_thread = osmium::thread::thread_handler{parser_thread, std::ref(m_file), std::ref(m_input_queue), std::ref(m_osmdata_queue), std::move(header_promise), read_which_entities};
- }
-
- explicit Reader(const std::string& filename, osmium::osm_entity_bits::type read_types = osmium::osm_entity_bits::all) :
- Reader(osmium::io::File(filename), read_types) {
- }
-
- explicit Reader(const char* filename, osmium::osm_entity_bits::type read_types = osmium::osm_entity_bits::all) :
- Reader(osmium::io::File(filename), read_types) {
- }
-
- Reader(const Reader&) = delete;
- Reader& operator=(const Reader&) = delete;
-
- Reader(Reader&&) = default;
- Reader& operator=(Reader&&) = default;
-
- ~Reader() noexcept {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- /**
- * Close down the Reader. A call to this is optional, because the
- * destructor of Reader will also call this. But if you don't call
- * this function first, you might miss an exception, because the
- * destructor is not allowed to throw.
- *
- * @throws Some form of osmium::io_error when there is a problem.
- */
- void close() {
- m_status = status::closed;
-
- m_read_thread_manager.stop();
-
- m_osmdata_queue_wrapper.drain();
-
- try {
- m_read_thread_manager.close();
- } catch (...) {
- // Ignore any exceptions.
- }
-
-#ifndef _WIN32
- if (m_childpid) {
- int status;
- pid_t pid = ::waitpid(m_childpid, &status, 0);
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wold-style-cast"
- if (pid < 0 || !WIFEXITED(status) || WEXITSTATUS(status) != 0) {
- throw std::system_error(errno, std::system_category(), "subprocess returned error");
- }
-#pragma GCC diagnostic pop
- m_childpid = 0;
- }
-#endif
- }
-
- /**
- * Get the header data from the file.
- *
- * @returns Header.
- * @throws Some form of osmium::io_error if there is an error.
- */
- osmium::io::Header header() {
- if (m_status == status::error) {
- throw io_error("Can not get header from reader when in status 'error'");
- }
-
- try {
- if (m_header_future.valid()) {
- m_header = m_header_future.get();
- if (m_read_which_entities == osmium::osm_entity_bits::nothing) {
- m_status = status::eof;
- }
- }
- } catch (...) {
- close();
- m_status = status::error;
- throw;
- }
- return m_header;
- }
-
- /**
- * Reads the next buffer from the input. An invalid buffer signals
- * end-of-file. After end-of-file all read() calls will return an
- * invalid buffer. An invalid buffer is also always returned if
- * osmium::osm_entity_bits::nothing was set when the Reader was
- * constructed.
- *
- * @returns Buffer.
- * @throws Some form of osmium::io_error if there is an error.
- */
- osmium::memory::Buffer read() {
- osmium::memory::Buffer buffer;
-
- if (m_status != status::okay ||
- m_read_which_entities == osmium::osm_entity_bits::nothing) {
- throw io_error("Can not read from reader when in status 'closed', 'eof', or 'error'");
- }
-
- try {
- // m_input_format.read() can return an invalid buffer to signal EOF,
- // or a valid buffer with or without data. A valid buffer
- // without data is not an error, it just means we have to
- // keep getting the next buffer until there is one with data.
- while (true) {
- buffer = m_osmdata_queue_wrapper.pop();
- if (detail::at_end_of_data(buffer)) {
- m_status = status::eof;
- m_read_thread_manager.close();
- return buffer;
- }
- if (buffer.committed() > 0) {
- return buffer;
- }
- }
- } catch (...) {
- close();
- m_status = status::error;
- throw;
- }
- }
-
- /**
- * Has the end of file been reached? This is set after the last
- * data has been read. It is also set by calling close().
- */
- bool eof() const {
- return m_status == status::eof || m_status == status::closed;
- }
-
- }; // class Reader
-
- /**
- * Read contents of the given file into a buffer in one go. Takes
- * the same arguments as any of the Reader constructors.
- *
- * The buffer can take up quite a lot of memory, so don't do this
- * unless you are working with small OSM files and/or have lots of
- * RAM.
- */
- template <typename... TArgs>
- osmium::memory::Buffer read_file(TArgs&&... args) {
- osmium::memory::Buffer buffer(1024*1024, osmium::memory::Buffer::auto_grow::yes);
-
- Reader reader(std::forward<TArgs>(args)...);
- while (osmium::memory::Buffer read_buffer = reader.read()) {
- buffer.add_buffer(read_buffer);
- buffer.commit();
- }
-
- return buffer;
- }
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_READER_HPP
diff --git a/contrib/libosmium/osmium/io/reader_iterator.hpp b/contrib/libosmium/osmium/io/reader_iterator.hpp
deleted file mode 100644
index 8620789..0000000
--- a/contrib/libosmium/osmium/io/reader_iterator.hpp
+++ /dev/null
@@ -1,51 +0,0 @@
-#ifndef OSMIUM_IO_READER_ITERATOR_HPP
-#define OSMIUM_IO_READER_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/io/reader.hpp>
-#include <osmium/io/input_iterator.hpp>
-
-namespace std {
-
- inline osmium::io::InputIterator<osmium::io::Reader> begin(osmium::io::Reader& reader) {
- return osmium::io::InputIterator<osmium::io::Reader>(reader);
- }
-
- inline osmium::io::InputIterator<osmium::io::Reader> end(osmium::io::Reader&) {
- return osmium::io::InputIterator<osmium::io::Reader>();
- }
-
-} // namespace std
-
-#endif // OSMIUM_IO_READER_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/io/writer.hpp b/contrib/libosmium/osmium/io/writer.hpp
deleted file mode 100644
index 09c605c..0000000
--- a/contrib/libosmium/osmium/io/writer.hpp
+++ /dev/null
@@ -1,344 +0,0 @@
-#ifndef OSMIUM_IO_WRITER_HPP
-#define OSMIUM_IO_WRITER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <future>
-#include <memory>
-#include <stdexcept>
-#include <string>
-#include <thread>
-#include <utility>
-
-#include <osmium/io/compression.hpp>
-#include <osmium/io/detail/output_format.hpp>
-#include <osmium/io/detail/queue_util.hpp>
-#include <osmium/io/detail/read_write.hpp>
-#include <osmium/io/detail/write_thread.hpp>
-#include <osmium/io/error.hpp>
-#include <osmium/io/file.hpp>
-#include <osmium/io/header.hpp>
-#include <osmium/io/writer_options.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/thread/util.hpp>
-
-namespace osmium {
-
- namespace io {
-
- /**
- * This is the user-facing interface for writing OSM files. Instantiate
- * an object of this class with a file name or osmium::io::File object
- * and optionally the data for the header and then call operator() on
- * it to write Buffers or Items.
- *
- * The writer uses multithreading internally to do the actual encoding
- * of the data into the intended format, possible compress the data and
- * then write it out. But this is intentionally hidden from the user
- * of this class who can use it without knowing those details.
- *
- * If you are done call the close() method to finish up. Only if you
- * don't get an exception from the close() method, you can be sure
- * the data is written correctly (modulo operating system buffering).
- * The destructor of this class will also do the right thing if you
- * forget to call close(), but because the destructor can't throw you
- * will not get informed about any problems.
- *
- * The writer is usually used to write complete blocks of data stored
- * in osmium::memory::Buffers. But you can also write single
- * osmium::memory::Items. In this case the Writer uses an internal
- * Buffer.
- */
- class Writer {
-
- static constexpr size_t default_buffer_size = 10 * 1024 * 1024;
-
- osmium::io::File m_file;
-
- detail::future_string_queue_type m_output_queue;
-
- std::unique_ptr<osmium::io::detail::OutputFormat> m_output;
-
- osmium::memory::Buffer m_buffer;
-
- size_t m_buffer_size;
-
- std::future<bool> m_write_future;
-
- osmium::thread::thread_handler m_thread;
-
- enum class status {
- okay = 0, // normal writing
- error = 1, // some error occurred while writing
- closed = 2 // close() called successfully
- } m_status;
-
- // This function will run in a separate thread.
- static void write_thread(detail::future_string_queue_type& output_queue,
- std::unique_ptr<osmium::io::Compressor>&& compressor,
- std::promise<bool>&& write_promise) {
- detail::WriteThread write_thread{output_queue,
- std::move(compressor),
- std::move(write_promise)};
- write_thread();
- }
-
- void do_write(osmium::memory::Buffer&& buffer) {
- if (buffer && buffer.committed() > 0) {
- m_output->write_buffer(std::move(buffer));
- }
- }
-
- void do_flush() {
- if (m_buffer && m_buffer.committed() > 0) {
- osmium::memory::Buffer buffer{m_buffer_size,
- osmium::memory::Buffer::auto_grow::no};
- using std::swap;
- swap(m_buffer, buffer);
-
- m_output->write_buffer(std::move(buffer));
- }
- }
-
- template <typename TFunction, typename... TArgs>
- void ensure_cleanup(TFunction func, TArgs&&... args) {
- if (m_status != status::okay) {
- throw io_error("Can not write to writer when in status 'closed' or 'error'");
- }
-
- try {
- osmium::thread::check_for_exception(m_write_future);
- func(std::forward<TArgs>(args)...);
- } catch (...) {
- m_status = status::error;
- detail::add_to_queue(m_output_queue, std::current_exception());
- detail::add_end_of_data_to_queue(m_output_queue);
- throw;
- }
- }
-
- struct options_type {
- osmium::io::Header header;
- overwrite allow_overwrite = overwrite::no;
- fsync sync = fsync::no;
- };
-
- static void set_option(options_type& options, const osmium::io::Header& header) {
- options.header = header;
- }
-
- static void set_option(options_type& options, overwrite value) {
- options.allow_overwrite = value;
- }
-
- static void set_option(options_type& options, fsync value) {
- options.sync = value;
- }
-
- public:
-
- /**
- * The constructor of the Writer object opens a file and writes the
- * header to it.
- *
- * @param file File (contains name and format info) to open.
- * @param args All further arguments are optional and can appear
- * in any order:
- *
- * * osmium::io::Header: Optional header data. If this is
- * not given, a default constructed osmium::io::Header
- * object will be used.
- *
- * * osmium::io::overwrite: Allow overwriting of existing file?
- * Can be osmium::io::overwrite::allow or
- * osmium::io::overwrite::no (default).
- *
- * * osmium::io::fsync: Should fsync be called on the file
- * before closing it? Can be osmium::io::fsync::yes or
- * osmium::io::fsync::no (default).
- *
- * @throws osmium::io_error If there was an error.
- * @throws std::system_error If the file could not be opened.
- */
- template <typename... TArgs>
- explicit Writer(const osmium::io::File& file, TArgs&&... args) :
- m_file(file.check()),
- m_output_queue(20, "raw_output"), // XXX
- m_output(osmium::io::detail::OutputFormatFactory::instance().create_output(m_file, m_output_queue)),
- m_buffer(),
- m_buffer_size(default_buffer_size),
- m_write_future(),
- m_thread(),
- m_status(status::okay) {
- assert(!m_file.buffer()); // XXX can't handle pseudo-files
-
- options_type options;
- (void)std::initializer_list<int>{
- (set_option(options, args), 0)...
- };
-
- std::unique_ptr<osmium::io::Compressor> compressor =
- CompressionFactory::instance().create_compressor(file.compression(),
- osmium::io::detail::open_for_writing(m_file.filename(), options.allow_overwrite),
- options.sync);
-
- std::promise<bool> write_promise;
- m_write_future = write_promise.get_future();
- m_thread = osmium::thread::thread_handler{write_thread, std::ref(m_output_queue), std::move(compressor), std::move(write_promise)};
-
- ensure_cleanup([&](){
- m_output->write_header(options.header);
- });
- }
-
- template <typename... TArgs>
- explicit Writer(const std::string& filename, TArgs&&... args) :
- Writer(osmium::io::File(filename), std::forward<TArgs>(args)...) {
- }
-
- template <typename... TArgs>
- explicit Writer(const char* filename, TArgs&&... args) :
- Writer(osmium::io::File(filename), std::forward<TArgs>(args)...) {
- }
-
- Writer(const Writer&) = delete;
- Writer& operator=(const Writer&) = delete;
-
- Writer(Writer&&) = default;
- Writer& operator=(Writer&&) = default;
-
- ~Writer() noexcept {
- try {
- close();
- } catch (...) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- /**
- * Get the currently configured size of the internal buffer.
- */
- size_t buffer_size() const noexcept {
- return m_buffer_size;
- }
-
- /**
- * Set the size of the internal buffer. This will only take effect
- * if you have not yet written anything or after the next flush().
- */
- void set_buffer_size(size_t size) noexcept {
- m_buffer_size = size;
- }
-
- /**
- * Flush the internal buffer if it contains any data. This is
- * usually not needed as the buffer gets flushed on close()
- * automatically.
- *
- * @throws Some form of osmium::io_error when there is a problem.
- */
- void flush() {
- ensure_cleanup([&](){
- do_flush();
- });
- }
-
- /**
- * Write contents of a buffer to the output file. The buffer is
- * moved into this function and will be in an undefined moved-from
- * state afterwards.
- *
- * @param buffer Buffer that is being written out.
- * @throws Some form of osmium::io_error when there is a problem.
- */
- void operator()(osmium::memory::Buffer&& buffer) {
- ensure_cleanup([&](){
- do_flush();
- do_write(std::move(buffer));
- });
- }
-
- /**
- * Add item to the internal buffer for eventual writing to the
- * output file.
- *
- * @param item Item to write (usually an OSM object).
- * @throws Some form of osmium::io_error when there is a problem.
- */
- void operator()(const osmium::memory::Item& item) {
- ensure_cleanup([&](){
- if (!m_buffer) {
- m_buffer = osmium::memory::Buffer{m_buffer_size,
- osmium::memory::Buffer::auto_grow::no};
- }
- try {
- m_buffer.push_back(item);
- } catch (osmium::buffer_is_full&) {
- do_flush();
- m_buffer.push_back(item);
- }
- });
- }
-
- /**
- * Flushes internal buffer and closes output file. If you do not
- * call this, the destructor of Writer will also do the same
- * thing. But because this call might throw an exception, which
- * the destructor will ignore, it is better to call close()
- * explicitly.
- *
- * @throws Some form of osmium::io_error when there is a problem.
- */
- void close() {
- if (m_status == status::okay) {
- ensure_cleanup([&](){
- do_write(std::move(m_buffer));
- m_output->write_end();
- m_status = status::closed;
- detail::add_end_of_data_to_queue(m_output_queue);
- });
- }
-
- if (m_write_future.valid()) {
- m_write_future.get();
- }
- }
-
- }; // class Writer
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_WRITER_HPP
diff --git a/contrib/libosmium/osmium/io/writer_options.hpp b/contrib/libosmium/osmium/io/writer_options.hpp
deleted file mode 100644
index ef19553..0000000
--- a/contrib/libosmium/osmium/io/writer_options.hpp
+++ /dev/null
@@ -1,60 +0,0 @@
-#ifndef OSMIUM_IO_WRITER_OPTIONS_HPP
-#define OSMIUM_IO_WRITER_OPTIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-namespace osmium {
-
- namespace io {
-
- /**
- * Allow overwriting of existing file?
- */
- enum class overwrite : bool {
- no = false,
- allow = true
- };
-
- /**
- * Should writer do an fsync before closing the file?
- */
- enum class fsync : bool {
- no = false,
- yes = true
- };
-
- } // namespace io
-
-} // namespace osmium
-
-#endif // OSMIUM_IO_WRITER_OPTIONS_HPP
diff --git a/contrib/libosmium/osmium/io/xml_input.hpp b/contrib/libosmium/osmium/io/xml_input.hpp
deleted file mode 100644
index dfcd0a9..0000000
--- a/contrib/libosmium/osmium/io/xml_input.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_IO_XML_INPUT_HPP
-#define OSMIUM_IO_XML_INPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to read OSM XML files.
- *
- * @attention If you include this file, you'll need to link with
- * `libexpat`, and enable multithreading.
- */
-
-#include <osmium/io/reader.hpp> // IWYU pragma: export
-#include <osmium/io/detail/xml_input_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_XML_INPUT_HPP
diff --git a/contrib/libosmium/osmium/io/xml_output.hpp b/contrib/libosmium/osmium/io/xml_output.hpp
deleted file mode 100644
index 18a1386..0000000
--- a/contrib/libosmium/osmium/io/xml_output.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-#ifndef OSMIUM_IO_XML_OUTPUT_HPP
-#define OSMIUM_IO_XML_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-/**
- * @file
- *
- * Include this file if you want to write OSM XML files.
- *
- * @attention If you include this file, you'll need to enable multithreading.
- */
-
-#include <osmium/io/writer.hpp> // IWYU pragma: export
-#include <osmium/io/detail/xml_output_format.hpp> // IWYU pragma: export
-
-#endif // OSMIUM_IO_XML_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/memory/buffer.hpp b/contrib/libosmium/osmium/memory/buffer.hpp
deleted file mode 100644
index 11a4c97..0000000
--- a/contrib/libosmium/osmium/memory/buffer.hpp
+++ /dev/null
@@ -1,617 +0,0 @@
-#ifndef OSMIUM_MEMORY_BUFFER_HPP
-#define OSMIUM_MEMORY_BUFFER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstring>
-#include <functional>
-#include <iterator>
-#include <stdexcept>
-#include <utility>
-#include <vector>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/memory/item_iterator.hpp>
-#include <osmium/osm/entity.hpp>
-
-namespace osmium {
-
- /**
- * Exception thrown by the osmium::memory::Buffer class when somebody tries
- * to write data into a buffer and it doesn't fit. Buffers with internal
- * memory management will not throw this exception, but increase their size.
- */
- struct buffer_is_full : public std::runtime_error {
-
- buffer_is_full() :
- std::runtime_error("Osmium buffer is full") {
- }
-
- }; // struct buffer_is_full
-
- /**
- * @brief Memory management of items in buffers and iterators over this data.
- */
- namespace memory {
-
- /**
- * A memory area for storing OSM objects and other items. Each item stored
- * has a type and a length. See the Item class for details.
- *
- * Data can be added to a buffer piece by piece using reserve_space() and
- * add_item(). After all data that together forms an item is added, it must
- * be committed using the commit() call. Usually this is done through the
- * Builder class and its derived classes.
- *
- * You can iterate over all items in a buffer using the iterators returned
- * by begin(), end(), cbegin(), and cend().
- *
- * Buffers exist in two flavours, those with external memory management and
- * those with internal memory management. If you already have some memory
- * with data in it (for instance read from disk), you create a Buffer with
- * external memory management. It is your job then to free the memory once
- * the buffer isn't used any more. If you don't have memory already, you can
- * create a Buffer object and have it manage the memory internally. It will
- * dynamically allocate memory and free it again after use.
- *
- * By default, if a buffer gets full it will throw a buffer_is_full exception.
- * You can use the set_full_callback() method to set a callback functor
- * which will be called instead of throwing an exception.
- */
- class Buffer {
-
- public:
-
- enum class auto_grow : bool {
- yes = true,
- no = false
- }; // enum class auto_grow
-
- private:
-
- std::vector<unsigned char> m_memory;
- unsigned char* m_data;
- size_t m_capacity;
- size_t m_written;
- size_t m_committed;
- auto_grow m_auto_grow {auto_grow::no};
- std::function<void(Buffer&)> m_full;
-
- public:
-
- typedef Item value_type;
-
- /**
- * The constructor without any parameters creates a non-initialized
- * buffer, ie an empty hull of a buffer that has no actual memory
- * associated with it. It can be used to signify end-of-data.
- */
- Buffer() noexcept :
- m_memory(),
- m_data(nullptr),
- m_capacity(0),
- m_written(0),
- m_committed(0) {
- }
-
- /**
- * Constructs an externally memory-managed buffer using the given
- * memory and size.
- *
- * @param data A pointer to some already initialized data.
- * @param size The size of the initialized data.
- * @throws std::invalid_argument When the size isn't a multiple of the alignment.
- */
- explicit Buffer(unsigned char* data, size_t size) :
- m_memory(),
- m_data(data),
- m_capacity(size),
- m_written(size),
- m_committed(size) {
- if (size % align_bytes != 0) {
- throw std::invalid_argument("buffer size needs to be multiple of alignment");
- }
- }
-
- /**
- * Constructs an externally memory-managed buffer with the given
- * capacity that already contains 'committed' bytes of data.
- *
- * @param data A pointer to some (possibly initialized) data.
- * @param capacity The size of the memory for this buffer.
- * @param committed The size of the initialized data. If this is 0, the buffer startes out empty.
- * @throws std::invalid_argument When the capacity or committed isn't a multiple of the alignment.
- */
- explicit Buffer(unsigned char* data, size_t capacity, size_t committed) :
- m_memory(),
- m_data(data),
- m_capacity(capacity),
- m_written(committed),
- m_committed(committed) {
- if (capacity % align_bytes != 0) {
- throw std::invalid_argument("buffer capacity needs to be multiple of alignment");
- }
- if (committed % align_bytes != 0) {
- throw std::invalid_argument("buffer parameter 'committed' needs to be multiple of alignment");
- }
- }
-
- /**
- * Create an internally memory-managed buffer with the given capacity.
- * different in that it internally gets dynamic memory of the
- * required size. The dynamic memory will be automatically
- * freed when the Buffer is destroyed.
- */
- explicit Buffer(size_t capacity, auto_grow auto_grow = auto_grow::yes) :
- m_memory(capacity),
- m_data(m_memory.data()),
- m_capacity(capacity),
- m_written(0),
- m_committed(0),
- m_auto_grow(auto_grow) {
- if (capacity % align_bytes != 0) {
- throw std::invalid_argument("buffer capacity needs to be multiple of alignment");
- }
- }
-
- // buffers can not be copied
- Buffer(const Buffer&) = delete;
- Buffer& operator=(const Buffer&) = delete;
-
- // buffers can be moved
- Buffer(Buffer&&) = default;
- Buffer& operator=(Buffer&&) = default;
-
- ~Buffer() = default;
-
- /**
- * Return a pointer to data inside the buffer.
- */
- unsigned char* data() const noexcept {
- assert(m_data);
- return m_data;
- }
-
- /**
- * Returns the capacity of the buffer, ie how many bytes it can contain.
- * Always returns 0 on invalid buffers.
- */
- size_t capacity() const noexcept {
- return m_capacity;
- }
-
- /**
- * Returns the number of bytes already filled in this buffer.
- * Always returns 0 on invalid buffers.
- */
- size_t committed() const noexcept {
- return m_committed;
- }
-
- /**
- * Returns the number of bytes currently filled in this buffer that
- * are not yet committed.
- * Always returns 0 on invalid buffers.
- */
- size_t written() const noexcept {
- return m_written;
- }
-
- /**
- * This tests if the current state of the buffer is aligned
- * properly. Can be used for asserts.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- */
- bool is_aligned() const noexcept {
- assert(m_data);
- return (m_written % align_bytes == 0) && (m_committed % align_bytes == 0);
- }
-
- /**
- * Set functor to be called whenever the buffer is full
- * instead of throwing buffer_is_full.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- */
- void set_full_callback(std::function<void(Buffer&)> full) {
- assert(m_data);
- m_full = full;
- }
-
- /**
- * Grow capacity of this buffer to the given size.
- * This works only with internally memory-managed buffers.
- * If the given size is not larger than the current capacity, nothing is done.
- * Already written but not committed data is discarded.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- *
- * @param size New capacity.
- */
- void grow(size_t size) {
- assert(m_data);
- if (m_memory.empty()) {
- throw std::logic_error("Can't grow Buffer if it doesn't use internal memory management.");
- }
- if (m_capacity < size) {
- if (size % align_bytes != 0) {
- throw std::invalid_argument("buffer capacity needs to be multiple of alignment");
- }
- m_memory.resize(size);
- m_data = m_memory.data();
- m_capacity = size;
- }
- }
-
- /**
- * Mark currently written bytes in the buffer as committed.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- *
- * @returns Last number of committed bytes before this commit.
- */
- size_t commit() {
- assert(m_data);
- assert(is_aligned());
-
- const size_t offset = m_committed;
- m_committed = m_written;
- return offset;
- }
-
- /**
- * Roll back changes in buffer to last committed state.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- */
- void rollback() {
- assert(m_data);
- m_written = m_committed;
- }
-
- /**
- * Clear the buffer.
- *
- * No-op on an invalid buffer.
- *
- * @returns Number of bytes in the buffer before it was cleared.
- */
- size_t clear() {
- const size_t committed = m_committed;
- m_written = 0;
- m_committed = 0;
- return committed;
- }
-
- /**
- * Get the data in the buffer at the given offset.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- *
- * @tparam T Type we want to the data to be interpreted as.
- * @returns Reference of given type pointing to the data in the buffer.
- */
- template <typename T>
- T& get(const size_t offset) const {
- assert(m_data);
- return *reinterpret_cast<T*>(&m_data[offset]);
- }
-
- /**
- * Reserve space of given size in buffer and return pointer to it.
- * This is the only way of adding data to the buffer. You reserve
- * the space and then fill it.
- *
- * Note that you have to eventually call commit() to actually
- * commit this data.
- *
- * If there isn't enough space in the buffer, one of three things
- * can happen:
- *
- * * If you have set a callback with set_full_callback(), it is
- * called. After the call returns, you must have either grown
- * the buffer or cleared it by calling buffer.clear().
- * * If no callback is defined and this buffer uses internal
- * memory management, the buffers capacity is grown, so that
- * the new data will fit.
- * * Else the buffer_is_full exception is thrown.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- *
- * @param size Number of bytes to reserve.
- * @returns Pointer to reserved space. Note that this pointer is
- * only guaranteed to be valid until the next call to
- * reserve_space().
- * @throws osmium::buffer_is_full Might be thrown if the buffer is full.
- */
- unsigned char* reserve_space(const size_t size) {
- assert(m_data);
- if (m_written + size > m_capacity) {
- if (m_full) {
- m_full(*this);
- } else if (!m_memory.empty() && (m_auto_grow == auto_grow::yes)) {
- // double buffer size until there is enough space
- size_t new_capacity = m_capacity * 2;
- while (m_written + size > new_capacity) {
- new_capacity *= 2;
- }
- grow(new_capacity);
- } else {
- throw osmium::buffer_is_full();
- }
- }
- unsigned char* data = &m_data[m_written];
- m_written += size;
- return data;
- }
-
- /**
- * Add an item to the buffer. The size of the item is stored inside
- * the item, so we know how much memory to copy.
- *
- * Note that you have to eventually call commit() to actually
- * commit this data.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- *
- * @tparam T Class of the item to be copied.
- * @param item Reference to the item to be copied.
- * @returns Reference to newly copied data in the buffer.
- */
- template <typename T>
- T& add_item(const T& item) {
- assert(m_data);
- unsigned char* target = reserve_space(item.padded_size());
- std::copy_n(reinterpret_cast<const unsigned char*>(&item), item.padded_size(), target);
- return *reinterpret_cast<T*>(target);
- }
-
- /**
- * Add committed contents of the given buffer to this buffer.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- *
- * Note that you have to eventually call commit() to actually
- * commit this data.
- */
- void add_buffer(const Buffer& buffer) {
- assert(m_data);
- unsigned char* target = reserve_space(buffer.committed());
- std::copy_n(reinterpret_cast<const unsigned char*>(buffer.data()), buffer.committed(), target);
- }
-
- /**
- * Add an item to the buffer. This function is provided so that
- * you can use std::back_inserter.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- */
- void push_back(const osmium::memory::Item& item) {
- assert(m_data);
- add_item(item);
- commit();
- }
-
- /**
- * These iterators can be used to iterate over all items in
- * a buffer.
- */
- template <typename T>
- using t_iterator = osmium::memory::ItemIterator<T>;
-
- template <typename T>
- using t_const_iterator = osmium::memory::ItemIterator<const T>;
-
- typedef t_iterator<osmium::OSMEntity> iterator;
- typedef t_const_iterator<osmium::OSMEntity> const_iterator;
-
- template <typename T>
- t_iterator<T> begin() {
- assert(m_data);
- return t_iterator<T>(m_data, m_data + m_committed);
- }
-
- iterator begin() {
- assert(m_data);
- return iterator(m_data, m_data + m_committed);
- }
-
- template <typename T>
- t_iterator<T> get_iterator(size_t offset) {
- assert(m_data);
- return t_iterator<T>(m_data + offset, m_data + m_committed);
- }
-
- iterator get_iterator(size_t offset) {
- assert(m_data);
- return iterator(m_data + offset, m_data + m_committed);
- }
-
- template <typename T>
- t_iterator<T> end() {
- assert(m_data);
- return t_iterator<T>(m_data + m_committed, m_data + m_committed);
- }
-
- iterator end() {
- assert(m_data);
- return iterator(m_data + m_committed, m_data + m_committed);
- }
-
- template <typename T>
- t_const_iterator<T> cbegin() const {
- assert(m_data);
- return t_const_iterator<T>(m_data, m_data + m_committed);
- }
-
- const_iterator cbegin() const {
- assert(m_data);
- return const_iterator(m_data, m_data + m_committed);
- }
-
- template <typename T>
- t_const_iterator<T> get_iterator(size_t offset) const {
- assert(m_data);
- return t_const_iterator<T>(m_data + offset, m_data + m_committed);
- }
-
- const_iterator get_iterator(size_t offset) const {
- assert(m_data);
- return const_iterator(m_data + offset, m_data + m_committed);
- }
-
- template <typename T>
- t_const_iterator<T> cend() const {
- assert(m_data);
- return t_const_iterator<T>(m_data + m_committed, m_data + m_committed);
- }
-
- const_iterator cend() const {
- assert(m_data);
- return const_iterator(m_data + m_committed, m_data + m_committed);
- }
-
- template <typename T>
- t_const_iterator<T> begin() const {
- return cbegin<T>();
- }
-
- const_iterator begin() const {
- return cbegin();
- }
-
- template <typename T>
- t_const_iterator<T> end() const {
- return cend<T>();
- }
-
- const_iterator end() const {
- return cend();
- }
-
- /**
- * In a bool context any initialized buffer is true.
- */
- explicit operator bool() const {
- return m_data != nullptr;
- }
-
- friend void swap(Buffer& lhs, Buffer& rhs) {
- using std::swap;
-
- swap(lhs.m_memory, rhs.m_memory);
- swap(lhs.m_data, rhs.m_data);
- swap(lhs.m_capacity, rhs.m_capacity);
- swap(lhs.m_written, rhs.m_written);
- swap(lhs.m_committed, rhs.m_committed);
- }
-
- /**
- * Purge removed items from the buffer. This is done by moving all
- * non-removed items forward in the buffer overwriting removed
- * items and then correcting the m_written and m_committed numbers.
- *
- * Note that calling this function invalidates all iterators on this
- * buffer and all offsets in this buffer.
- *
- * For every non-removed item that moves its position, the function
- * 'moving_in_buffer' is called on the given callback object with
- * the old and new offsets in the buffer where the object used to
- * be and is now, respectively. This call can be used to update any
- * indexes.
- *
- * The behaviour is undefined if you call this on an invalid
- * buffer.
- */
- template <typename TCallbackClass>
- void purge_removed(TCallbackClass* callback) {
- assert(m_data);
- if (begin() == end()) {
- return;
- }
-
- iterator it_write = begin();
-
- iterator next;
- for (iterator it_read = begin(); it_read != end(); it_read = next) {
- next = std::next(it_read);
- if (!it_read->removed()) {
- if (it_read != it_write) {
- assert(it_read.data() >= data());
- assert(it_write.data() >= data());
- size_t old_offset = static_cast<size_t>(it_read.data() - data());
- size_t new_offset = static_cast<size_t>(it_write.data() - data());
- callback->moving_in_buffer(old_offset, new_offset);
- std::memmove(it_write.data(), it_read.data(), it_read->padded_size());
- }
- it_write.advance_once();
- }
- }
-
- assert(it_write.data() >= data());
- m_written = static_cast<size_t>(it_write.data() - data());
- m_committed = m_written;
- }
-
- }; // class Buffer
-
- inline bool operator==(const Buffer& lhs, const Buffer& rhs) noexcept {
- if (!lhs || !rhs) {
- return !lhs && !rhs;
- }
- return lhs.data() == rhs.data() && lhs.capacity() == rhs.capacity() && lhs.committed() == rhs.committed();
- }
-
- inline bool operator!=(const Buffer& lhs, const Buffer& rhs) noexcept {
- return ! (lhs == rhs);
- }
-
- } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_MEMORY_BUFFER_HPP
diff --git a/contrib/libosmium/osmium/memory/collection.hpp b/contrib/libosmium/osmium/memory/collection.hpp
deleted file mode 100644
index 54a97f5..0000000
--- a/contrib/libosmium/osmium/memory/collection.hpp
+++ /dev/null
@@ -1,153 +0,0 @@
-#ifndef OSMIUM_MEMORY_COLLECTION_HPP
-#define OSMIUM_MEMORY_COLLECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iterator>
-#include <iosfwd>
-#include <type_traits>
-
-#include <osmium/memory/item.hpp>
-
-namespace osmium {
-
- namespace memory {
-
- template <typename TMember>
- class CollectionIterator : public std::iterator<std::forward_iterator_tag, TMember> {
-
- // This data_type is either 'unsigned char*' or 'const unsigned char*' depending
- // on whether TMember is const. This allows this class to be used as an iterator and
- // as a const_iterator.
- typedef typename std::conditional<std::is_const<TMember>::value, const unsigned char*, unsigned char*>::type data_type;
-
- data_type m_data;
-
- public:
-
- CollectionIterator() noexcept :
- m_data(nullptr) {
- }
-
- CollectionIterator(data_type data) noexcept :
- m_data(data) {
- }
-
- CollectionIterator<TMember>& operator++() {
- m_data = reinterpret_cast<TMember*>(m_data)->next();
- return *static_cast<CollectionIterator<TMember>*>(this);
- }
-
- CollectionIterator<TMember> operator++(int) {
- CollectionIterator<TMember> tmp(*this);
- operator++();
- return tmp;
- }
-
- bool operator==(const CollectionIterator<TMember>& rhs) const noexcept {
- return m_data == rhs.m_data;
- }
-
- bool operator!=(const CollectionIterator<TMember>& rhs) const noexcept {
- return m_data != rhs.m_data;
- }
-
- unsigned char* data() const noexcept {
- return m_data;
- }
-
- TMember& operator*() const {
- return *reinterpret_cast<TMember*>(m_data);
- }
-
- TMember* operator->() const {
- return reinterpret_cast<TMember*>(m_data);
- }
-
- template <typename TChar, typename TTraits>
- friend std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const CollectionIterator<TMember>& iter) {
- return out << static_cast<const void*>(iter.m_data);
- }
-
- }; // class CollectionIterator
-
- template <typename TMember, osmium::item_type TCollectionItemType>
- class Collection : public Item {
-
- public:
-
- typedef CollectionIterator<TMember> iterator;
- typedef CollectionIterator<const TMember> const_iterator;
- typedef TMember value_type;
-
- static constexpr osmium::item_type itemtype = TCollectionItemType;
-
- Collection() :
- Item(sizeof(Collection<TMember, TCollectionItemType>), TCollectionItemType) {
- }
-
- bool empty() const {
- return sizeof(Collection<TMember, TCollectionItemType>) == byte_size();
- }
-
- iterator begin() {
- return iterator(data() + sizeof(Collection<TMember, TCollectionItemType>));
- }
-
- iterator end() {
- return iterator(data() + byte_size());
- }
-
- const_iterator cbegin() const {
- return const_iterator(data() + sizeof(Collection<TMember, TCollectionItemType>));
- }
-
- const_iterator cend() const {
- return const_iterator(data() + byte_size());
- }
-
- const_iterator begin() const {
- return cbegin();
- }
-
- const_iterator end() const {
- return cend();
- }
-
- }; // class Collection
-
- } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_MEMORY_COLLECTION_HPP
diff --git a/contrib/libosmium/osmium/memory/item.hpp b/contrib/libosmium/osmium/memory/item.hpp
deleted file mode 100644
index 30c5377..0000000
--- a/contrib/libosmium/osmium/memory/item.hpp
+++ /dev/null
@@ -1,177 +0,0 @@
-#ifndef OSMIUM_MEMORY_ITEM_HPP
-#define OSMIUM_MEMORY_ITEM_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <type_traits>
-
-namespace osmium {
-
- // forward declaration, see osmium/osm/item_type.hpp for declaration
- enum class item_type : uint16_t;
-
- namespace builder {
- class Builder;
- }
-
- namespace memory {
-
- typedef uint32_t item_size_type;
-
- // align datastructures to this many bytes
- constexpr item_size_type align_bytes = 8;
-
- template <typename T>
- inline T padded_length(T length) noexcept {
- static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, "Template parameter must be unsigned integral type");
- return (length + align_bytes - 1) & ~(align_bytes - 1);
- }
-
- /**
- * @brief Namespace for Osmium internal use
- */
- namespace detail {
-
- /**
- * This class contains only a helper method used in several
- * other classes.
- */
- class ItemHelper {
-
- protected:
-
- ItemHelper() = default;
-
- ~ItemHelper() = default;
-
- ItemHelper(const ItemHelper&) = default;
- ItemHelper(ItemHelper&&) = default;
-
- ItemHelper& operator=(const ItemHelper&) = default;
- ItemHelper& operator=(ItemHelper&&) = default;
-
- public:
-
- unsigned char* data() noexcept {
- return reinterpret_cast<unsigned char*>(this);
- }
-
- const unsigned char* data() const noexcept {
- return reinterpret_cast<const unsigned char*>(this);
- }
-
- }; // class ItemHelper
-
- } // namespace detail
-
- class Item : public osmium::memory::detail::ItemHelper {
-
- item_size_type m_size;
- item_type m_type;
- uint16_t m_removed : 1;
- uint16_t m_padding : 15;
-
- template <typename TMember>
- friend class CollectionIterator;
-
- template <typename TMember>
- friend class ItemIterator;
-
- friend class osmium::builder::Builder;
-
- Item& add_size(const item_size_type size) noexcept {
- m_size += size;
- return *this;
- }
-
- protected:
-
- explicit Item(item_size_type size = 0, item_type type = item_type()) noexcept :
- m_size(size),
- m_type(type),
- m_removed(false),
- m_padding(0) {
- }
-
- Item(const Item&) = delete;
- Item(Item&&) = delete;
-
- Item& operator=(const Item&) = delete;
- Item& operator=(Item&&) = delete;
-
- Item& set_type(const item_type item_type) noexcept {
- m_type = item_type;
- return *this;
- }
-
- public:
-
- unsigned char* next() noexcept {
- return data() + padded_size();
- }
-
- const unsigned char* next() const noexcept {
- return data() + padded_size();
- }
-
- item_size_type byte_size() const noexcept {
- return m_size;
- }
-
- item_size_type padded_size() const {
- return padded_length(m_size);
- }
-
- item_type type() const noexcept {
- return m_type;
- }
-
- bool removed() const noexcept {
- return m_removed;
- }
-
- void set_removed(bool removed) noexcept {
- m_removed = removed;
- }
-
- }; // class Item
-
- static_assert(sizeof(Item) == 8, "Class osmium::Item has wrong size!");
- static_assert(sizeof(Item) % align_bytes == 0, "Class osmium::Item has wrong size to be aligned properly!");
-
- } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_MEMORY_ITEM_HPP
diff --git a/contrib/libosmium/osmium/memory/item_iterator.hpp b/contrib/libosmium/osmium/memory/item_iterator.hpp
deleted file mode 100644
index c6b4205..0000000
--- a/contrib/libosmium/osmium/memory/item_iterator.hpp
+++ /dev/null
@@ -1,234 +0,0 @@
-#ifndef OSMIUM_ITEM_ITERATOR_HPP
-#define OSMIUM_ITEM_ITERATOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iterator>
-#include <iosfwd>
-#include <type_traits>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
- class Node;
- class Way;
- class Relation;
- class Area;
- class Changeset;
- class OSMObject;
- class OSMEntity;
- class TagList;
- class WayNodeList;
- class RelationMemberList;
- class InnerRing;
- class OuterRing;
-
- namespace memory {
-
- namespace detail {
-
- template <typename T>
- inline bool type_is_compatible(osmium::item_type) noexcept {
- return true;
- }
-
- template <>
- inline bool type_is_compatible<osmium::Node>(osmium::item_type t) noexcept {
- return t == osmium::item_type::node;
- }
-
- template <>
- inline bool type_is_compatible<osmium::Way>(osmium::item_type t) noexcept {
- return t == osmium::item_type::way;
- }
-
- template <>
- inline bool type_is_compatible<osmium::Relation>(osmium::item_type t) noexcept {
- return t == osmium::item_type::relation;
- }
-
- template <>
- inline bool type_is_compatible<osmium::Area>(osmium::item_type t) noexcept {
- return t == osmium::item_type::area;
- }
-
- template <>
- inline bool type_is_compatible<osmium::Changeset>(osmium::item_type t) noexcept {
- return t == osmium::item_type::changeset;
- }
-
- template <>
- inline bool type_is_compatible<osmium::OSMObject>(osmium::item_type t) noexcept {
- return t == osmium::item_type::node || t == osmium::item_type::way || t == osmium::item_type::relation || t == osmium::item_type::area;
- }
-
- template <>
- inline bool type_is_compatible<osmium::OSMEntity>(osmium::item_type t) noexcept {
- return t == osmium::item_type::node || t == osmium::item_type::way || t == osmium::item_type::relation || t == osmium::item_type::area || t == osmium::item_type::changeset;
- }
-
- template <>
- inline bool type_is_compatible<osmium::TagList>(osmium::item_type t) noexcept {
- return t == osmium::item_type::tag_list;
- }
-
- template <>
- inline bool type_is_compatible<osmium::WayNodeList>(osmium::item_type t) noexcept {
- return t == osmium::item_type::way_node_list;
- }
-
- template <>
- inline bool type_is_compatible<osmium::RelationMemberList>(osmium::item_type t) noexcept {
- return t == osmium::item_type::relation_member_list || t == osmium::item_type::relation_member_list_with_full_members;
- }
-
- template <>
- inline bool type_is_compatible<osmium::OuterRing>(osmium::item_type t) noexcept {
- return t == osmium::item_type::outer_ring;
- }
-
- template <>
- inline bool type_is_compatible<osmium::InnerRing>(osmium::item_type t) noexcept {
- return t == osmium::item_type::inner_ring;
- }
-
- } // namespace detail
-
- template <typename TMember>
- class ItemIterator : public std::iterator<std::forward_iterator_tag, TMember> {
-
- static_assert(std::is_base_of<osmium::memory::Item, TMember>::value, "TMember must derive from osmium::memory::Item");
-
- // This data_type is either 'unsigned char*' or 'const unsigned char*' depending
- // on whether TMember is const. This allows this class to be used as an iterator and
- // as a const_iterator.
- typedef typename std::conditional<std::is_const<TMember>::value, const unsigned char*, unsigned char*>::type data_type;
-
- data_type m_data;
- data_type m_end;
-
- void advance_to_next_item_of_right_type() {
- while (m_data != m_end &&
- !detail::type_is_compatible<typename std::remove_const<TMember>::type>(reinterpret_cast<const osmium::memory::Item*>(m_data)->type())) {
- m_data = reinterpret_cast<TMember*>(m_data)->next();
- }
- }
-
- public:
-
- ItemIterator() noexcept :
- m_data(nullptr),
- m_end(nullptr) {
- }
-
- ItemIterator(data_type data, data_type end) :
- m_data(data),
- m_end(end) {
- advance_to_next_item_of_right_type();
- }
-
- template <typename T>
- ItemIterator<T> cast() const {
- return ItemIterator<T>(m_data, m_end);
- }
-
- ItemIterator<TMember>& operator++() {
- assert(m_data);
- assert(m_data != m_end);
- m_data = reinterpret_cast<TMember*>(m_data)->next();
- advance_to_next_item_of_right_type();
- return *static_cast<ItemIterator<TMember>*>(this);
- }
-
- /**
- * Like operator++() but will NOT skip items of unwanted
- * types. Do not use this unless you know what you are
- * doing.
- */
- ItemIterator<TMember>& advance_once() {
- assert(m_data);
- assert(m_data != m_end);
- m_data = reinterpret_cast<TMember*>(m_data)->next();
- return *static_cast<ItemIterator<TMember>*>(this);
- }
-
- ItemIterator<TMember> operator++(int) {
- ItemIterator<TMember> tmp(*this);
- operator++();
- return tmp;
- }
-
- bool operator==(const ItemIterator<TMember>& rhs) const {
- return m_data == rhs.m_data && m_end == rhs.m_end;
- }
-
- bool operator!=(const ItemIterator<TMember>& rhs) const {
- return !(*this == rhs);
- }
-
- unsigned char* data() const {
- assert(m_data);
- return m_data;
- }
-
- TMember& operator*() const {
- assert(m_data);
- assert(m_data != m_end);
- return *reinterpret_cast<TMember*>(m_data);
- }
-
- TMember* operator->() const {
- assert(m_data);
- assert(m_data != m_end);
- return reinterpret_cast<TMember*>(m_data);
- }
-
- explicit operator bool() const {
- return m_data != nullptr;
- }
-
- template <typename TChar, typename TTraits>
- friend std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const ItemIterator<TMember>& iter) {
- return out << static_cast<void*>(iter.m_data);
- }
-
- }; // class ItemIterator
-
- } // namespace memory
-
-} // namespace osmium
-
-#endif // OSMIUM_ITEM_ITERATOR_HPP
diff --git a/contrib/libosmium/osmium/object_pointer_collection.hpp b/contrib/libosmium/osmium/object_pointer_collection.hpp
deleted file mode 100644
index 85566b6..0000000
--- a/contrib/libosmium/osmium/object_pointer_collection.hpp
+++ /dev/null
@@ -1,112 +0,0 @@
-#ifndef OSMIUM_OBJECT_POINTER_COLLECTION_HPP
-#define OSMIUM_OBJECT_POINTER_COLLECTION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <utility>
-#include <vector>
-
-#include <boost/iterator/indirect_iterator.hpp>
-
-#include <osmium/handler.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/object.hpp>
-
-// IWYU pragma: no_forward_declare osmium::OSMObject
-// IWYU pragma: no_forward_declare osmium::memory::Item
-
-namespace osmium {
-
- /**
- * A collection of pointers to OSM objects. The pointers can be easily
- * and quickly sorted or otherwise manipulated, while the objects
- * themselves or the buffers they are in, do not have to be changed.
- *
- * An iterator is provided that can iterate over the pointers but looks
- * like it is iterating over the underlying OSM objects.
- *
- * This class implements the visitor pattern which makes it easy to
- * populate the collection from a buffer of OSM objects:
- *
- * osmium::ObjectPointerCollection objects;
- * osmium::memory::Buffer buffer = reader.read();
- * osmium::apply(buffer, objects);
- *
- */
- class ObjectPointerCollection : public osmium::handler::Handler {
-
- std::vector<osmium::OSMObject*> m_objects;
-
- public:
-
- typedef boost::indirect_iterator<std::vector<osmium::OSMObject*>::iterator, osmium::OSMObject> iterator;
- typedef boost::indirect_iterator<std::vector<osmium::OSMObject*>::const_iterator, const osmium::OSMObject> const_iterator;
-
- ObjectPointerCollection() noexcept :
- m_objects() {
- }
-
- void osm_object(osmium::OSMObject& object) {
- m_objects.push_back(&object);
- }
-
- /**
- * Sort objects according to the given order functor.
- */
- template <typename TCompare>
- void sort(TCompare&& compare) {
- std::sort(m_objects.begin(), m_objects.end(), std::forward<TCompare>(compare));
- }
-
- iterator begin() {
- return iterator { m_objects.begin() };
- }
-
- iterator end() {
- return iterator { m_objects.end() };
- }
-
- const_iterator cbegin() const {
- return const_iterator { m_objects.cbegin() };
- }
-
- const_iterator cend() const {
- return const_iterator { m_objects.cend() };
- }
-
- }; // class ObjectPointerCollection
-
-} // namespace osmium
-
-#endif // OSMIUM_OBJECT_POINTER_COLLECTION_HPP
diff --git a/contrib/libosmium/osmium/osm.hpp b/contrib/libosmium/osmium/osm.hpp
deleted file mode 100644
index e92d9b8..0000000
--- a/contrib/libosmium/osmium/osm.hpp
+++ /dev/null
@@ -1,48 +0,0 @@
-#ifndef OSMIUM_OSM_HPP
-#define OSMIUM_OSM_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/osm/node.hpp> // IWYU pragma: export
-#include <osmium/osm/way.hpp> // IWYU pragma: export
-#include <osmium/osm/relation.hpp> // IWYU pragma: export
-#include <osmium/osm/area.hpp> // IWYU pragma: export
-#include <osmium/osm/changeset.hpp> // IWYU pragma: export
-
-/**
- * @brief Namespace for everything in the Osmium library.
- */
-namespace osmium {
-} // namespace osmium
-
-#endif // OSMIUM_OSM_HPP
diff --git a/contrib/libosmium/osmium/osm/area.hpp b/contrib/libosmium/osmium/osm/area.hpp
deleted file mode 100644
index 4e11c8b..0000000
--- a/contrib/libosmium/osmium/osm/area.hpp
+++ /dev/null
@@ -1,215 +0,0 @@
-#ifndef OSMIUM_OSM_AREA_HPP
-#define OSMIUM_OSM_AREA_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstdlib>
-#include <utility>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/node_ref_list.hpp>
-
-namespace osmium {
-
- namespace builder {
- template <class T> class ObjectBuilder;
- }
-
- /**
- * An outer ring of an Area.
- */
- class OuterRing : public NodeRefList {
-
- public:
-
- static constexpr osmium::item_type itemtype = osmium::item_type::outer_ring;
-
- OuterRing():
- NodeRefList(itemtype) {
- }
-
- }; // class OuterRing
-
- static_assert(sizeof(OuterRing) % osmium::memory::align_bytes == 0, "Class osmium::OuterRing has wrong size to be aligned properly!");
-
- /**
- * An inner ring of an Area.
- */
- class InnerRing : public NodeRefList {
-
- public:
-
- static constexpr osmium::item_type itemtype = osmium::item_type::inner_ring;
-
- InnerRing():
- NodeRefList(itemtype) {
- }
-
- }; // class InnerRing
-
- static_assert(sizeof(InnerRing) % osmium::memory::align_bytes == 0, "Class osmium::InnerRing has wrong size to be aligned properly!");
-
- /**
- * Convert way or (multipolygon) relation id into unique area id.
- *
- * @param id Id of a way or relation
- * @param type Type of object (way or relation)
- * @returns Area id
- */
- inline osmium::object_id_type object_id_to_area_id(osmium::object_id_type id, osmium::item_type type) noexcept {
- osmium::object_id_type area_id = std::abs(id) * 2;
- if (type == osmium::item_type::relation) {
- ++area_id;
- }
- return id < 0 ? -area_id : area_id;
- }
-
- /**
- * Convert area id into id of the way or relation it was created from.
- *
- * @param id Area id
- * @returns Way or Relation id.
- */
- inline osmium::object_id_type area_id_to_object_id(osmium::object_id_type id) noexcept {
- return id / 2;
- }
-
- /**
- * An OSM area created out of a closed way or a multipolygon relation.
- */
- class Area : public OSMObject {
-
- friend class osmium::builder::ObjectBuilder<osmium::Area>;
-
- Area() :
- OSMObject(sizeof(Area), osmium::item_type::area) {
- }
-
- public:
-
- static constexpr osmium::item_type itemtype = osmium::item_type::area;
-
- /**
- * Was this area created from a way? (In contrast to areas
- * created from a relation and their members.)
- */
- bool from_way() const noexcept {
- return (positive_id() & 0x1) == 0;
- }
-
- /**
- * Return the Id of the way or relation this area was created from.
- */
- osmium::object_id_type orig_id() const noexcept {
- return osmium::area_id_to_object_id(id());
- }
-
- /**
- * Count the number of outer and inner rings of this area.
- *
- * @returns Pair (number outer rings, number inner rings)
- */
- std::pair<int, int> num_rings() const {
- std::pair<int, int> counter { 0, 0 };
-
- for (auto it = cbegin(); it != cend(); ++it) {
- switch (it->type()) {
- case osmium::item_type::outer_ring:
- ++counter.first;
- break;
- case osmium::item_type::inner_ring:
- ++counter.second;
- break;
- case osmium::item_type::tag_list:
- // ignore tags
- break;
- case osmium::item_type::undefined:
- case osmium::item_type::node:
- case osmium::item_type::way:
- case osmium::item_type::relation:
- case osmium::item_type::area:
- case osmium::item_type::changeset:
- case osmium::item_type::way_node_list:
- case osmium::item_type::relation_member_list:
- case osmium::item_type::relation_member_list_with_full_members:
- case osmium::item_type::changeset_discussion:
- assert(false && "Children of Area can only be outer/inner_ring and tag_list.");
- break;
- }
- }
-
- return counter;
- }
-
- /**
- * Check whether this area is a multipolygon, ie. whether it has more
- * than one outer ring?
- */
- bool is_multipolygon() const {
- return num_rings().first > 1;
- }
-
- /**
- * Get iterator for iterating over all inner rings in a specified outer
- * ring.
- *
- * @param it Iterator specifying outer ring.
- * @returns Iterator to first inner ring in specified outer ring.
- */
- osmium::memory::ItemIterator<const osmium::InnerRing> inner_ring_cbegin(const osmium::memory::ItemIterator<const osmium::OuterRing>& it) const {
- return it.cast<const osmium::InnerRing>();
- }
-
- /**
- * Get iterator for iterating over all inner rings in a specified outer
- * ring.
- *
- * @param it Iterator specifying outer ring.
- * @returns Iterator one past last inner ring in specified outer ring.
- */
- osmium::memory::ItemIterator<const osmium::InnerRing> inner_ring_cend(const osmium::memory::ItemIterator<const osmium::OuterRing>& it) const {
- return std::next(it).cast<const osmium::InnerRing>();
- }
-
- }; // class Area
-
- static_assert(sizeof(Area) % osmium::memory::align_bytes == 0, "Class osmium::Area has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_AREA_HPP
diff --git a/contrib/libosmium/osmium/osm/box.hpp b/contrib/libosmium/osmium/osm/box.hpp
deleted file mode 100644
index 631f919..0000000
--- a/contrib/libosmium/osmium/osm/box.hpp
+++ /dev/null
@@ -1,250 +0,0 @@
-#ifndef OSMIUM_OSM_BOX_HPP
-#define OSMIUM_OSM_BOX_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iosfwd>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/osm/location.hpp>
-
-namespace osmium {
-
- /**
- * Bounding box. A box is defined by two locations (bottom left location
- * and top right location) or, alternatively by four coordinates (minx,
- * miny, maxx, and maxy). If both locations are undefined, the box is
- * undefined, too.
- */
- class Box {
-
- osmium::Location m_bottom_left;
- osmium::Location m_top_right;
-
- public:
-
- /**
- * Create undefined Box. Use the extend() function
- * to add actual bounds.
- */
- constexpr Box() noexcept :
- m_bottom_left(),
- m_top_right() {
- }
-
- /**
- * Create box from minimum and maximum coordinates.
- *
- * @pre @code minx <= maxx && miny <= maxy @endcode
- */
- Box(double minx, double miny, double maxx, double maxy) :
- m_bottom_left(minx, miny),
- m_top_right(maxx, maxy) {
- assert(minx <= maxx && miny <= maxy);
- }
-
- /**
- * Create box from bottom left and top right locations.
- *
- * @pre Either both locations must be defined or neither.
- * @pre If both locations are defined, the
- * bottom left location must actually be to the left and below
- * the top right location. Same coordinates for bottom/top or
- * left/right are also okay.
- */
- Box(const osmium::Location& bottom_left, const osmium::Location& top_right) :
- m_bottom_left(bottom_left),
- m_top_right(top_right) {
- assert(
- (!!bottom_left && !!top_right) ||
- (bottom_left.x() <= top_right.x() && bottom_left.y() <= top_right.y())
- );
- }
-
- Box(const Box&) = default;
- Box(Box&&) = default;
- Box& operator=(const Box&) = default;
- Box& operator=(Box&&) = default;
- ~Box() = default;
-
- /**
- * Extend this bounding box by the specified location. If the
- * location is undefined, the bounding box is unchanged. If
- * the box is undefined it will only contain the location after
- * this call.
- *
- * @param location The location we want to extend the box by.
- * @returns A reference to this box.
- */
- Box& extend(const Location& location) noexcept {
- if (location) {
- if (m_bottom_left) {
- if (location.x() < m_bottom_left.x()) {
- m_bottom_left.set_x(location.x());
- }
- if (location.x() > m_top_right.x()) {
- m_top_right.set_x(location.x());
- }
- if (location.y() < m_bottom_left.y()) {
- m_bottom_left.set_y(location.y());
- }
- if (location.y() > m_top_right.y()) {
- m_top_right.set_y(location.y());
- }
- } else {
- m_bottom_left = location;
- m_top_right = location;
- }
- }
- return *this;
- }
-
- /**
- * Extend this bounding box by the specified box. If the
- * specified box is undefined, the bounding box is unchanged.
- *
- * @param box The box to extend by.
- * @returns A reference to this box.
- */
- Box& extend(const Box& box) noexcept {
- extend(box.bottom_left());
- extend(box.top_right());
- return *this;
- }
-
- /**
- * Box is defined, ie. contains defined locations.
- */
- explicit constexpr operator bool() const noexcept {
- return static_cast<bool>(m_bottom_left);
- }
-
- /**
- * Box is valid, ie. defined and inside usual bounds
- * (-180<=lon<=180, -90<=lat<=90).
- */
- OSMIUM_CONSTEXPR bool valid() const noexcept {
- return bottom_left().valid() && top_right().valid();
- }
-
- /**
- * Access bottom-left location.
- */
- OSMIUM_CONSTEXPR Location bottom_left() const noexcept {
- return m_bottom_left;
- }
-
- /**
- * Access bottom-left location.
- */
- Location& bottom_left() noexcept {
- return m_bottom_left;
- }
-
- /**
- * Access top-right location.
- */
- OSMIUM_CONSTEXPR Location top_right() const noexcept {
- return m_top_right;
- }
-
- /**
- * Access top-right location.
- */
- Location& top_right() noexcept {
- return m_top_right;
- }
-
- /**
- * Check whether the location is inside the box.
- *
- * @pre Location must be defined.
- * @pre Box must be defined.
- */
- bool contains(const osmium::Location& location) const noexcept {
- assert(bottom_left());
- assert(top_right());
- assert(location);
- return location.x() >= bottom_left().x() && location.y() >= bottom_left().y() &&
- location.x() <= top_right().x() && location.y() <= top_right().y();
- }
-
- /**
- * Calculate size of the box in square degrees.
- *
- * @throws osmium::invalid_location unless all coordinates are valid.
- */
- double size() const {
- return (m_top_right.lon() - m_bottom_left.lon()) *
- (m_top_right.lat() - m_bottom_left.lat());
- }
-
- }; // class Box
-
- /**
- * Boxes are equal if both locations are equal. Undefined boxes will
- * compare equal.
- */
- inline OSMIUM_CONSTEXPR bool operator==(const Box& lhs, const Box& rhs) noexcept {
- return lhs.bottom_left() == rhs.bottom_left() &&
- lhs.top_right() == rhs.top_right();
- }
-
- /**
- * Output a box to a stream. The format is "(LON, LAT, LON, LAT)" or
- * "(undefined)" if the box is undefined.
- *
- * @returns Reference to basic_ostream given as first parameter.
- */
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::Box& box) {
- if (box) {
- out << '('
- << box.bottom_left().lon()
- << ','
- << box.bottom_left().lat()
- << ','
- << box.top_right().lon()
- << ','
- << box.top_right().lat()
- << ')';
- } else {
- out << "(undefined)";
- }
- return out;
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_BOX_HPP
diff --git a/contrib/libosmium/osmium/osm/changeset.hpp b/contrib/libosmium/osmium/osm/changeset.hpp
deleted file mode 100644
index 051b525..0000000
--- a/contrib/libosmium/osmium/osm/changeset.hpp
+++ /dev/null
@@ -1,458 +0,0 @@
-#ifndef OSMIUM_OSM_CHANGESET_HPP
-#define OSMIUM_OSM_CHANGESET_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstring>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/box.hpp>
-#include <osmium/osm/entity.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/types_from_string.hpp>
-
-namespace osmium {
-
- namespace builder {
- class ChangesetDiscussionBuilder;
- template <typename T> class ObjectBuilder;
- }
-
- class Changeset;
-
- class ChangesetComment : public osmium::memory::detail::ItemHelper {
-
- friend class osmium::builder::ChangesetDiscussionBuilder;
-
- osmium::Timestamp m_date;
- osmium::user_id_type m_uid {0};
- string_size_type m_user_size;
- string_size_type m_text_size;
-
- ChangesetComment(const ChangesetComment&) = delete;
- ChangesetComment(ChangesetComment&&) = delete;
-
- ChangesetComment& operator=(const ChangesetComment&) = delete;
- ChangesetComment& operator=(ChangesetComment&&) = delete;
-
- unsigned char* endpos() {
- return data() + osmium::memory::padded_length(sizeof(ChangesetComment) + m_user_size + m_text_size);
- }
-
- const unsigned char* endpos() const {
- return data() + osmium::memory::padded_length(sizeof(ChangesetComment) + m_user_size + m_text_size);
- }
-
- template <typename TMember>
- friend class osmium::memory::CollectionIterator;
-
- unsigned char* next() {
- return endpos();
- }
-
- unsigned const char* next() const {
- return endpos();
- }
-
- void set_user_size(string_size_type size) noexcept {
- m_user_size = size;
- }
-
- void set_text_size(string_size_type size) noexcept {
- m_text_size = size;
- }
-
- public:
-
- static constexpr item_type collection_type = item_type::changeset_discussion;
-
- ChangesetComment(osmium::Timestamp date, osmium::user_id_type uid) noexcept :
- m_date(date),
- m_uid(uid),
- m_user_size(0),
- m_text_size(0) {
- }
-
- osmium::Timestamp date() const noexcept {
- return m_date;
- }
-
- osmium::user_id_type uid() const noexcept {
- return m_uid;
- }
-
- const char* user() const noexcept {
- return reinterpret_cast<const char*>(data() + sizeof(ChangesetComment));
- }
-
- const char* text() const noexcept {
- return reinterpret_cast<const char*>(data() + sizeof(ChangesetComment) + m_user_size);
- }
-
- }; // class ChangesetComment
-
- class ChangesetDiscussion : public osmium::memory::Collection<ChangesetComment, osmium::item_type::changeset_discussion> {
-
- friend class osmium::builder::ObjectBuilder<osmium::Changeset>;
-
- public:
-
- typedef size_t size_type;
-
- ChangesetDiscussion() :
- osmium::memory::Collection<ChangesetComment, osmium::item_type::changeset_discussion>() {
- }
-
- size_type size() const noexcept {
- return static_cast<size_type>(std::distance(begin(), end()));
- }
-
- }; // class ChangesetDiscussion
-
- static_assert(sizeof(ChangesetDiscussion) % osmium::memory::align_bytes == 0, "Class osmium::ChangesetDiscussion has wrong size to be aligned properly!");
-
- /**
- * \brief An OSM Changeset, a group of changes made by a single user over
- * a short period of time.
- *
- * You can not create Changeset objects directly. Use the ChangesetBuilder
- * class to create Changesets in a Buffer.
- */
- class Changeset : public osmium::OSMEntity {
-
- friend class osmium::builder::ObjectBuilder<osmium::Changeset>;
-
- osmium::Box m_bounds;
- osmium::Timestamp m_created_at;
- osmium::Timestamp m_closed_at;
- changeset_id_type m_id {0};
- num_changes_type m_num_changes {0};
- num_comments_type m_num_comments {0};
- user_id_type m_uid {0};
- string_size_type m_user_size;
- int16_t m_padding1 {0};
- int32_t m_padding2 {0};
-
- Changeset() :
- OSMEntity(sizeof(Changeset), osmium::item_type::changeset) {
- }
-
- void set_user_size(string_size_type size) {
- m_user_size = size;
- }
-
- unsigned char* subitems_position() {
- return data() + osmium::memory::padded_length(sizeof(Changeset) + m_user_size);
- }
-
- const unsigned char* subitems_position() const {
- return data() + osmium::memory::padded_length(sizeof(Changeset) + m_user_size);
- }
-
- public:
-
- /// Get ID of this changeset
- changeset_id_type id() const noexcept {
- return m_id;
- }
-
- /**
- * Set ID of this changeset
- *
- * @param id The id.
- * @returns Reference to changeset to make calls chainable.
- */
- Changeset& set_id(changeset_id_type id) noexcept {
- m_id = id;
- return *this;
- }
-
- /**
- * Set ID of this changeset.
- *
- * @param id The id.
- * @returns Reference to object to make calls chainable.
- */
- Changeset& set_id(const char* id) {
- return set_id(osmium::string_to_changeset_id(id));
- }
-
- /// Get user id.
- user_id_type uid() const noexcept {
- return m_uid;
- }
-
- /**
- * Set user id.
- *
- * @param uid The user id.
- * @returns Reference to changeset to make calls chainable.
- */
- Changeset& set_uid(user_id_type uid) noexcept {
- m_uid = uid;
- return *this;
- }
-
- /**
- * Set user id to given uid or to 0 (anonymous user) if the given
- * uid is smaller than 0.
- *
- * @param uid The user id.
- * @returns Reference to changeset to make calls chainable.
- */
- Changeset& set_uid_from_signed(signed_user_id_type uid) noexcept {
- m_uid = uid < 0 ? 0 : static_cast<user_id_type>(uid);
- return *this;
- }
-
- /**
- * Set user id to given uid or to 0 (anonymous user) if the given
- * uid is smaller than 0.
- *
- * @returns Reference to changeset to make calls chainable.
- */
- Changeset& set_uid(const char* uid) {
- return set_uid_from_signed(string_to_user_id(uid));
- }
-
- /// Is this user anonymous?
- bool user_is_anonymous() const noexcept {
- return m_uid == 0;
- }
-
- /// Get timestamp when this changeset was created.
- osmium::Timestamp created_at() const noexcept {
- return m_created_at;
- }
-
- /**
- * Get timestamp when this changeset was closed.
- *
- * @returns Timestamp. Will return the empty Timestamp when the
- * changeset is not yet closed.
- */
- osmium::Timestamp closed_at() const noexcept {
- return m_closed_at;
- }
-
- /// Is this changeset open?
- bool open() const noexcept {
- return m_closed_at == osmium::Timestamp();
- }
-
- /// Is this changeset closed?
- bool closed() const noexcept {
- return !open();
- }
-
- /**
- * Set the timestamp when this changeset was created.
- *
- * @param timestamp Timestamp
- * @returns Reference to changeset to make calls chainable.
- */
- Changeset& set_created_at(const osmium::Timestamp& timestamp) {
- m_created_at = timestamp;
- return *this;
- }
-
- /**
- * Set the timestamp when this changeset was closed.
- *
- * @param timestamp Timestamp
- * @returns Reference to changeset to make calls chainable.
- */
- Changeset& set_closed_at(const osmium::Timestamp& timestamp) {
- m_closed_at = timestamp;
- return *this;
- }
-
- /// Get the number of changes in this changeset
- num_changes_type num_changes() const noexcept {
- return m_num_changes;
- }
-
- /// Set the number of changes in this changeset
- Changeset& set_num_changes(num_changes_type num_changes) noexcept {
- m_num_changes = num_changes;
- return *this;
- }
-
- /// Set the number of changes in this changeset
- Changeset& set_num_changes(const char* num_changes) {
- return set_num_changes(osmium::string_to_num_changes(num_changes));
- }
-
- /// Get the number of comments in this changeset
- num_comments_type num_comments() const noexcept {
- return m_num_comments;
- }
-
- /// Set the number of comments in this changeset
- Changeset& set_num_comments(num_comments_type num_comments) noexcept {
- m_num_comments = num_comments;
- return *this;
- }
-
- /// Set the number of comments in this changeset
- Changeset& set_num_comments(const char* num_comments) {
- return set_num_comments(osmium::string_to_num_comments(num_comments));
- }
-
- /**
- * Get the bounding box of this changeset.
- *
- * @returns Bounding box. Can be empty.
- */
- osmium::Box& bounds() noexcept {
- return m_bounds;
- }
-
- /**
- * Get the bounding box of this changeset.
- *
- * @returns Bounding box. Can be empty.
- */
- const osmium::Box& bounds() const noexcept {
- return m_bounds;
- }
-
- /// Get user name.
- const char* user() const {
- return reinterpret_cast<const char*>(data() + sizeof(Changeset));
- }
-
- /// Get the list of tags.
- const TagList& tags() const {
- return osmium::detail::subitem_of_type<const TagList>(cbegin(), cend());
- }
-
- /**
- * Set named attribute.
- *
- * @param attr Name of the attribute (must be one of "id", "version",
- * "changeset", "timestamp", "uid", "visible")
- * @param value Value of the attribute
- */
- void set_attribute(const char* attr, const char* value) {
- if (!strcmp(attr, "id")) {
- set_id(value);
- } else if (!strcmp(attr, "num_changes")) {
- set_num_changes(value);
- } else if (!strcmp(attr, "comments_count")) {
- set_num_comments(value);
- } else if (!strcmp(attr, "created_at")) {
- set_created_at(osmium::Timestamp(value));
- } else if (!strcmp(attr, "closed_at")) {
- set_closed_at(osmium::Timestamp(value));
- } else if (!strcmp(attr, "uid")) {
- set_uid(value);
- }
- }
-
- typedef osmium::memory::CollectionIterator<Item> iterator;
- typedef osmium::memory::CollectionIterator<const Item> const_iterator;
-
- iterator begin() {
- return iterator(subitems_position());
- }
-
- iterator end() {
- return iterator(data() + padded_size());
- }
-
- const_iterator cbegin() const {
- return const_iterator(subitems_position());
- }
-
- const_iterator cend() const {
- return const_iterator(data() + padded_size());
- }
-
- const_iterator begin() const {
- return cbegin();
- }
-
- const_iterator end() const {
- return cend();
- }
-
- ChangesetDiscussion& discussion() {
- return osmium::detail::subitem_of_type<ChangesetDiscussion>(begin(), end());
- }
-
- const ChangesetDiscussion& discussion() const {
- return osmium::detail::subitem_of_type<const ChangesetDiscussion>(cbegin(), cend());
- }
-
- }; // class Changeset
-
- static_assert(sizeof(Changeset) % osmium::memory::align_bytes == 0, "Class osmium::Changeset has wrong size to be aligned properly!");
-
- /**
- * Changesets are equal if their IDs are equal.
- */
- inline bool operator==(const Changeset& lhs, const Changeset& rhs) {
- return lhs.id() == rhs.id();
- }
-
- inline bool operator!=(const Changeset& lhs, const Changeset& rhs) {
- return ! (lhs == rhs);
- }
-
- /**
- * Changesets can be ordered by id.
- */
- inline bool operator<(const Changeset& lhs, const Changeset& rhs) {
- return lhs.id() < rhs.id();
- }
-
- inline bool operator>(const Changeset& lhs, const Changeset& rhs) {
- return rhs < lhs;
- }
-
- inline bool operator<=(const Changeset& lhs, const Changeset& rhs) {
- return ! (rhs < lhs);
- }
-
- inline bool operator>=(const Changeset& lhs, const Changeset& rhs) {
- return ! (lhs < rhs);
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_CHANGESET_HPP
diff --git a/contrib/libosmium/osmium/osm/crc.hpp b/contrib/libosmium/osmium/osm/crc.hpp
deleted file mode 100644
index 309f50a..0000000
--- a/contrib/libosmium/osmium/osm/crc.hpp
+++ /dev/null
@@ -1,242 +0,0 @@
-#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 at 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 {
-
- namespace util {
-
- 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
- }
-
- 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
- }
-
- 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
- }
-
- }
-
- template <typename TCRC>
- class CRC {
-
- TCRC m_crc;
-
- public:
-
- TCRC& operator()() {
- return m_crc;
- }
-
- const TCRC& operator()() const {
- return m_crc;
- }
-
- void update_bool(const bool value) {
- m_crc.process_byte(value);
- }
-
- void update_int8(const uint8_t value) {
- m_crc.process_byte(value);
- }
-
- void update_int16(const uint16_t value) {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- m_crc.process_bytes(&value, sizeof(uint16_t));
-#else
- uint16_t v = osmium::util::byte_swap_16(value);
- m_crc.process_bytes(&v, sizeof(uint16_t));
-#endif
- }
-
- void update_int32(const uint32_t value) {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- m_crc.process_bytes(&value, sizeof(uint32_t));
-#else
- uint32_t v = osmium::util::byte_swap_32(value);
- m_crc.process_bytes(&v, sizeof(uint32_t));
-#endif
- }
-
- void update_int64(const uint64_t value) {
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- m_crc.process_bytes(&value, sizeof(uint64_t));
-#else
- uint64_t v = osmium::util::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) {
- for (const Tag& tag : tags) {
- update_string(tag.key());
- update_string(tag.value());
- }
- }
-
- 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::ChangesetDiscussion& discussion) {
- for (const auto& comment : discussion) {
- update(comment.date());
- update_int32(comment.uid());
- update_string(comment.user());
- update_string(comment.text());
- }
- }
-
- 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.num_comments());
- update_int32(changeset.uid());
- update_string(changeset.user());
- update(changeset.tags());
- update(changeset.discussion());
- }
-
- }; // class CRC
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_CRC
diff --git a/contrib/libosmium/osmium/osm/diff_object.hpp b/contrib/libosmium/osmium/osm/diff_object.hpp
deleted file mode 100644
index 96e07bc..0000000
--- a/contrib/libosmium/osmium/osm/diff_object.hpp
+++ /dev/null
@@ -1,180 +0,0 @@
-#ifndef OSMIUM_OSM_DIFF_OBJECT_HPP
-#define OSMIUM_OSM_DIFF_OBJECT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/fwd.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- class DiffObject {
-
- protected:
-
- osmium::OSMObject* m_prev;
- osmium::OSMObject* m_curr;
- osmium::OSMObject* m_next;
-
- public:
-
- DiffObject() noexcept :
- m_prev(nullptr),
- m_curr(nullptr),
- m_next(nullptr) {
- }
-
- explicit DiffObject(osmium::OSMObject& prev, osmium::OSMObject& curr, osmium::OSMObject& next) noexcept :
- m_prev(&prev),
- m_curr(&curr),
- m_next(&next) {
- }
-
- DiffObject(const DiffObject&) = default;
- DiffObject& operator=(const DiffObject&) = default;
-
- DiffObject(DiffObject&&) = default;
- DiffObject& operator=(DiffObject&&) = default;
-
- const osmium::OSMObject& prev() const noexcept {
- return *m_prev;
- }
-
- const osmium::OSMObject& curr() const noexcept {
- return *m_curr;
- }
-
- const osmium::OSMObject& next() const noexcept {
- return *m_next;
- }
-
- bool first() const noexcept {
- return m_prev == m_curr;
- }
-
- bool last() const noexcept {
- return m_curr == m_next;
- }
-
- osmium::item_type type() const noexcept {
- return m_curr->type();
- }
-
- osmium::object_id_type id() const noexcept {
- return m_curr->id();
- }
-
- osmium::object_version_type version() const noexcept {
- return m_curr->version();
- }
-
- osmium::changeset_id_type changeset() const noexcept {
- return m_curr->changeset();
- }
-
- const osmium::Timestamp start_time() const noexcept {
- 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::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
-
- template <typename T>
- class DiffObjectDerived : public DiffObject {
-
- public:
-
- DiffObjectDerived(T& prev, T& curr, T& next) noexcept :
- DiffObject(prev, curr, next) {
- }
-
- DiffObjectDerived(const DiffObjectDerived&) = default;
- DiffObjectDerived& operator=(const DiffObjectDerived&) = default;
-
- DiffObjectDerived(DiffObjectDerived&&) = default;
- DiffObjectDerived& operator=(DiffObjectDerived&&) = default;
-
- const T& prev() const noexcept {
- return *static_cast<const T*>(m_prev);
- }
-
- const T& curr() const noexcept {
- return *static_cast<const T*>(m_curr);
- }
-
- const T& next() const noexcept {
- return *static_cast<const T*>(m_next);
- }
-
- }; // class DiffObjectDerived
-
- typedef DiffObjectDerived<osmium::Node> DiffNode;
- typedef DiffObjectDerived<osmium::Way> DiffWay;
- typedef DiffObjectDerived<osmium::Relation> DiffRelation;
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_DIFF_OBJECT_HPP
diff --git a/contrib/libosmium/osmium/osm/entity.hpp b/contrib/libosmium/osmium/osm/entity.hpp
deleted file mode 100644
index c7f7055..0000000
--- a/contrib/libosmium/osmium/osm/entity.hpp
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef OSMIUM_OSM_ENTITY_HPP
-#define OSMIUM_OSM_ENTITY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/memory/item.hpp>
-#include <osmium/osm/entity_bits.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
- namespace detail {
-
- template <typename TSubitem, typename TIter>
- inline TSubitem& subitem_of_type(TIter it, TIter end) {
- for (; it != end; ++it) {
- if (it->type() == TSubitem::itemtype) {
- return reinterpret_cast<TSubitem&>(*it);
- }
- }
-
- // If no subitem of the TSubitem type was found,
- // return a default constructed one.
- static TSubitem subitem;
- return subitem;
- }
-
- } // namespace detail
-
- /**
- * \brief OSMEntity is the abstract base class for the OSMObject and
- * Changeset classes.
- */
- class OSMEntity : public osmium::memory::Item {
-
- public:
-
- explicit OSMEntity(osmium::memory::item_size_type size, osmium::item_type type) :
- Item(size, type) {
- }
-
- bool type_is_in(osmium::osm_entity_bits::type entity_bits) const {
- return (osm_entity_bits::from_item_type(type()) & entity_bits) != 0;
- }
-
- }; // class OSMEntity
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_ENTITY_HPP
diff --git a/contrib/libosmium/osmium/osm/entity_bits.hpp b/contrib/libosmium/osmium/osm/entity_bits.hpp
deleted file mode 100644
index 1c1cb80..0000000
--- a/contrib/libosmium/osmium/osm/entity_bits.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef OSMIUM_OSM_ENTITY_BITS_HPP
-#define OSMIUM_OSM_ENTITY_BITS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
- /**
- * @brief Bitfield for OSM entity types.
- */
- namespace osm_entity_bits {
-
- /**
- * Describes zero or more OSM entities.
- *
- * Usage:
- *
- * @code{.cpp}
- * osmium::osm_entity_bits::type entities = osmium::osm_entity_bits::node | osmium::osm_entity_bits::way;
- *
- * entities |= osmium::osm_entity_bits::relation;
- *
- * assert(entities & osmium::osm_entity_bits::object);
- *
- * assert(! (entities & osmium::osm_entity_bits::changeset));
- * @endcode
- */
- enum type : unsigned char {
-
- nothing = 0x00,
- node = 0x01,
- way = 0x02,
- relation = 0x04,
- nwr = 0x07, ///< node, way, or relation object
- area = 0x08,
- nwra = 0x0f, ///< node, way, relation, or area object
- object = 0x0f, ///< node, way, relation, or area object
- changeset = 0x10,
- all = 0x1f ///< object or changeset
-
- }; // enum type
-
- inline type operator|(const type lhs, const type rhs) noexcept {
- return static_cast<type>(static_cast<int>(lhs) | static_cast<int> (rhs));
- }
-
- inline type& operator|=(type& lhs, const type rhs) noexcept {
- lhs = lhs | rhs;
- return lhs;
- }
-
- inline type operator&(const type lhs, const type rhs) noexcept {
- return static_cast<type>(static_cast<int>(lhs) & static_cast<int> (rhs));
- }
-
- inline type operator~(const type value) noexcept {
- return static_cast<type>(~static_cast<int>(value));
- }
-
- inline type operator&=(type& lhs, const type rhs) noexcept {
- lhs = lhs & rhs;
- return lhs;
- }
-
- inline type from_item_type(osmium::item_type item_type) noexcept {
- return static_cast<osmium::osm_entity_bits::type>(0x1 << (static_cast<uint16_t>(item_type) - 1));
- }
-
- } // namespace osm_entity_bits
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_ENTITY_BITS_HPP
diff --git a/contrib/libosmium/osmium/osm/item_type.hpp b/contrib/libosmium/osmium/osm/item_type.hpp
deleted file mode 100644
index d8f5296..0000000
--- a/contrib/libosmium/osmium/osm/item_type.hpp
+++ /dev/null
@@ -1,200 +0,0 @@
-#ifndef OSMIUM_OSM_ITEM_TYPE_HPP
-#define OSMIUM_OSM_ITEM_TYPE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstdint> // IWYU pragma: keep
-#include <iosfwd>
-#include <stdexcept>
-
-namespace osmium {
-
- enum class item_type : uint16_t {
-
- undefined = 0x00,
- node = 0x01,
- way = 0x02,
- relation = 0x03,
- area = 0x04,
- changeset = 0x05,
- tag_list = 0x11,
- way_node_list = 0x12,
- relation_member_list = 0x13,
- relation_member_list_with_full_members = 0x23,
- outer_ring = 0x40,
- inner_ring = 0x41,
- changeset_discussion = 0x80
-
- }; // 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':
- return item_type::undefined;
- case 'n':
- return item_type::node;
- case 'w':
- return item_type::way;
- case 'r':
- return item_type::relation;
- case 'a':
- return item_type::area;
- case 'c':
- return item_type::changeset;
- case 'T':
- return item_type::tag_list;
- case 'N':
- return item_type::way_node_list;
- case 'M':
- return item_type::relation_member_list;
- case 'F':
- return item_type::relation_member_list_with_full_members;
- case 'O':
- return item_type::outer_ring;
- case 'I':
- return item_type::inner_ring;
- case 'D':
- return item_type::changeset_discussion;
- default:
- return item_type::undefined;
- }
- }
-
-// avoid g++ false positive
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wreturn-type"
- inline char item_type_to_char(const item_type type) noexcept {
- switch (type) {
- case item_type::undefined:
- return 'X';
- case item_type::node:
- return 'n';
- case item_type::way:
- return 'w';
- case item_type::relation:
- return 'r';
- case item_type::area:
- return 'a';
- case item_type::changeset:
- return 'c';
- case item_type::tag_list:
- return 'T';
- case item_type::way_node_list:
- return 'N';
- case item_type::relation_member_list:
- return 'M';
- case item_type::relation_member_list_with_full_members:
- return 'F';
- case item_type::outer_ring:
- return 'O';
- case item_type::inner_ring:
- return 'I';
- case item_type::changeset_discussion:
- return 'D';
- }
- }
-
- inline const char* item_type_to_name(const item_type type) noexcept {
- switch (type) {
- case item_type::undefined:
- return "undefined";
- case item_type::node:
- return "node";
- case item_type::way:
- return "way";
- case item_type::relation:
- return "relation";
- case item_type::area:
- return "area";
- case item_type::changeset:
- return "changeset";
- case item_type::tag_list:
- return "tag_list";
- case item_type::way_node_list:
- return "way_node_list";
- case item_type::relation_member_list:
- return "relation_member_list";
- case item_type::relation_member_list_with_full_members:
- return "relation_member_list_with_full_members";
- case item_type::outer_ring:
- return "outer_ring";
- case item_type::inner_ring:
- return "inner_ring";
- case item_type::changeset_discussion:
- return "changeset_discussion";
- }
- }
-#pragma GCC diagnostic pop
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const item_type item_type) {
- return out << item_type_to_char(item_type);
- }
-
- /**
- * This exception is thrown when a visitor encounters an unknown item type.
- * Under usual circumstance this should not happen. If it does happen, it
- * probably means the buffer contains different kinds of objects than were
- * expected or that there is some kind of data corruption.
- */
- struct unknown_type : public std::runtime_error {
-
- unknown_type() :
- std::runtime_error("unknown item type") {
- }
-
- }; // struct unknown_type
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_ITEM_TYPE_HPP
diff --git a/contrib/libosmium/osmium/osm/location.hpp b/contrib/libosmium/osmium/osm/location.hpp
deleted file mode 100644
index 0d4fdc1..0000000
--- a/contrib/libosmium/osmium/osm/location.hpp
+++ /dev/null
@@ -1,285 +0,0 @@
-#ifndef OSMIUM_OSM_LOCATION_HPP
-#define OSMIUM_OSM_LOCATION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cmath>
-#include <cstdint>
-#include <iosfwd>
-#include <stdexcept>
-#include <string>
-
-#include <iostream>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/util/double.hpp>
-
-namespace osmium {
-
- /**
- * Exception signaling an invalid location, ie a location
- * outside the -180 to 180 and -90 to 90 degree range.
- */
- struct invalid_location : public std::range_error {
-
- invalid_location(const std::string& what) :
- std::range_error(what) {
- }
-
- invalid_location(const char* what) :
- std::range_error(what) {
- }
-
- }; // struct invalid_location
-
- /**
- * Locations define a place on earth.
- *
- * Locations are stored in 32 bit integers for the x and y
- * coordinates, respectively. This gives you an accuracy of a few
- * centimeters, good enough for OSM use. (The main OSM database
- * uses the same scheme.)
- *
- * An undefined Location can be created by calling the constructor
- * without parameters.
- *
- * Coordinates are never checked on whether they are inside bounds.
- * Call valid() to check this.
- */
- class Location {
-
- int32_t m_x;
- int32_t m_y;
-
- public:
-
- // this value is used for a coordinate to mark it as undefined
- // MSVC doesn't declare std::numeric_limits<int32_t>::max() as
- // constexpr, so we hard code this for the time being.
- // static constexpr int32_t undefined_coordinate = std::numeric_limits<int32_t>::max();
- static constexpr int32_t undefined_coordinate = 2147483647;
-
- static constexpr int coordinate_precision = 10000000;
-
- static int32_t double_to_fix(const double c) noexcept {
- return static_cast<int32_t>(std::round(c * coordinate_precision));
- }
-
- static OSMIUM_CONSTEXPR double fix_to_double(const int32_t c) noexcept {
- return static_cast<double>(c) / coordinate_precision;
- }
-
- /**
- * Create undefined Location.
- */
- explicit constexpr Location() noexcept :
- m_x(undefined_coordinate),
- m_y(undefined_coordinate) {
- }
-
- /**
- * Create Location with given x and y coordinates.
- * Note that these coordinates are coordinate_precision
- * times larger than the real coordinates.
- */
- constexpr Location(const int32_t x, const int32_t y) noexcept :
- m_x(x),
- m_y(y) {
- }
-
- /**
- * Create Location with given x and y coordinates.
- * Note that these coordinates are coordinate_precision
- * times larger than the real coordinates.
- */
- constexpr Location(const int64_t x, const int64_t y) noexcept :
- m_x(static_cast<int32_t>(x)),
- m_y(static_cast<int32_t>(y)) {
- }
-
- /**
- * Create Location with given longitude and latitude.
- */
- Location(const double lon, const double lat) :
- m_x(double_to_fix(lon)),
- m_y(double_to_fix(lat)) {
- }
-
- Location(const Location&) = default;
- Location(Location&&) = default;
- Location& operator=(const Location&) = default;
- Location& operator=(Location&&) = default;
- ~Location() = default;
-
- /**
- * Check whether the coordinates of this location
- * are defined.
- */
- explicit constexpr operator bool() const noexcept {
- return m_x != undefined_coordinate && m_y != undefined_coordinate;
- }
-
- /**
- * Check whether the coordinates are inside the
- * usual bounds (-180<=lon<=180, -90<=lat<=90).
- */
- constexpr bool valid() const noexcept {
- return m_x >= -180 * coordinate_precision
- && m_x <= 180 * coordinate_precision
- && m_y >= -90 * coordinate_precision
- && m_y <= 90 * coordinate_precision;
- }
-
- constexpr int32_t x() const noexcept {
- return m_x;
- }
-
- constexpr int32_t y() const noexcept {
- return m_y;
- }
-
- Location& set_x(const int32_t x) noexcept {
- m_x = x;
- return *this;
- }
-
- Location& set_y(const int32_t y) noexcept {
- m_y = y;
- return *this;
- }
-
- /**
- * Get longitude.
- *
- * @throws invalid_location if the location is invalid
- */
- double lon() const {
- if (!valid()) {
- throw osmium::invalid_location("invalid location");
- }
- return fix_to_double(m_x);
- }
-
- /**
- * Get longitude without checking the validity.
- */
- double lon_without_check() const {
- return fix_to_double(m_x);
- }
-
- /**
- * Get latitude.
- *
- * @throws invalid_location if the location is invalid
- */
- double lat() const {
- if (!valid()) {
- throw osmium::invalid_location("invalid location");
- }
- return fix_to_double(m_y);
- }
-
- /**
- * Get latitude without checking the validity.
- */
- double lat_without_check() const {
- return fix_to_double(m_y);
- }
-
- Location& set_lon(double lon) noexcept {
- m_x = double_to_fix(lon);
- return *this;
- }
-
- Location& set_lat(double lat) noexcept {
- m_y = double_to_fix(lat);
- return *this;
- }
-
- template <typename T>
- T as_string(T iterator, const char separator) const {
- iterator = osmium::util::double2string(iterator, lon(), 7);
- *iterator++ = separator;
- return osmium::util::double2string(iterator, lat(), 7);
- }
-
- }; // class Location
-
- /**
- * Locations are equal if both coordinates are equal.
- */
- inline OSMIUM_CONSTEXPR bool operator==(const Location& lhs, const Location& rhs) noexcept {
- return lhs.x() == rhs.x() && lhs.y() == rhs.y();
- }
-
- inline OSMIUM_CONSTEXPR bool operator!=(const Location& lhs, const Location& rhs) noexcept {
- return ! (lhs == rhs);
- }
-
- /**
- * Compare two locations by comparing first the x and then
- * the y coordinate. If either of the locations is
- * undefined the result is undefined.
- */
- inline OSMIUM_CONSTEXPR bool operator<(const Location& lhs, const Location& rhs) noexcept {
- return (lhs.x() == rhs.x() && lhs.y() < rhs.y()) || lhs.x() < rhs.x();
- }
-
- inline OSMIUM_CONSTEXPR bool operator>(const Location& lhs, const Location& rhs) noexcept {
- return rhs < lhs;
- }
-
- inline OSMIUM_CONSTEXPR bool operator<=(const Location& lhs, const Location& rhs) noexcept {
- return ! (rhs < lhs);
- }
-
- inline OSMIUM_CONSTEXPR bool operator>=(const Location& lhs, const Location& rhs) noexcept {
- return ! (lhs < rhs);
- }
-
- /**
- * Output a location to a stream.
- */
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::Location& location) {
- if (location) {
- out << '(' << location.lon() << ',' << location.lat() << ')';
- } else {
- out << "(undefined,undefined)";
- }
- return out;
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_LOCATION_HPP
diff --git a/contrib/libosmium/osmium/osm/node.hpp b/contrib/libosmium/osmium/osm/node.hpp
deleted file mode 100644
index e9facef..0000000
--- a/contrib/libosmium/osmium/osm/node.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-#ifndef OSMIUM_OSM_NODE_HPP
-#define OSMIUM_OSM_NODE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/object.hpp>
-
-namespace osmium {
-
- namespace builder {
- template <typename T> class ObjectBuilder;
- }
-
- class Node : public OSMObject {
-
- friend class osmium::builder::ObjectBuilder<osmium::Node>;
-
- osmium::Location m_location;
-
- Node() :
- OSMObject(sizeof(Node), osmium::item_type::node) {
- }
-
- public:
-
- static constexpr osmium::item_type itemtype = osmium::item_type::node;
-
- osmium::Location location() const noexcept {
- return m_location;
- }
-
- Node& set_location(const osmium::Location& location) {
- m_location = location;
- return *this;
- }
-
- }; // class Node
-
- static_assert(sizeof(Node) % osmium::memory::align_bytes == 0, "Class osmium::Node has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_NODE_HPP
diff --git a/contrib/libosmium/osmium/osm/node_ref.hpp b/contrib/libosmium/osmium/osm/node_ref.hpp
deleted file mode 100644
index 72359cd..0000000
--- a/contrib/libosmium/osmium/osm/node_ref.hpp
+++ /dev/null
@@ -1,173 +0,0 @@
-#ifndef OSMIUM_OSM_NODE_REF_HPP
-#define OSMIUM_OSM_NODE_REF_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstdlib>
-#include <iosfwd>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- /**
- * This reference to a node contains a node ID and a (possibly empty)
- * location.
- */
- class NodeRef : public osmium::memory::detail::ItemHelper {
-
- osmium::object_id_type m_ref;
- osmium::Location m_location;
-
- public:
-
- NodeRef(const osmium::object_id_type ref = 0, const osmium::Location& location = Location()) noexcept :
- m_ref(ref),
- m_location(location) {
- }
-
- osmium::object_id_type ref() const noexcept {
- return m_ref;
- }
-
- osmium::unsigned_object_id_type positive_ref() const noexcept {
- return static_cast<osmium::unsigned_object_id_type>(std::abs(m_ref));
- }
-
- /**
- * Get reference to location in this NodeRef. Can be used to update it.
- */
- osmium::Location& location() noexcept {
- return m_location;
- }
-
- osmium::Location location() const noexcept {
- return m_location;
- }
-
- double lon() const {
- return m_location.lon();
- }
-
- double lat() const {
- return m_location.lat();
- }
-
- int32_t x() const noexcept {
- return m_location.x();
- }
-
- int32_t y() const noexcept {
- return m_location.y();
- }
-
- NodeRef& set_ref(const osmium::object_id_type ref) noexcept {
- m_ref = ref;
- return *this;
- }
-
- NodeRef& set_location(const osmium::Location& location) noexcept {
- m_location = location;
- return *this;
- }
-
- }; // class NodeRef
-
- inline bool operator==(const NodeRef& lhs, const NodeRef& rhs) noexcept {
- return lhs.ref() == rhs.ref();
- }
-
- inline bool operator!=(const NodeRef& lhs, const NodeRef& rhs) noexcept {
- return ! (lhs == rhs);
- }
-
- inline bool operator<(const NodeRef& lhs, const NodeRef& rhs) noexcept {
- return lhs.ref() < rhs.ref();
- }
-
- inline bool operator>(const NodeRef& lhs, const NodeRef& rhs) noexcept {
- return rhs < lhs;
- }
-
- inline bool operator<=(const NodeRef& lhs, const NodeRef& rhs) noexcept {
- return ! (rhs < lhs);
- }
-
- inline bool operator>=(const NodeRef& lhs, const NodeRef& rhs) noexcept {
- return ! (lhs < rhs);
- }
-
- /**
- * Output a NodeRef to a stream.
- */
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::NodeRef& nr) {
- return out << "<" << nr.ref() << " " << nr.location() << ">";
- }
-
- /**
- * Functor to compare NodeRefs by Location instead of id.
- */
- struct location_equal {
-
- bool operator()(const NodeRef& lhs, const NodeRef& rhs) const noexcept {
- return lhs.location() == rhs.location();
- }
-
- typedef NodeRef first_argument_type;
- typedef NodeRef second_argument_type;
- typedef bool result_type;
-
- }; // struct location_equal
-
- /**
- * Functor to compare NodeRefs by Location instead of id.
- */
- struct location_less {
-
- bool operator()(const NodeRef& lhs, const NodeRef& rhs) const noexcept {
- return lhs.location() < rhs.location();
- }
-
- typedef NodeRef first_argument_type;
- typedef NodeRef second_argument_type;
- typedef bool result_type;
-
- }; // struct location_less
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_NODE_REF_HPP
diff --git a/contrib/libosmium/osmium/osm/node_ref_list.hpp b/contrib/libosmium/osmium/osm/node_ref_list.hpp
deleted file mode 100644
index c6c4213..0000000
--- a/contrib/libosmium/osmium/osm/node_ref_list.hpp
+++ /dev/null
@@ -1,184 +0,0 @@
-#ifndef OSMIUM_OSM_NODE_REF_LIST_HPP
-#define OSMIUM_OSM_NODE_REF_LIST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <iterator>
-
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/node_ref.hpp>
-
-namespace osmium {
-
- /**
- * A vector of NodeRef objects. Usually this is not instantiated directly,
- * but one of its subclasses are used.
- */
- class NodeRefList : public osmium::memory::Item {
-
- public:
-
- NodeRefList(osmium::item_type itemtype) noexcept :
- osmium::memory::Item(sizeof(NodeRefList), itemtype) {
- }
-
- /**
- * Checks whether the node list is empty.
- */
- bool empty() const noexcept {
- return sizeof(NodeRefList) == byte_size();
- }
-
- /**
- * Returns the number of nodes in the list.
- */
- size_t size() const noexcept {
- auto size_node_refs = byte_size() - sizeof(NodeRefList);
- assert(size_node_refs % sizeof(NodeRef) == 0);
- return size_node_refs / sizeof(NodeRef);
- }
-
- /**
- * Access specified element.
- *
- * @param n Get this element of the list.
- * @pre @code n < size() @endcode
- */
- const NodeRef& operator[](size_t n) const noexcept {
- assert(n < size());
- const NodeRef* node_ref = &*(cbegin());
- return node_ref[n];
- }
-
- /**
- * Access the first element.
- *
- * @pre @code !empty() @endcode
- */
- const NodeRef& front() const noexcept {
- assert(!empty());
- return operator[](0);
- }
-
- /**
- * Access the last element.
- *
- * @pre @code !empty() @endcode
- */
- const NodeRef& back() const noexcept {
- assert(!empty());
- return operator[](size()-1);
- }
-
- /**
- * Checks whether the first and last node in the list have the same ID.
- *
- * @pre @code !empty() @endcode
- */
- bool is_closed() const noexcept {
- return front().ref() == back().ref();
- }
-
- /**
- * Checks whether the first and last node in the list have the same ID.
- *
- * @pre @code !empty() @endcode
- */
- bool ends_have_same_id() const noexcept {
- return front().ref() == back().ref();
- }
-
- /**
- * Checks whether the first and last node in the list have the same
- * location. The ID is not checked.
- *
- * @pre @code !empty() @endcode
- * @pre @code front().location() && back().location() @endcode
- */
- bool ends_have_same_location() const {
- assert(front().location() && back().location());
- return front().location() == back().location();
- }
-
- typedef NodeRef* iterator;
- typedef const NodeRef* const_iterator;
- typedef std::reverse_iterator<const NodeRef*> const_reverse_iterator;
-
- /// Returns an iterator to the beginning.
- iterator begin() noexcept {
- return iterator(data() + sizeof(NodeRefList));
- }
-
- /// Returns an iterator to the end.
- iterator end() noexcept {
- return iterator(data() + byte_size());
- }
-
- /// Returns an iterator to the beginning.
- const_iterator cbegin() const noexcept {
- return const_iterator(data() + sizeof(NodeRefList));
- }
-
- /// Returns an iterator to the end.
- const_iterator cend() const noexcept {
- return const_iterator(data() + byte_size());
- }
-
- /// Returns an iterator to the beginning.
- const_iterator begin() const noexcept {
- return cbegin();
- }
-
- /// Returns an iterator to the end.
- const_iterator end() const noexcept {
- return cend();
- }
-
- /// Returns a reverse_iterator to the beginning.
- const_reverse_iterator crbegin() const noexcept {
- return const_reverse_iterator(cend());
- }
-
- /// Returns a reverse_iterator to the end.
- const_reverse_iterator crend() const noexcept {
- return const_reverse_iterator(cbegin());
- }
-
- }; // class NodeRefList
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_NODE_REF_LIST_HPP
diff --git a/contrib/libosmium/osmium/osm/object.hpp b/contrib/libosmium/osmium/osm/object.hpp
deleted file mode 100644
index c0f46ad..0000000
--- a/contrib/libosmium/osmium/osm/object.hpp
+++ /dev/null
@@ -1,438 +0,0 @@
-#ifndef OSMIUM_OSM_OBJECT_HPP
-#define OSMIUM_OSM_OBJECT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <cstring>
-#include <stdexcept>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/memory/item_iterator.hpp>
-#include <osmium/osm/entity.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/tag.hpp>
-#include <osmium/osm/timestamp.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/types_from_string.hpp>
-
-namespace osmium {
-
- /**
- * OSMObject (Node, Way, Relation, or Area).
- */
- class OSMObject : public osmium::OSMEntity {
-
- object_id_type m_id;
- bool m_deleted : 1;
- object_version_type m_version : 31;
- osmium::Timestamp m_timestamp;
- user_id_type m_uid;
- changeset_id_type m_changeset;
-
- size_t sizeof_object() const noexcept {
- return sizeof(OSMObject) + (type() == item_type::node ? sizeof(osmium::Location) : 0) + sizeof(string_size_type);
- }
-
- unsigned char* user_position() noexcept {
- return data() + sizeof_object() - sizeof(string_size_type);
- }
-
- const unsigned char* user_position() const noexcept {
- return data() + sizeof_object() - sizeof(string_size_type);
- }
-
- string_size_type user_size() const noexcept {
- return *reinterpret_cast<const string_size_type*>(user_position());
- }
-
- unsigned char* subitems_position() {
- return data() + osmium::memory::padded_length(sizeof_object() + user_size());
- }
-
- const unsigned char* subitems_position() const {
- return data() + osmium::memory::padded_length(sizeof_object() + user_size());
- }
-
- protected:
-
- OSMObject(osmium::memory::item_size_type size, osmium::item_type type) :
- OSMEntity(size, type),
- m_id(0),
- m_deleted(false),
- m_version(0),
- m_timestamp(),
- m_uid(0),
- m_changeset(0) {
- }
-
- void set_user_size(string_size_type size) {
- *reinterpret_cast<string_size_type*>(user_position()) = size;
- }
-
- public:
-
- /// Get ID of this object.
- object_id_type id() const noexcept {
- return m_id;
- }
-
- /// Get absolute value of the ID of this object.
- unsigned_object_id_type positive_id() const noexcept {
- return static_cast<unsigned_object_id_type>(std::abs(m_id));
- }
-
- /**
- * Set ID of this object.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_id(object_id_type id) noexcept {
- m_id = id;
- return *this;
- }
-
- /**
- * Set ID of this object.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_id(const char* id) {
- return set_id(osmium::string_to_object_id(id));
- }
-
- /// Is this object marked as deleted?
- bool deleted() const noexcept {
- return m_deleted;
- }
-
- /// Is this object marked visible (ie not deleted)?
- bool visible() const noexcept {
- return !deleted();
- }
-
- /**
- * Mark this object as deleted (or not).
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_deleted(bool deleted) noexcept {
- m_deleted = deleted;
- return *this;
- }
-
- /**
- * Mark this object as visible (ie not deleted) (or not).
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_visible(bool visible) noexcept {
- m_deleted = !visible;
- return *this;
- }
-
- /**
- * Mark this object as visible (ie not deleted) or deleted.
- *
- * @param visible Either "true" or "false"
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_visible(const char* visible) {
- if (!strcmp("true", visible)) {
- set_visible(true);
- } else if (!strcmp("false", visible)) {
- set_visible(false);
- } else {
- throw std::invalid_argument("Unknown value for visible attribute (allowed is 'true' or 'false')");
- }
- return *this;
- }
-
- /// Get version of this object.
- object_version_type version() const noexcept {
- return m_version;
- }
-
- /**
- * Set object version.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_version(object_version_type version) noexcept {
- m_version = version;
- return *this;
- }
-
- /**
- * Set object version.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_version(const char* version) {
- return set_version(string_to_object_version(version));
- }
-
- /// Get changeset id of this object.
- changeset_id_type changeset() const noexcept {
- return m_changeset;
- }
-
- /**
- * Set changeset id of this object.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_changeset(changeset_id_type changeset) noexcept {
- m_changeset = changeset;
- return *this;
- }
-
- /**
- * Set changeset id of this object.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_changeset(const char* changeset) {
- return set_changeset(string_to_changeset_id(changeset));
- }
-
- /// Get user id of this object.
- user_id_type uid() const noexcept {
- return m_uid;
- }
-
- /**
- * Set user id of this object.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_uid(user_id_type uid) noexcept {
- m_uid = uid;
- return *this;
- }
-
- /**
- * Set user id of this object.
- * Sets uid to 0 (anonymous) if the given uid is smaller than 0.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_uid_from_signed(signed_user_id_type uid) noexcept {
- m_uid = uid < 0 ? 0 : static_cast<user_id_type>(uid);
- return *this;
- }
-
- /**
- * Set user id of this object.
- *
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_uid(const char* uid) {
- return set_uid_from_signed(string_to_user_id(uid));
- }
-
- /// Is this user anonymous?
- bool user_is_anonymous() const noexcept {
- return m_uid == 0;
- }
-
- /// Get timestamp when this object last changed.
- osmium::Timestamp timestamp() const noexcept {
- return m_timestamp;
- }
-
- /**
- * Set the timestamp when this object last changed.
- *
- * @param timestamp Timestamp
- * @returns Reference to object to make calls chainable.
- */
- OSMObject& set_timestamp(const osmium::Timestamp& timestamp) noexcept {
- m_timestamp = timestamp;
- return *this;
- }
-
- /// Get user name for this object.
- const char* user() const noexcept {
- return reinterpret_cast<const char*>(data() + sizeof_object());
- }
-
- /// Get the list of tags for this object.
- const TagList& tags() const {
- return osmium::detail::subitem_of_type<const TagList>(cbegin(), cend());
- }
-
- /**
- * Get tag value by key.
- *
- * Convenience function that will forward to same function on TagList
- * object.
- */
- const char* get_value_by_key(const char* key, const char* default_value = nullptr) const noexcept {
- return tags().get_value_by_key(key, default_value);
- }
-
- /**
- * Set named attribute.
- *
- * @param attr Name of the attribute (must be one of "id", "version", "changeset", "timestamp", "uid", "visible")
- * @param value Value of the attribute
- */
- void set_attribute(const char* attr, const char* value) {
- if (!strcmp(attr, "id")) {
- set_id(value);
- } else if (!strcmp(attr, "version")) {
- set_version(value);
- } else if (!strcmp(attr, "changeset")) {
- set_changeset(value);
- } else if (!strcmp(attr, "timestamp")) {
- set_timestamp(osmium::Timestamp(value));
- } else if (!strcmp(attr, "uid")) {
- set_uid(value);
- } else if (!strcmp(attr, "visible")) {
- set_visible(value);
- }
- }
-
- typedef osmium::memory::CollectionIterator<Item> iterator;
- typedef osmium::memory::CollectionIterator<const Item> const_iterator;
-
- iterator begin() {
- return iterator(subitems_position());
- }
-
- iterator end() {
- return iterator(next());
- }
-
- const_iterator cbegin() const {
- return const_iterator(subitems_position());
- }
-
- const_iterator cend() const {
- return const_iterator(next());
- }
-
- const_iterator begin() const {
- return cbegin();
- }
-
- const_iterator end() const {
- return cend();
- }
-
- template <typename T>
- using t_iterator = osmium::memory::ItemIterator<T>;
-
- template <typename T>
- using t_const_iterator = osmium::memory::ItemIterator<const T>;
-
- template <typename T>
- t_iterator<T> begin() {
- return t_iterator<T>(subitems_position(), next());
- }
-
- template <typename T>
- t_iterator<T> end() {
- return t_iterator<T>(next(), next());
- }
-
- template <typename T>
- t_const_iterator<T> cbegin() const {
- return t_const_iterator<T>(subitems_position(), next());
- }
-
- template <typename T>
- t_const_iterator<T> cend() const {
- return t_const_iterator<T>(next(), next());
- }
-
- template <typename T>
- t_const_iterator<T> begin() const {
- return cbegin<T>();
- }
-
- template <typename T>
- t_const_iterator<T> end() const {
- return cend<T>();
- }
-
- }; // class OSMObject
-
- static_assert(sizeof(OSMObject) % osmium::memory::align_bytes == 0, "Class osmium::OSMObject has wrong size to be aligned properly!");
-
- /**
- * OSMObjects are equal if their type, id, and version are equal.
- */
- inline bool operator==(const OSMObject& lhs, const OSMObject& rhs) noexcept {
- return lhs.type() == rhs.type() &&
- lhs.id() == rhs.id() &&
- lhs.version() == rhs.version();
- }
-
- inline bool operator!=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
- return ! (lhs == rhs);
- }
-
- /**
- * OSMObjects can be ordered by type, id and version.
- * Note that we use the absolute value of the id for a
- * better ordering of objects with negative id.
- */
- inline bool operator<(const OSMObject& lhs, const OSMObject& rhs) noexcept {
- if (lhs.type() != rhs.type()) {
- return lhs.type() < rhs.type();
- }
- return (lhs.id() == rhs.id() && lhs.version() < rhs.version()) ||
- lhs.positive_id() < rhs.positive_id();
- }
-
- inline bool operator>(const OSMObject& lhs, const OSMObject& rhs) noexcept {
- return rhs < lhs;
- }
-
- inline bool operator<=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
- return ! (rhs < lhs);
- }
-
- inline bool operator>=(const OSMObject& lhs, const OSMObject& rhs) noexcept {
- return ! (lhs < rhs);
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_OBJECT_HPP
diff --git a/contrib/libosmium/osmium/osm/object_comparisons.hpp b/contrib/libosmium/osmium/osm/object_comparisons.hpp
deleted file mode 100644
index bdf99e1..0000000
--- a/contrib/libosmium/osmium/osm/object_comparisons.hpp
+++ /dev/null
@@ -1,110 +0,0 @@
-#ifndef OSMIUM_OSM_OBJECT_COMPARISONS_HPP
-#define OSMIUM_OSM_OBJECT_COMPARISONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/osm/object.hpp>
-
-namespace osmium {
-
- /**
- * Function object class for comparing OSM objects for equality by type, id, and version.
- */
- struct object_equal_type_id_version {
-
- bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
- return lhs == rhs;
- }
-
- bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
- return *lhs == *rhs;
- }
-
- }; // struct object_equal_type_id_version
-
- /**
- * Function object class for comparing OSM objects for equality by type and id,
- * ignoring the version.
- */
- struct object_equal_type_id {
-
- bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
- return lhs.type() == rhs.type() &&
- lhs.id() == rhs.id();
- }
-
- bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
- return operator()(*lhs, *rhs);
- }
-
- }; // struct object_equal_type_id
-
- /**
- * Function object class for ordering OSM objects by type, id, and version.
- */
- struct object_order_type_id_version {
-
- bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
- return lhs < rhs;
- }
-
- bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
- return *lhs < *rhs;
- }
-
- }; // struct object_order_type_id_version
-
- /**
- * Function object class for ordering OSM objects by type, id, and reverse version,
- * ie objects are ordered by type and id, but later versions of an object are
- * ordered before earlier versions of the same object.
- */
- struct object_order_type_id_reverse_version {
-
- bool operator()(const osmium::OSMObject& lhs, const osmium::OSMObject& rhs) const noexcept {
- if (lhs.type() != rhs.type()) {
- return lhs.type() < rhs.type();
- }
- return (lhs.id() == rhs.id() && lhs.version() > rhs.version()) ||
- lhs.positive_id() < rhs.positive_id();
- }
-
- bool operator()(const osmium::OSMObject* lhs, const osmium::OSMObject* rhs) const noexcept {
- return operator()(*lhs, *rhs);
- }
-
- }; // struct object_order_type_id_reverse_version
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_OBJECT_COMPARISONS_HPP
diff --git a/contrib/libosmium/osmium/osm/relation.hpp b/contrib/libosmium/osmium/osm/relation.hpp
deleted file mode 100644
index 1a8b686..0000000
--- a/contrib/libosmium/osmium/osm/relation.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef OSMIUM_OSM_RELATION_HPP
-#define OSMIUM_OSM_RELATION_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <cstdint>
-#include <cstdlib>
-#include <iterator>
-
-#include <osmium/memory/collection.hpp> // IWYU pragma: keep
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- namespace builder {
- template <typename> class ObjectBuilder;
- class RelationMemberListBuilder;
- }
-
- class RelationMember : public osmium::memory::detail::ItemHelper {
-
- friend class osmium::builder::RelationMemberListBuilder;
-
- object_id_type m_ref;
- item_type m_type;
- uint16_t m_flags;
- string_size_type m_role_size {0};
-
- RelationMember(const RelationMember&) = delete;
- RelationMember(RelationMember&&) = delete;
-
- RelationMember& operator=(const RelationMember&) = delete;
- RelationMember& operator=(RelationMember&&) = delete;
-
- unsigned char* endpos() {
- return data() + osmium::memory::padded_length(sizeof(RelationMember) + m_role_size);
- }
-
- const unsigned char* endpos() const {
- return data() + osmium::memory::padded_length(sizeof(RelationMember) + m_role_size);
- }
-
- template <typename TMember>
- friend class osmium::memory::CollectionIterator;
-
- unsigned char* next() {
- if (full_member()) {
- return endpos() + reinterpret_cast<osmium::memory::Item*>(endpos())->byte_size();
- } else {
- return endpos();
- }
- }
-
- unsigned const char* next() const {
- if (full_member()) {
- return endpos() + reinterpret_cast<const osmium::memory::Item*>(endpos())->byte_size();
- } else {
- return endpos();
- }
- }
-
- void set_role_size(string_size_type size) noexcept {
- m_role_size = size;
- }
-
- public:
-
- static constexpr item_type collection_type = item_type::relation_member_list;
-
- RelationMember(const object_id_type ref = 0, const item_type type = item_type(), const bool full = false) noexcept :
- m_ref(ref),
- m_type(type),
- m_flags(full ? 1 : 0) {
- }
-
- object_id_type ref() const noexcept {
- return m_ref;
- }
-
- RelationMember& ref(object_id_type ref) noexcept {
- m_ref = ref;
- return *this;
- }
-
- unsigned_object_id_type positive_ref() const noexcept {
- 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;
- }
-
- bool full_member() const noexcept {
- return m_flags == 1;
- }
-
- const char* role() const noexcept {
- return reinterpret_cast<const char*>(data() + sizeof(RelationMember));
- }
-
- OSMObject& get_object() {
- return *reinterpret_cast<OSMObject*>(endpos());
- }
-
- const OSMObject& get_object() const {
- return *reinterpret_cast<const OSMObject*>(endpos());
- }
-
- }; // class RelationMember
-
- class RelationMemberList : public osmium::memory::Collection<RelationMember, osmium::item_type::relation_member_list> {
-
- public:
-
- typedef size_t size_type;
-
- RelationMemberList() :
- osmium::memory::Collection<RelationMember, osmium::item_type::relation_member_list>() {
- }
-
- size_type size() const noexcept {
- return static_cast<size_type>(std::distance(begin(), end()));
- }
-
- }; // class RelationMemberList
-
- static_assert(sizeof(RelationMemberList) % osmium::memory::align_bytes == 0, "Class osmium::RelationMemberList has wrong size to be aligned properly!");
-
- class Relation : public OSMObject {
-
- friend class osmium::builder::ObjectBuilder<osmium::Relation>;
-
- Relation() noexcept :
- OSMObject(sizeof(Relation), osmium::item_type::relation) {
- }
-
- public:
-
- static constexpr osmium::item_type itemtype = osmium::item_type::relation;
-
- RelationMemberList& members() {
- return osmium::detail::subitem_of_type<RelationMemberList>(begin(), end());
- }
-
- const RelationMemberList& members() const {
- return osmium::detail::subitem_of_type<const RelationMemberList>(cbegin(), cend());
- }
-
- }; // class Relation
-
- static_assert(sizeof(Relation) % osmium::memory::align_bytes == 0, "Class osmium::Relation has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_RELATION_HPP
diff --git a/contrib/libosmium/osmium/osm/segment.hpp b/contrib/libosmium/osmium/osm/segment.hpp
deleted file mode 100644
index f3a82c9..0000000
--- a/contrib/libosmium/osmium/osm/segment.hpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#ifndef OSMIUM_OSM_SEGMENT_HPP
-#define OSMIUM_OSM_SEGMENT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iosfwd>
-#include <utility>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/util/compatibility.hpp>
-
-namespace osmium {
-
- /**
- * A Segment is the directed connection between two Locations.
- */
- class Segment {
-
- osmium::Location m_first;
- osmium::Location m_second;
-
- public:
-
- explicit constexpr Segment(const osmium::Location& location1, const osmium::Location& location2) noexcept :
- m_first(location1),
- m_second(location2) {
- }
-
- constexpr Segment(const Segment&) = default;
- constexpr Segment(Segment&&) = default;
-
- Segment& operator=(const Segment&) = default;
- Segment& operator=(Segment&&) = default;
-
- ~Segment() = default;
-
- /// Return first Location of Segment.
- OSMIUM_CONSTEXPR osmium::Location first() const noexcept {
- return m_first;
- }
-
- /// Return second Location of Segment.
- OSMIUM_CONSTEXPR osmium::Location second() const noexcept {
- return m_second;
- }
-
- protected:
-
- void swap_locations() {
- using std::swap;
- swap(m_first, m_second);
- }
-
- }; // class Segment
-
- /// Segments are equal if both their locations are equal
- inline OSMIUM_CONSTEXPR bool operator==(const Segment& lhs, const Segment& rhs) noexcept {
- return lhs.first() == rhs.first() && lhs.second() == rhs.second();
- }
-
- inline OSMIUM_CONSTEXPR bool operator!=(const Segment& lhs, const Segment& rhs) noexcept {
- return ! (lhs == rhs);
- }
-
- /**
- * Output Segment to a stream.
- */
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::Segment& segment) {
- return out << segment.first() << "->" << segment.second();
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_SEGMENT_HPP
diff --git a/contrib/libosmium/osmium/osm/tag.hpp b/contrib/libosmium/osmium/osm/tag.hpp
deleted file mode 100644
index 30e670d..0000000
--- a/contrib/libosmium/osmium/osm/tag.hpp
+++ /dev/null
@@ -1,140 +0,0 @@
-#ifndef OSMIUM_OSM_TAG_HPP
-#define OSMIUM_OSM_TAG_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <cstring>
-#include <iosfwd>
-#include <iterator>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
- class Tag : public osmium::memory::detail::ItemHelper {
-
- Tag(const Tag&) = delete;
- Tag(Tag&&) = delete;
-
- Tag& operator=(const Tag&) = delete;
- Tag& operator=(Tag&&) = delete;
-
- template <typename TMember>
- friend class osmium::memory::CollectionIterator;
-
- static unsigned char* after_null(unsigned char* ptr) {
- return reinterpret_cast<unsigned char*>(std::strchr(reinterpret_cast<char*>(ptr), 0) + 1);
- }
-
- static const unsigned char* after_null(const unsigned char* ptr) {
- return reinterpret_cast<const unsigned char*>(std::strchr(reinterpret_cast<const char*>(ptr), 0) + 1);
- }
-
- unsigned char* next() {
- return after_null(after_null(data()));
- }
-
- const unsigned char* next() const {
- return after_null(after_null(data()));
- }
-
- public:
-
- static constexpr item_type collection_type = item_type::tag_list;
-
- const char* key() const noexcept {
- return reinterpret_cast<const char*>(data());
- }
-
- const char* value() const {
- return reinterpret_cast<const char*>(after_null(data()));
- }
-
- }; // class Tag
-
- inline bool operator==(const Tag& a, const Tag& b) {
- return !std::strcmp(a.key(), b.key()) && !strcmp(a.value(), b.value());
- }
-
- inline bool operator<(const Tag& a, const Tag& b) {
- return (!std::strcmp(a.key(), b.key()) && (std::strcmp(a.value(), b.value()) < 0)) || (std::strcmp(a.key(), b.key()) < 0);
- }
-
- /**
- * Output a Tag to a stream.
- */
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const Tag& tag) {
- return out << tag.key() << '=' << tag.value();
- }
-
- class TagList : public osmium::memory::Collection<Tag, osmium::item_type::tag_list> {
-
- public:
-
- typedef size_t size_type;
-
- TagList() :
- osmium::memory::Collection<Tag, osmium::item_type::tag_list>() {
- }
-
- size_type size() const noexcept {
- return static_cast<size_type>(std::distance(begin(), end()));
- }
-
- const char* get_value_by_key(const char* key, const char* default_value = nullptr) const noexcept {
- auto result = std::find_if(cbegin(), cend(), [key](const Tag& tag) {
- return !strcmp(tag.key(), key);
- });
- if (result == cend()) {
- return default_value;
- } else {
- return result->value();
- }
- }
-
- const char* operator[](const char* key) const noexcept {
- return get_value_by_key(key);
- }
-
- }; // class TagList
-
- static_assert(sizeof(TagList) % osmium::memory::align_bytes == 0, "Class osmium::TagList has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TAG_HPP
diff --git a/contrib/libosmium/osmium/osm/timestamp.hpp b/contrib/libosmium/osmium/osm/timestamp.hpp
deleted file mode 100644
index 2145fcb..0000000
--- a/contrib/libosmium/osmium/osm/timestamp.hpp
+++ /dev/null
@@ -1,193 +0,0 @@
-#ifndef OSMIUM_OSM_TIMESTAMP_HPP
-#define OSMIUM_OSM_TIMESTAMP_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <ctime>
-#include <iosfwd>
-#include <limits>
-#include <stdexcept>
-#include <string>
-
-#include <osmium/util/compatibility.hpp>
-#include <osmium/util/minmax.hpp> // IWYU pragma: keep
-
-namespace osmium {
-
- /**
- * A timestamp. Internal representation is an unsigned 32bit integer
- * holding seconds since epoch, so this will overflow in 2038.
- */
- class Timestamp {
-
- // length of ISO timestamp string yyyy-mm-ddThh:mm:ssZ\0
- static constexpr int timestamp_length = 20 + 1;
-
- /**
- * The timestamp format for OSM timestamps in strftime(3) format.
- * This is the ISO-Format yyyy-mm-ddThh:mm:ssZ
- */
- static const char* timestamp_format() {
- static const char f[timestamp_length] = "%Y-%m-%dT%H:%M:%SZ";
- return f;
- }
-
- uint32_t m_timestamp;
-
- public:
-
- constexpr Timestamp() noexcept :
- m_timestamp(0) {
- }
-
- // Not "explicit" so that conversions from time_t work
- // like in node.timestamp(123);
- constexpr Timestamp(time_t timestamp) noexcept :
- m_timestamp(static_cast<uint32_t>(timestamp)) {
- }
-
- /**
- * Returns true if this timestamp is valid (ie set to something other
- * than 0).
- */
- bool valid() const noexcept {
- return m_timestamp != 0;
- }
-
- /**
- * Construct timestamp from ISO date/time string.
- * Throws std::invalid_argument, if the timestamp can not be parsed.
- */
- explicit Timestamp(const char* timestamp) {
-#ifndef _WIN32
- struct tm tm {
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
- };
- if (strptime(timestamp, timestamp_format(), &tm) == nullptr) {
- throw std::invalid_argument("can't parse timestamp");
- }
- m_timestamp = static_cast<uint32_t>(timegm(&tm));
-#else
- struct tm tm;
- int n = sscanf(timestamp, "%4d-%2d-%2dT%2d:%2d:%2dZ", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec);
- if (n != 6) {
- throw std::invalid_argument("can't parse timestamp");
- }
- tm.tm_year -= 1900;
- tm.tm_mon--;
- tm.tm_wday = 0;
- tm.tm_yday = 0;
- tm.tm_isdst = 0;
- m_timestamp = static_cast<uint32_t>(_mkgmtime(&tm));
-#endif
- }
-
- constexpr time_t seconds_since_epoch() const noexcept {
- return static_cast<time_t>(m_timestamp);
- }
-
- constexpr operator time_t() const noexcept {
- return static_cast<time_t>(m_timestamp);
- }
-
- explicit constexpr operator uint32_t() const noexcept {
- return m_timestamp;
- }
-
- template <typename T>
- void operator+=(T time_difference) noexcept {
- m_timestamp += time_difference;
- }
-
- template <typename T>
- void operator-=(T time_difference) noexcept {
- m_timestamp -= time_difference;
- }
-
- /**
- * Return UTC Unix time as string in ISO date/time format.
- */
- std::string to_iso() const {
- std::string s;
-
- if (m_timestamp != 0) {
- struct tm tm;
- time_t sse = seconds_since_epoch();
-#ifndef _MSC_VER
- gmtime_r(&sse, &tm);
-#else
- gmtime_s(&tm, &sse);
-#endif
-
- s.resize(timestamp_length);
- /* This const_cast is ok, because we know we have enough space
- in the string for the format we are using (well at least until
- the year will have 5 digits). And by setting the size
- afterwards from the result of strftime we make sure thats set
- right, too. */
- s.resize(strftime(const_cast<char*>(s.c_str()), timestamp_length, timestamp_format(), &tm));
- }
-
- return s;
- }
-
- }; // class Timestamp
-
- inline OSMIUM_CONSTEXPR Timestamp start_of_time() noexcept {
- return Timestamp(1);
- }
-
- inline OSMIUM_CONSTEXPR Timestamp end_of_time() noexcept {
- return Timestamp(std::numeric_limits<time_t>::max());
- }
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, Timestamp timestamp) {
- out << timestamp.to_iso();
- 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
diff --git a/contrib/libosmium/osmium/osm/types.hpp b/contrib/libosmium/osmium/osm/types.hpp
deleted file mode 100644
index e4250d9..0000000
--- a/contrib/libosmium/osmium/osm/types.hpp
+++ /dev/null
@@ -1,66 +0,0 @@
-#ifndef OSMIUM_OSM_TYPES_HPP
-#define OSMIUM_OSM_TYPES_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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>
-
-namespace osmium {
-
- /*
- * The following typedefs are chosen so that they can represent all needed
- * numbers and still be reasonably space efficient. As the OSM database
- * needs 64 bit IDs for nodes, this size is used for all object IDs.
- */
- typedef int64_t object_id_type; ///< Type for OSM object (node, way, or relation) IDs.
- typedef uint64_t unsigned_object_id_type; ///< Type for OSM object (node, way, or relation) IDs where we only allow positive IDs.
- typedef uint32_t object_version_type; ///< Type for OSM object version number.
- typedef uint32_t changeset_id_type; ///< Type for OSM changeset IDs.
- typedef uint32_t user_id_type; ///< Type for OSM user IDs.
- typedef int32_t signed_user_id_type; ///< Type for signed OSM user IDs.
- typedef uint32_t num_changes_type; ///< Type for changeset num_changes.
- typedef uint32_t num_comments_type; ///< Type for changeset num_comments.
-
- /**
- * Size for strings in OSM data such as user names, tag keys, roles, etc.
- * In Osmium they can be up to 2^16 bytes long, but OSM usually has lower
- * defined limits.
- */
- typedef uint16_t string_size_type;
-
- // maximum of 256 characters of max 4 bytes each (in UTF-8 encoding)
- constexpr const int max_osm_string_length = 256 * 4;
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TYPES_HPP
diff --git a/contrib/libosmium/osmium/osm/types_from_string.hpp b/contrib/libosmium/osmium/osm/types_from_string.hpp
deleted file mode 100644
index b0e22a7..0000000
--- a/contrib/libosmium/osmium/osm/types_from_string.hpp
+++ /dev/null
@@ -1,122 +0,0 @@
-#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 at 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>
-#include <osmium/util/cast.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 unsigned 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_with_assert<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_with_assert<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_with_assert<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_with_assert<num_changes_type>(detail::string_to_ulong(input, "value for num changes"));
- }
-
- inline num_comments_type string_to_num_comments(const char* input) {
- assert(input);
- return static_cast_with_assert<num_comments_type>(detail::string_to_ulong(input, "value for num comments"));
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_TYPES_FROM_STRING_HPP
diff --git a/contrib/libosmium/osmium/osm/undirected_segment.hpp b/contrib/libosmium/osmium/osm/undirected_segment.hpp
deleted file mode 100644
index 654ef7d..0000000
--- a/contrib/libosmium/osmium/osm/undirected_segment.hpp
+++ /dev/null
@@ -1,100 +0,0 @@
-#ifndef OSMIUM_OSM_UNDIRECTED_SEGMENT_HPP
-#define OSMIUM_OSM_UNDIRECTED_SEGMENT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iosfwd>
-
-#include <osmium/osm/location.hpp>
-#include <osmium/osm/segment.hpp>
-
-namespace osmium {
-
- /**
- * Undirected connection between two Locations. The first Location is
- * always equal or "smaller" than the second Location, ie to the left
- * and down.
- */
- class UndirectedSegment : public Segment {
-
- public:
-
- explicit UndirectedSegment(const osmium::Location& location1, const osmium::Location& location2) :
- Segment(location1, location2) {
- if (location2 < location1) {
- swap_locations();
- }
- }
-
- UndirectedSegment(const UndirectedSegment&) = default;
- UndirectedSegment(UndirectedSegment&&) = default;
-
- UndirectedSegment& operator=(const UndirectedSegment&) = default;
- UndirectedSegment& operator=(UndirectedSegment&&) = default;
-
- ~UndirectedSegment() = default;
-
- }; // class UndirectedSegment
-
- /**
- * UndirectedSegments are "smaller" if they are to the left and down of another
- * segment. The first() location is checked first() and only if they have the
- * same first() location the second() location is taken into account.
- */
- inline bool operator<(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
- return (lhs.first() == rhs.first() && lhs.second() < rhs.second()) || lhs.first() < rhs.first();
- }
-
- inline bool operator>(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
- return rhs < lhs;
- }
-
- inline bool operator<=(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
- return ! (rhs < lhs);
- }
-
- inline bool operator>=(const UndirectedSegment& lhs, const UndirectedSegment& rhs) noexcept {
- return ! (lhs < rhs);
- }
-
- /**
- * Output UndirectedSegment to a stream.
- */
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const osmium::UndirectedSegment& segment) {
- return out << segment.first() << "--" << segment.second();
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_UNDIRECTED_SEGMENT_HPP
diff --git a/contrib/libosmium/osmium/osm/way.hpp b/contrib/libosmium/osmium/osm/way.hpp
deleted file mode 100644
index 89380e4..0000000
--- a/contrib/libosmium/osmium/osm/way.hpp
+++ /dev/null
@@ -1,117 +0,0 @@
-#ifndef OSMIUM_OSM_WAY_HPP
-#define OSMIUM_OSM_WAY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <osmium/memory/item.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/types.hpp>
-#include <osmium/osm/node_ref.hpp>
-#include <osmium/osm/node_ref_list.hpp>
-
-namespace osmium {
-
- namespace builder {
- template <typename T> class ObjectBuilder;
- }
-
- /**
- * List of node references (id and location) in a way.
- */
- class WayNodeList : public NodeRefList {
-
- public:
-
- static constexpr osmium::item_type itemtype = osmium::item_type::way_node_list;
-
- WayNodeList():
- NodeRefList(itemtype) {
- }
-
- }; // class WayNodeList
-
- static_assert(sizeof(WayNodeList) % osmium::memory::align_bytes == 0, "Class osmium::WayNodeList has wrong size to be aligned properly!");
-
- class Way : public OSMObject {
-
- friend class osmium::builder::ObjectBuilder<osmium::Way>;
-
- Way() noexcept :
- OSMObject(sizeof(Way), osmium::item_type::way) {
- }
-
- public:
-
- WayNodeList& nodes() {
- return osmium::detail::subitem_of_type<WayNodeList>(begin(), end());
- }
-
- const WayNodeList& nodes() const {
- return osmium::detail::subitem_of_type<const WayNodeList>(cbegin(), cend());
- }
-
- /**
- * Update all nodes in a way with the ID of the given NodeRef with the
- * location of the given NodeRef.
- */
- void update_node_location(const NodeRef& new_node_ref) {
- for (auto& node_ref : nodes()) {
- if (node_ref.ref() == new_node_ref.ref()) {
- node_ref.set_location(new_node_ref.location());
- }
- }
- }
-
- /**
- * Do the nodes in this way form a closed ring?
- */
- bool is_closed() const {
- return nodes().is_closed();
- }
-
- bool ends_have_same_id() const {
- return nodes().ends_have_same_id();
- }
-
- bool ends_have_same_location() const {
- return nodes().ends_have_same_location();
- }
-
- }; // class Way
-
- static_assert(sizeof(Way) % osmium::memory::align_bytes == 0, "Class osmium::Way has wrong size to be aligned properly!");
-
-} // namespace osmium
-
-#endif // OSMIUM_OSM_WAY_HPP
diff --git a/contrib/libosmium/osmium/relations/collector.hpp b/contrib/libosmium/osmium/relations/collector.hpp
deleted file mode 100644
index e7f76a2..0000000
--- a/contrib/libosmium/osmium/relations/collector.hpp
+++ /dev/null
@@ -1,544 +0,0 @@
-#ifndef OSMIUM_RELATIONS_COLLECTOR_HPP
-#define OSMIUM_RELATIONS_COLLECTOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <functional>
-#include <iomanip>
-//#include <iostream>
-#include <vector>
-
-#include <osmium/fwd.hpp>
-#include <osmium/osm/item_type.hpp>
-#include <osmium/osm/object.hpp>
-#include <osmium/osm/relation.hpp> // IWYU pragma: keep
-#include <osmium/osm/types.hpp>
-#include <osmium/handler.hpp>
-#include <osmium/memory/buffer.hpp>
-#include <osmium/visitor.hpp>
-
-#include <osmium/relations/detail/relation_meta.hpp>
-#include <osmium/relations/detail/member_meta.hpp>
-
-namespace osmium {
-
- /**
- * @brief Code related to the assembly of OSM relations
- */
- namespace relations {
-
- /**
- * The Collector class collects members of a relation. This is a generic
- * base class that can be used to assemble all kinds of relations. It has numerous
- * hooks you can implement in derived classes to customize its behaviour.
- *
- * The collector provides two handlers (HandlerPass1 and HandlerPass2) for a first
- * and second pass through an input file, respectively. In the first pass all
- * relations we are interested in are stored in RelationMeta objects in the
- * m_relations vector. All members we are interested in are stored in MemberMeta
- * objects in the m_member_meta vectors.
- * The MemberMeta objects also store the information where the relations containing
- * those members are to be found.
- *
- * Later the m_member_meta vectors are sorted according to the
- * member ids so that a binary search (with std::equal_range) can be used in the second
- * pass to find the parent relations for each node, way, or relation coming along.
- * The member objects are stored together with their relation and once a relation
- * is complete the complete_relation() method is called which you must overwrite in
- * a derived class of Collector.
- *
- * @tparam TCollector Derived class of this class.
- *
- * @tparam TNodes Are we interested in member nodes?
- *
- * @tparam TWays Are we interested in member ways?
- *
- * @tparam TRelations Are we interested in member relations?
- */
- template <typename TCollector, bool TNodes, bool TWays, bool TRelations>
- class Collector {
-
- /**
- * This is the handler class for the first pass of the Collector.
- */
- class HandlerPass1 : public osmium::handler::Handler {
-
- TCollector& m_collector;
-
- public:
-
- HandlerPass1(TCollector& collector) noexcept :
- m_collector(collector) {
- }
-
- void relation(const osmium::Relation& relation) {
- if (m_collector.keep_relation(relation)) {
- m_collector.add_relation(relation);
- }
- }
-
- }; // class HandlerPass1
-
- public:
-
- /**
- * This is the handler class for the second pass of the Collector.
- */
- class HandlerPass2 : public osmium::handler::Handler {
-
- TCollector& m_collector;
-
- /**
- * This variable is initialized with the number of different
- * kinds of OSM objects we are interested in. If we only need
- * way members (for instance for the multipolygon collector)
- * it is intialized with 1 for instance. If node and way
- * members are needed, it is initialized with 2.
- *
- * In the after_* methods of this handler, it is decremented
- * and once it reaches 0, we know we have all members available
- * that we are ever going to get.
- */
- int m_want_types;
-
- /**
- * Find this object in the member vectors and add it to all
- * relations that need it.
- *
- * @returns true if the member was added to at least one
- * relation and false otherwise
- */
- bool find_and_add_object(const osmium::OSMObject& object) {
- auto& mmv = m_collector.member_meta(object.type());
- auto range = std::equal_range(mmv.begin(), mmv.end(), MemberMeta(object.id()));
-
- if (osmium::relations::count_not_removed(range.first, range.second) == 0) {
- // nothing found
- return false;
- }
-
- {
- m_collector.members_buffer().add_item(object);
- const size_t member_offset = m_collector.members_buffer().commit();
-
- for (auto it = range.first; it != range.second; ++it) {
- it->set_buffer_offset(member_offset);
- }
- }
-
- for (auto it = range.first; it != range.second; ++it) {
- MemberMeta& member_meta = *it;
- if (member_meta.removed()) {
- break;
- }
- assert(member_meta.member_id() == object.id());
- assert(member_meta.relation_pos() < m_collector.m_relations.size());
- RelationMeta& relation_meta = m_collector.m_relations[member_meta.relation_pos()];
-// std::cerr << " => " << member_meta.member_pos() << " < " << m_collector.get_relation(relation_meta).members().size() << " (id=" << m_collector.get_relation(relation_meta).id() << ")\n";
- assert(member_meta.member_pos() < m_collector.get_relation(relation_meta).members().size());
-// std::cerr << " add way " << member_meta.member_id() << " to rel " << m_collector.get_relation(relation_meta).id() << " at pos " << member_meta.member_pos() << "\n";
- relation_meta.got_one_member();
- if (relation_meta.has_all_members()) {
- const size_t relation_offset = member_meta.relation_pos();
- m_collector.complete_relation(relation_meta);
- m_collector.m_relations[relation_offset] = RelationMeta();
- m_collector.possibly_purge_removed_members();
- }
- }
-
- // Remove MemberMetas that were marked as removed.
- mmv.erase(std::remove_if(mmv.begin(), mmv.end(), [](MemberMeta& mm) {
- return mm.removed();
- }), mmv.end());
-
- return true;
- }
-
- public:
-
- HandlerPass2(TCollector& collector) noexcept :
- m_collector(collector),
- m_want_types((TNodes?1:0) + (TWays?1:0) + (TRelations?1:0)) {
- }
-
- void node(const osmium::Node& node) {
- if (TNodes) {
- if (! find_and_add_object(node)) {
- m_collector.node_not_in_any_relation(node);
- }
- }
- }
-
- void way(const osmium::Way& way) {
- if (TWays) {
- if (! find_and_add_object(way)) {
- m_collector.way_not_in_any_relation(way);
- }
- }
- }
-
- void relation(const osmium::Relation& relation) {
- if (TRelations) {
- if (! find_and_add_object(relation)) {
- m_collector.relation_not_in_any_relation(relation);
- }
- }
- }
-
- void flush() {
- m_collector.flush();
- }
-
- }; // class HandlerPass2
-
- HandlerPass2 m_handler_pass2;
-
- // All relations we are interested in will be kept in this buffer
- osmium::memory::Buffer m_relations_buffer;
-
- // All members we are interested in will be kept in this buffer
- osmium::memory::Buffer m_members_buffer;
-
- /// Vector with all relations we are interested in
- std::vector<RelationMeta> m_relations;
-
- /**
- * One vector each for nodes, ways, and relations containing all
- * mappings from member ids to their relations.
- */
- std::vector<MemberMeta> m_member_meta[3];
-
- int m_count_complete = 0;
-
- typedef std::function<void(osmium::memory::Buffer&&)> callback_func_type;
- callback_func_type m_callback;
-
- static constexpr size_t initial_buffer_size = 1024 * 1024;
-
- public:
-
- /**
- * Create an Collector.
- */
- Collector() :
- m_handler_pass2(*static_cast<TCollector*>(this)),
- m_relations_buffer(initial_buffer_size, osmium::memory::Buffer::auto_grow::yes),
- m_members_buffer(initial_buffer_size, osmium::memory::Buffer::auto_grow::yes),
- m_relations(),
- m_member_meta() {
- }
-
- protected:
-
- std::vector<MemberMeta>& member_meta(const item_type type) {
- return m_member_meta[static_cast<uint16_t>(type) - 1];
- }
-
- callback_func_type callback() {
- return m_callback;
- }
-
- const std::vector<RelationMeta>& relations() const {
- return m_relations;
- }
-
- /**
- * This method is called from the first pass handler for every
- * relation in the input, to check whether it should be kept.
- *
- * Overwrite this method in a child class to only add relations
- * you are interested in, for instance depending on the type tag.
- * Storing relations takes a lot of memory, so it makes sense to
- * filter this as much as possible.
- */
- bool keep_relation(const osmium::Relation& /*relation*/) const {
- return true;
- }
-
- /**
- * This method is called for every member of every relation that
- * should be kept. It should decide if the member is interesting or
- * not and return true or false to signal that. Only interesting
- * members are later added to the relation.
- *
- * Overwrite this method in a child class. In the MultiPolygonCollector
- * this is for instance used to only keep members of type way and
- * ignore all others.
- */
- bool keep_member(const osmium::relations::RelationMeta& /*relation_meta*/, const osmium::RelationMember& /*member*/) const {
- return true;
- }
-
- /**
- * This method is called for all nodes that are not a member of
- * any relation.
- *
- * Overwrite this method in a child class if you are interested
- * in this.
- */
- void node_not_in_any_relation(const osmium::Node& /*node*/) {
- }
-
- /**
- * This method is called for all ways that are not a member of
- * any relation.
- *
- * Overwrite this method in a child class if you are interested
- * in this.
- */
- void way_not_in_any_relation(const osmium::Way& /*way*/) {
- }
-
- /**
- * This method is called for all relations that are not a member of
- * any relation.
- *
- * Overwrite this method in a child class if you are interested
- * in this.
- */
- void relation_not_in_any_relation(const osmium::Relation& /*relation*/) {
- }
-
- /**
- * This method is called from the 2nd pass handler when all objects
- * of types we are interested in have been seen.
- *
- * Overwrite this method in a child class if you are interested
- * in this.
- *
- * Note that even after this call members might be missing if they
- * were not in the input file! The derived class has to handle this
- * case.
- */
- void flush() {
- }
-
- /**
- * This removes all relations that have already been assembled
- * from the m_relations vector.
- */
- void clean_assembled_relations() {
- m_relations.erase(
- std::remove_if(m_relations.begin(), m_relations.end(), has_all_members()),
- m_relations.end()
- );
- }
-
- const osmium::Relation& get_relation(size_t offset) const {
- return m_relations_buffer.get<osmium::Relation>(offset);
- }
-
- /**
- * Get the relation from a relation_meta.
- */
- const osmium::Relation& get_relation(const RelationMeta& relation_meta) const {
- return get_relation(relation_meta.relation_offset());
- }
-
- osmium::OSMObject& get_member(size_t offset) const {
- return m_members_buffer.get<osmium::OSMObject>(offset);
- }
-
- /**
- * Tell the Collector that you are interested in this relation
- * and want it kept until all members have been assembled and
- * it is handed back to you.
- *
- * The relation is copied and stored in a buffer inside the
- * collector.
- */
- void add_relation(const osmium::Relation& relation) {
- const size_t offset = m_relations_buffer.committed();
- m_relations_buffer.add_item(relation);
-
- RelationMeta relation_meta(offset);
-
- int n = 0;
- for (auto& member : m_relations_buffer.get<osmium::Relation>(offset).members()) {
- if (static_cast<TCollector*>(this)->keep_member(relation_meta, member)) {
- member_meta(member.type()).emplace_back(member.ref(), m_relations.size(), n);
- relation_meta.increment_need_members();
- } else {
- member.ref(0); // set member id to zero to indicate we are not interested
- }
- ++n;
- }
-
- assert(offset == m_relations_buffer.committed());
- if (relation_meta.has_all_members()) {
- m_relations_buffer.rollback();
- } else {
- m_relations_buffer.commit();
- m_relations.push_back(std::move(relation_meta));
-// std::cerr << "added relation id=" << relation.id() << "\n";
- }
- }
-
- /**
- * Sort the vectors with the member infos so that we can do binary
- * search on them.
- */
- void sort_member_meta() {
-/* std::cerr << "relations: " << m_relations.size() << "\n";
- std::cerr << "node members: " << m_member_meta[0].size() << "\n";
- std::cerr << "way members: " << m_member_meta[1].size() << "\n";
- std::cerr << "relation members: " << m_member_meta[2].size() << "\n";*/
- std::sort(m_member_meta[0].begin(), m_member_meta[0].end());
- std::sort(m_member_meta[1].begin(), m_member_meta[1].end());
- std::sort(m_member_meta[2].begin(), m_member_meta[2].end());
- }
-
- public:
-
- uint64_t used_memory() const {
- const uint64_t nmembers = m_member_meta[0].capacity() + m_member_meta[1].capacity() + m_member_meta[2].capacity();
- const uint64_t members = nmembers * sizeof(MemberMeta);
- const uint64_t relations = m_relations.capacity() * sizeof(RelationMeta);
- const uint64_t relations_buffer_capacity = m_relations_buffer.capacity();
- const uint64_t members_buffer_capacity = m_members_buffer.capacity();
-
- std::cout << " nR = m_relations.capacity() ........... = " << std::setw(12) << m_relations.capacity() << "\n";
- std::cout << " nMN = m_member_meta[NODE].capacity() ... = " << std::setw(12) << m_member_meta[0].capacity() << "\n";
- std::cout << " nMW = m_member_meta[WAY].capacity() .... = " << std::setw(12) << m_member_meta[1].capacity() << "\n";
- std::cout << " nMR = m_member_meta[RELATION].capacity() = " << std::setw(12) << m_member_meta[2].capacity() << "\n";
- std::cout << " nM = m_member_meta[*].capacity() ...... = " << std::setw(12) << nmembers << "\n";
-
- std::cout << " sRM = sizeof(RelationMeta) ............. = " << std::setw(12) << sizeof(RelationMeta) << "\n";
- std::cout << " sMM = sizeof(MemberMeta) ............... = " << std::setw(12) << sizeof(MemberMeta) << "\n\n";
-
- std::cout << " nR * sRM ............................... = " << std::setw(12) << relations << "\n";
- std::cout << " nM * sMM ............................... = " << std::setw(12) << members << "\n";
- std::cout << " relations_buffer_capacity .............. = " << std::setw(12) << relations_buffer_capacity << "\n";
- std::cout << " members_buffer_capacity ................ = " << std::setw(12) << members_buffer_capacity << "\n";
-
- const uint64_t total = relations + members + relations_buffer_capacity + members_buffer_capacity;
-
- std::cout << " total .................................. = " << std::setw(12) << total << "\n";
- std::cout << " =======================================================\n";
-
- return relations_buffer_capacity + members_buffer_capacity + relations + members;
- }
-
- /**
- * Return reference to second pass handler.
- */
- HandlerPass2& handler(const callback_func_type& callback = nullptr) {
- m_callback = callback;
- return m_handler_pass2;
- }
-
- osmium::memory::Buffer& members_buffer() {
- return m_members_buffer;
- }
-
- size_t get_offset(osmium::item_type type, osmium::object_id_type id) {
- const auto& mmv = member_meta(type);
- const auto range = std::equal_range(mmv.cbegin(), mmv.cend(), MemberMeta(id));
- assert(range.first != range.second);
- return range.first->buffer_offset();
- }
-
- template <typename TIter>
- void read_relations(TIter begin, TIter end) {
- HandlerPass1 handler(*static_cast<TCollector*>(this));
- osmium::apply(begin, end, handler);
- sort_member_meta();
- }
-
- template <typename TSource>
- void read_relations(TSource& source) {
- read_relations(std::begin(source), std::end(source));
- source.close();
- }
-
- void moving_in_buffer(size_t old_offset, size_t new_offset) {
- const osmium::OSMObject& object = m_members_buffer.get<osmium::OSMObject>(old_offset);
- auto& mmv = member_meta(object.type());
- auto range = std::equal_range(mmv.begin(), mmv.end(), osmium::relations::MemberMeta(object.id()));
- for (auto it = range.first; it != range.second; ++it) {
- assert(it->buffer_offset() == old_offset);
- it->set_buffer_offset(new_offset);
- }
- }
-
- /**
- * Decide whether to purge removed members and then do it.
- *
- * Currently the purging is done every thousand calls.
- * This could probably be improved upon.
- */
- void possibly_purge_removed_members() {
- ++m_count_complete;
- if (m_count_complete > 10000) { // XXX
-// const size_t size_before = m_members_buffer.committed();
- m_members_buffer.purge_removed(this);
-/*
- const size_t size_after = m_members_buffer.committed();
- double percent = static_cast<double>(size_before - size_after);
- percent /= size_before;
- percent *= 100;
- std::cerr << "PURGE (size before=" << size_before << " after=" << size_after << " purged=" << (size_before - size_after) << " / " << static_cast<int>(percent) << "%)\n";
-*/
- m_count_complete = 0;
- }
- }
-
- /**
- * Get a vector with pointers to all Relations that could not
- * be completed, because members were missing in the input
- * data.
- *
- * Note that these pointers point into memory allocated and
- * owned by the Collector object.
- */
- std::vector<const osmium::Relation*> get_incomplete_relations() const {
- std::vector<const osmium::Relation*> relations;
- for (const auto& relation_meta : m_relations) {
- if (!relation_meta.has_all_members()) {
- relations.push_back(&get_relation(relation_meta));
- }
- }
- return relations;
- }
-
- }; // class Collector
-
- } // namespace relations
-
-} // namespace osmium
-
-#endif // OSMIUM_RELATIONS_COLLECTOR_HPP
diff --git a/contrib/libosmium/osmium/relations/detail/member_meta.hpp b/contrib/libosmium/osmium/relations/detail/member_meta.hpp
deleted file mode 100644
index ea86734..0000000
--- a/contrib/libosmium/osmium/relations/detail/member_meta.hpp
+++ /dev/null
@@ -1,158 +0,0 @@
-#ifndef OSMIUM_RELATIONS_DETAIL_MEMBER_META_HPP
-#define OSMIUM_RELATIONS_DETAIL_MEMBER_META_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cstddef>
-#include <iosfwd>
-#include <iterator>
-
-#include <osmium/osm/types.hpp>
-
-namespace osmium {
-
- namespace relations {
-
- /**
- * Helper class for the Collector class.
- *
- * Stores an object ID and information where the object should be
- * stored.
- */
- class MemberMeta {
-
- /**
- * Object ID of this relation member. Can be a node, way, or relation ID.
- * It depends on the vector in which this object is stored which kind of
- * object is referenced here.
- */
- osmium::object_id_type m_member_id;
-
- /**
- * Position of the relation this member is a part of in the
- * m_relations vector.
- */
- size_t m_relation_pos;
-
- /**
- * Position of this member in the list of members of the
- * relation this member is a part of.
- */
- size_t m_member_pos;
-
- /**
- * Offset in the buffer where the object is stored.
- */
- size_t m_buffer_offset { 0 };
-
- bool m_removed = false;
-
- public:
-
- /**
- * Create new MemberMeta. The variant with zeros for relation_pos and
- * member_pos is used to create dummy MemberMeta that can be compared
- * to the MemberMeta in the vectors using the equal_range algorithm.
- */
- explicit MemberMeta(osmium::object_id_type member_id, size_t relation_pos=0, size_t member_pos=0) noexcept :
- m_member_id(member_id),
- m_relation_pos(relation_pos),
- m_member_pos(member_pos) {
- }
-
- osmium::object_id_type member_id() const noexcept {
- return m_member_id;
- }
-
- size_t relation_pos() const noexcept {
- return m_relation_pos;
- }
-
- size_t member_pos() const noexcept {
- return m_member_pos;
- }
-
- size_t buffer_offset() const noexcept {
- return m_buffer_offset;
- }
-
- void set_buffer_offset(size_t offset) noexcept {
- m_buffer_offset = offset;
- }
-
- bool removed() const noexcept {
- return m_removed;
- }
-
- void remove() noexcept {
- m_removed = true;
- }
-
- }; // class MemberMeta
-
- /**
- * Compares two MemberMeta objects by only looking at the member id.
- * Used to sort a vector of MemberMeta objects and to later find
- * them using binary search.
- */
- inline bool operator<(const MemberMeta& a, const MemberMeta& b) noexcept {
- return a.member_id() < b.member_id();
- }
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const MemberMeta& mm) {
- out << "MemberMeta(member_id=" << mm.member_id() << " relation_pos=" << mm.relation_pos() << " member_pos=" << mm.member_pos() << " buffer_offset=" << mm.buffer_offset() << ")";
- return out;
- }
-
- /**
- * Count the number of MemberMeta objects in the iterator range
- * that are not marked as removed.
- *
- * @tparam TIter Iterator that dereferences to a MemberMeta
- * @param begin Begin of iterator range
- * @param end End of iterator range
- */
- template <typename TIter>
- inline typename std::iterator_traits<TIter>::difference_type count_not_removed(TIter begin, TIter end) {
- return std::count_if(begin, end, [](MemberMeta& mm) {
- return !mm.removed();
- });
- }
-
- } // namespace relations
-
-} // namespace osmium
-
-#endif // OSMIUM_RELATIONS_DETAIL_MEMBER_META_HPP
diff --git a/contrib/libosmium/osmium/relations/detail/relation_meta.hpp b/contrib/libosmium/osmium/relations/detail/relation_meta.hpp
deleted file mode 100644
index a48c50a..0000000
--- a/contrib/libosmium/osmium/relations/detail/relation_meta.hpp
+++ /dev/null
@@ -1,136 +0,0 @@
-#ifndef OSMIUM_RELATIONS_DETAIL_RELATION_META_HPP
-#define OSMIUM_RELATIONS_DETAIL_RELATION_META_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstddef>
-#include <iosfwd>
-
-namespace osmium {
-
- namespace relations {
-
- /**
- * Helper class for the Collector class.
- *
- * Stores information needed to collect all members of a relation. This
- * includes the offset of the relation in a buffer plus the information
- * needed to add members to this relation.
- */
- class RelationMeta {
-
- /// The relation we are assembling.
- size_t m_relation_offset;
-
- /**
- * The number of members still needed before the relation is
- * complete. This will be set to the number of members we are
- * interested in and then count down for every member we find.
- * When it is 0, the relation is complete.
- */
- int m_need_members = 0;
-
- public:
-
- /**
- * Initialize an empty RelationMeta. This is needed to zero out
- * relations that have been completed.
- */
- RelationMeta() noexcept :
- m_relation_offset(0) {
- }
-
- explicit RelationMeta(size_t relation_offset) noexcept :
- m_relation_offset(relation_offset) {
- }
-
- /**
- * Get offset of relation in buffer.
- */
- size_t relation_offset() const noexcept {
- return m_relation_offset;
- }
-
- /**
- * Increment the m_need_members counter.
- */
- void increment_need_members() noexcept {
- ++m_need_members;
- }
-
- /**
- * This decrements the "members needed" counter.
- */
- void got_one_member() {
- assert(m_need_members > 0);
- --m_need_members;
- }
-
- /**
- * Returns true if all members for this relation are available.
- */
- bool has_all_members() const noexcept {
- return m_need_members == 0;
- }
-
- }; // class RelationMeta
-
- template <typename TChar, typename TTraits>
- inline std::basic_ostream<TChar, TTraits>& operator<<(std::basic_ostream<TChar, TTraits>& out, const RelationMeta& rm) {
- out << "RelationMeta(relation_offset=" << rm.relation_offset() << " has_all_members=" << rm.has_all_members() << ")";
- return out;
- }
-
- /**
- * Function object to check if a relation is complete.
- */
- struct has_all_members {
-
- typedef RelationMeta& argument_type;
- typedef bool result_type;
-
- /**
- * @returns true if this relation is complete, false otherwise.
- */
- bool operator()(RelationMeta& relation_info) const {
- return relation_info.has_all_members();
- }
-
- }; // struct has_all_members
-
- } // namespace relations
-
-} // namespace osmium
-
-#endif // OSMIUM_RELATIONS_DETAIL_RELATION_META_HPP
diff --git a/contrib/libosmium/osmium/tags/filter.hpp b/contrib/libosmium/osmium/tags/filter.hpp
deleted file mode 100644
index 0d3fc4e..0000000
--- a/contrib/libosmium/osmium/tags/filter.hpp
+++ /dev/null
@@ -1,162 +0,0 @@
-#ifndef OSMIUM_TAGS_FILTER_HPP
-#define OSMIUM_TAGS_FILTER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-#include <type_traits>
-#include <vector>
-
-#include <boost/iterator/filter_iterator.hpp>
-
-#include <osmium/memory/collection.hpp>
-#include <osmium/osm/tag.hpp>
-
-namespace osmium {
-
- namespace tags {
-
- template <typename TKey>
- struct match_key {
- bool operator()(const TKey& rule_key, const char* tag_key) {
- return rule_key == tag_key;
- }
- }; // struct match_key
-
- struct match_key_prefix {
- bool operator()(const std::string& rule_key, const char* tag_key) {
- return rule_key.compare(0, std::string::npos, tag_key, 0, rule_key.size()) == 0;
- }
- }; // struct match_key_prefix
-
- template <typename TValue>
- struct match_value {
- bool operator()(const TValue& rule_value, const char* tag_value) {
- return rule_value == tag_value;
- }
- }; // struct match_value
-
- template <>
- struct match_value<void> {
- bool operator()(const bool, const char*) {
- return true;
- }
- }; // struct match_value<void>
-
- template <typename TKey, typename TValue=void, typename TKeyComp=match_key<TKey>, typename TValueComp=match_value<TValue>>
- class Filter {
-
- typedef TKey key_type;
- typedef typename std::conditional<std::is_void<TValue>::value, bool, TValue>::type value_type;
-
- struct Rule {
- key_type key;
- value_type value;
- bool ignore_value;
- bool result;
-
- explicit Rule(bool r, bool ignore, const key_type& k, const value_type& v) :
- key(k),
- value(v),
- ignore_value(ignore),
- result(r) {
- }
-
- explicit Rule(bool r, bool ignore, const key_type& k) :
- key(k),
- value(),
- ignore_value(ignore),
- result(r) {
- }
-
- }; // struct Rule
-
- std::vector<Rule> m_rules;
- bool m_default_result;
-
- public:
-
- typedef Filter<TKey, TValue, TKeyComp, TValueComp> filter_type;
- typedef const osmium::Tag& argument_type;
- typedef bool result_type;
- typedef boost::filter_iterator<filter_type, osmium::TagList::const_iterator> iterator;
-
- explicit Filter(bool default_result = false) :
- m_default_result(default_result) {
- }
-
- template <typename V=TValue, typename std::enable_if<!std::is_void<V>::value, int>::type = 0>
- Filter& add(bool result, const key_type& key, const value_type& value) {
- m_rules.emplace_back(result, false, key, value);
- return *this;
- }
-
- Filter& add(bool result, const key_type& key) {
- m_rules.emplace_back(result, true, key);
- return *this;
- }
-
- bool operator()(const osmium::Tag& tag) const {
- for (const Rule& rule : m_rules) {
- if (TKeyComp()(rule.key, tag.key()) && (rule.ignore_value || TValueComp()(rule.value, tag.value()))) {
- return rule.result;
- }
- }
- return m_default_result;
- }
-
- /**
- * Return the number of rules in this filter.
- */
- size_t count() const {
- return m_rules.count();
- }
-
- /**
- * Is this filter empty, ie are there no rules defined?
- */
- bool empty() const {
- return m_rules.empty();
- }
-
- }; // class Filter
-
- typedef Filter<std::string, std::string> KeyValueFilter;
- typedef Filter<std::string> KeyFilter;
- typedef Filter<std::string, void, match_key_prefix> KeyPrefixFilter;
-
- } // namespace tags
-
-} // namespace osmium
-
-#endif // OSMIUM_TAGS_FILTER_HPP
diff --git a/contrib/libosmium/osmium/tags/regex_filter.hpp b/contrib/libosmium/osmium/tags/regex_filter.hpp
deleted file mode 100644
index 725c423..0000000
--- a/contrib/libosmium/osmium/tags/regex_filter.hpp
+++ /dev/null
@@ -1,58 +0,0 @@
-#ifndef OSMIUM_TAGS_REGEX_FILTER_HPP
-#define OSMIUM_TAGS_REGEX_FILTER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <regex>
-#include <string>
-
-#include <osmium/tags/filter.hpp>
-
-namespace osmium {
-
- namespace tags {
-
- template <>
- struct match_value<std::regex> {
- bool operator()(const std::regex& rule_value, const char* tag_value) {
- return std::regex_match(tag_value, rule_value);
- }
- }; // struct match_value<std::regex>
-
- typedef Filter<std::string, std::regex> RegexFilter;
-
- } // namespace tags
-
-} // namespace osmium
-
-#endif // OSMIUM_TAGS_REGEX_FILTER_HPP
diff --git a/contrib/libosmium/osmium/tags/taglist.hpp b/contrib/libosmium/osmium/tags/taglist.hpp
deleted file mode 100644
index 8fc9c68..0000000
--- a/contrib/libosmium/osmium/tags/taglist.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef OSMIUM_TAGS_TAGLIST_HPP
-#define OSMIUM_TAGS_TAGLIST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <utility>
-
-#include <osmium/osm/tag.hpp>
-
-namespace osmium {
-
- /**
- * @brief Code related to working with OSM tags
- */
- namespace tags {
-
- template <typename TFilter>
- inline bool match_any_of(const osmium::TagList& tag_list, TFilter&& filter) {
- return std::any_of(tag_list.cbegin(), tag_list.cend(), std::forward<TFilter>(filter));
- }
-
- template <typename TFilter>
- inline bool match_all_of(const osmium::TagList& tag_list, TFilter&& filter) {
- return std::all_of(tag_list.cbegin(), tag_list.cend(), std::forward<TFilter>(filter));
- }
-
- template <typename TFilter>
- inline bool match_none_of(const osmium::TagList& tag_list, TFilter&& filter) {
- return std::none_of(tag_list.cbegin(), tag_list.cend(), std::forward<TFilter>(filter));
- }
-
- } // namespace tags
-
-} // namespace osmium
-
-#endif // OSMIUM_TAGS_TAGLIST_HPP
diff --git a/contrib/libosmium/osmium/thread/function_wrapper.hpp b/contrib/libosmium/osmium/thread/function_wrapper.hpp
deleted file mode 100644
index 95b85d6..0000000
--- a/contrib/libosmium/osmium/thread/function_wrapper.hpp
+++ /dev/null
@@ -1,123 +0,0 @@
-#ifndef OSMIUM_THREAD_FUNCTION_WRAPPER_HPP
-#define OSMIUM_THREAD_FUNCTION_WRAPPER_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <memory>
-
-namespace osmium {
-
- namespace thread {
-
- /**
- * This function wrapper can collect move-only functions unlike
- * std::function which needs copyable functions.
- * Taken from the book "C++ Concurrency in Action".
- */
- class function_wrapper {
-
- struct impl_base {
-
- virtual ~impl_base() = default;
- virtual bool call() {
- return true;
- }
-
- }; // struct impl_base
-
- std::unique_ptr<impl_base> impl;
-
- template <typename F>
- struct impl_type : impl_base {
-
- F m_functor;
-
- impl_type(F&& functor) :
- m_functor(std::forward<F>(functor)) {
- }
-
- bool call() override {
- m_functor();
- return false;
- }
-
- }; // struct impl_type
-
- public:
-
- // Constructor must not be "explicit" for wrapper
- // to work seemlessly.
- template <typename TFunction>
- function_wrapper(TFunction&& f) :
- impl(new impl_type<TFunction>(std::forward<TFunction>(f))) {
- }
-
- // The integer parameter is only used to signal that we want
- // the special function wrapper that makes the worker thread
- // shut down.
- function_wrapper(int) :
- impl(new impl_base()) {
- }
-
- bool operator()() {
- return impl->call();
- }
-
- function_wrapper() = default;
-
- function_wrapper(function_wrapper&& other) :
- impl(std::move(other.impl)) {
- }
-
- function_wrapper& operator=(function_wrapper&& other) {
- impl = std::move(other.impl);
- return *this;
- }
-
- function_wrapper(const function_wrapper&) = delete;
- function_wrapper& operator=(const function_wrapper&) = delete;
-
- ~function_wrapper() = default;
-
- explicit operator bool() const {
- return static_cast<bool>(impl);
- }
-
- }; // class function_wrapper
-
- } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_FUNCTION_WRAPPER_HPP
diff --git a/contrib/libosmium/osmium/thread/pool.hpp b/contrib/libosmium/osmium/thread/pool.hpp
deleted file mode 100644
index dd1023b..0000000
--- a/contrib/libosmium/osmium/thread/pool.hpp
+++ /dev/null
@@ -1,190 +0,0 @@
-#ifndef OSMIUM_THREAD_POOL_HPP
-#define OSMIUM_THREAD_POOL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <atomic>
-#include <cstddef>
-#include <cstdlib>
-#include <future>
-#include <thread>
-#include <type_traits>
-#include <vector>
-
-#include <osmium/thread/function_wrapper.hpp>
-#include <osmium/thread/queue.hpp>
-#include <osmium/thread/util.hpp>
-#include <osmium/util/config.hpp>
-
-namespace osmium {
-
- /**
- * @brief Threading-related low-level code
- */
- namespace thread {
-
- /**
- * Thread pool.
- */
- class Pool {
-
- /**
- * This class makes sure all pool threads will be joined when
- * the pool is destructed.
- */
- class thread_joiner {
-
- std::vector<std::thread>& m_threads;
-
- public:
-
- explicit thread_joiner(std::vector<std::thread>& threads) :
- m_threads(threads) {
- }
-
- ~thread_joiner() {
- for (auto& thread : m_threads) {
- if (thread.joinable()) {
- thread.join();
- }
- }
- }
-
- }; // class thread_joiner
-
- osmium::thread::Queue<function_wrapper> m_work_queue;
- std::vector<std::thread> m_threads;
- thread_joiner m_joiner;
- int m_num_threads;
-
- void worker_thread() {
- osmium::thread::set_thread_name("_osmium_worker");
- while (true) {
- function_wrapper task;
- m_work_queue.wait_and_pop_with_timeout(task);
- if (task) {
- if (task()) {
- // The called tasks returns true only when the
- // worker thread should shut down.
- return;
- }
- }
- }
- }
-
- /**
- * Create thread pool with the given number of threads. If
- * num_threads is 0, the number of threads is read from
- * the environment variable OSMIUM_POOL_THREADS. The default
- * value in that case is -2.
- *
- * If the number of threads is a negative number, it will be
- * set to the actual number of cores on the system plus the
- * given number, ie it will leave a number of cores unused.
- *
- * In all cases the minimum number of threads in the pool is 1.
- */
- explicit Pool(int num_threads, size_t max_queue_size) :
- m_work_queue(max_queue_size, "work"),
- m_threads(),
- m_joiner(m_threads),
- m_num_threads(num_threads) {
-
- if (m_num_threads == 0) {
- m_num_threads = osmium::config::get_pool_threads();
- }
-
- if (m_num_threads <= 0) {
- m_num_threads = std::max(1, static_cast<int>(std::thread::hardware_concurrency()) + m_num_threads);
- }
-
- try {
- for (int i = 0; i < m_num_threads; ++i) {
- m_threads.push_back(std::thread(&Pool::worker_thread, this));
- }
- } catch (...) {
- shutdown_all_workers();
- throw;
- }
- }
-
- public:
-
- static constexpr int default_num_threads = 0;
- static constexpr size_t max_work_queue_size = 10;
-
- static Pool& instance() {
- static Pool pool(default_num_threads, max_work_queue_size);
- return pool;
- }
-
- void shutdown_all_workers() {
- for (int i = 0; i < m_num_threads; ++i) {
- // The special function wrapper makes a worker shut down.
- m_work_queue.push(function_wrapper{0});
- }
- }
-
- ~Pool() {
- shutdown_all_workers();
- m_work_queue.shutdown();
- }
-
- size_t queue_size() const {
- return m_work_queue.size();
- }
-
- bool queue_empty() const {
- return m_work_queue.empty();
- }
-
- template <typename TFunction>
- std::future<typename std::result_of<TFunction()>::type> submit(TFunction&& func) {
-
- typedef typename std::result_of<TFunction()>::type result_type;
-
- std::packaged_task<result_type()> task(std::forward<TFunction>(func));
- std::future<result_type> future_result(task.get_future());
- m_work_queue.push(std::move(task));
-
- return future_result;
- }
-
- }; // class Pool
-
- } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_POOL_HPP
diff --git a/contrib/libosmium/osmium/thread/queue.hpp b/contrib/libosmium/osmium/thread/queue.hpp
deleted file mode 100644
index 76ad9a0..0000000
--- a/contrib/libosmium/osmium/thread/queue.hpp
+++ /dev/null
@@ -1,192 +0,0 @@
-#ifndef OSMIUM_THREAD_QUEUE_HPP
-#define OSMIUM_THREAD_QUEUE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <atomic>
-#include <chrono>
-#include <condition_variable>
-#include <cstddef>
-#include <mutex>
-#include <queue>
-#include <string>
-#include <thread>
-#include <utility> // IWYU pragma: keep (for std::move)
-
-namespace osmium {
-
- namespace thread {
-
- static const std::chrono::milliseconds full_queue_sleep_duration { 10 }; // XXX
-
- /**
- * A thread-safe queue.
- */
- template <typename T>
- class Queue {
-
- /// Maximum size of this queue. If the queue is full pushing to
- /// the queue will block.
- const size_t m_max_size;
-
- /// Name of this queue (for debugging only).
- const std::string m_name;
-
- mutable std::mutex m_mutex;
-
- std::queue<T> m_queue;
-
- /// Used to signal readers when data is available in the queue.
- std::condition_variable m_data_available;
-
- std::atomic<bool> m_done;
-
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
- /// The largest size the queue has been so far.
- size_t m_largest_size;
-
- /// The number of times the queue was full and a thread pushing
- /// to the queue was blocked.
- std::atomic<int> m_full_counter;
-#endif
-
- public:
-
- /**
- * Construct a multithreaded queue.
- *
- * @param max_size Maximum number of elements in the queue. Set to
- * 0 for an unlimited size.
- * @param name Optional name for this queue. (Used for debugging.)
- */
- Queue(size_t max_size = 0, const std::string& name = "") :
- m_max_size(max_size),
- m_name(name),
- m_mutex(),
- m_queue(),
- m_data_available(),
- m_done(false)
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
- ,
- m_largest_size(0),
- m_full_counter(0)
-#endif
- {
- }
-
- ~Queue() {
- shutdown();
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
- std::cerr << "queue '" << m_name << "' with max_size=" << m_max_size << " had largest size " << m_largest_size << " and was full " << m_full_counter << " times\n";
-#endif
- }
-
- /**
- * Push an element onto the queue. If the queue has a max size, this
- * call will block if the queue is full.
- */
- void push(T value) {
- if (m_max_size) {
- while (size() >= m_max_size) {
- std::this_thread::sleep_for(full_queue_sleep_duration);
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
- ++m_full_counter;
-#endif
- }
- }
- std::lock_guard<std::mutex> lock(m_mutex);
- m_queue.push(std::move(value));
-#ifdef OSMIUM_DEBUG_QUEUE_SIZE
- if (m_largest_size < m_queue.size()) {
- m_largest_size = m_queue.size();
- }
-#endif
- m_data_available.notify_one();
- }
-
- void shutdown() {
- m_done = true;
- m_data_available.notify_all();
- }
-
- void wait_and_pop(T& value) {
- std::unique_lock<std::mutex> lock(m_mutex);
- m_data_available.wait(lock, [this] {
- return !m_queue.empty() || m_done;
- });
- if (!m_queue.empty()) {
- value = std::move(m_queue.front());
- m_queue.pop();
- }
- }
-
- void wait_and_pop_with_timeout(T& value) {
- std::unique_lock<std::mutex> lock(m_mutex);
- if (!m_data_available.wait_for(lock, std::chrono::seconds(1), [this] {
- return !m_queue.empty() || m_done;
- })) {
- return;
- }
- if (!m_queue.empty()) {
- value = std::move(m_queue.front());
- m_queue.pop();
- }
- }
-
- bool try_pop(T& value) {
- std::lock_guard<std::mutex> lock(m_mutex);
- if (m_queue.empty()) {
- return false;
- }
- value = std::move(m_queue.front());
- m_queue.pop();
- return true;
- }
-
- bool empty() const {
- std::lock_guard<std::mutex> lock(m_mutex);
- return m_queue.empty();
- }
-
- size_t size() const {
- std::lock_guard<std::mutex> lock(m_mutex);
- return m_queue.size();
- }
-
- }; // class Queue
-
- } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_QUEUE_HPP
diff --git a/contrib/libosmium/osmium/thread/sorted_queue.hpp b/contrib/libosmium/osmium/thread/sorted_queue.hpp
deleted file mode 100644
index e76ade1..0000000
--- a/contrib/libosmium/osmium/thread/sorted_queue.hpp
+++ /dev/null
@@ -1,159 +0,0 @@
-#ifndef OSMIUM_THREAD_SORTED_QUEUE_HPP
-#define OSMIUM_THREAD_SORTED_QUEUE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <condition_variable>
-#include <cstddef>
-#include <deque>
-#include <mutex>
-
-namespace osmium {
-
- namespace thread {
-
- /**
- * This implements a sorted queue. It is a bit like a priority
- * queue. We have n worker threads pushing items into the queue
- * and one thread pulling them out again "in order". The order
- * is defined by the monotonically increasing "num" parameter
- * to the push() method. The wait_and_pop() and try_pop() methods
- * will only give out the next numbered item. This way several
- * workers can work in their own time on different pieces of
- * some incoming data, but it all gets serialized properly again
- * after the workers have done their work.
- */
- template <typename T>
- class SortedQueue {
-
- typedef typename std::deque<T>::size_type size_type;
-
- mutable std::mutex m_mutex;
- std::deque<T> m_queue;
- std::condition_variable m_data_available;
-
- size_type m_offset;
-
- // this method expects that we already have the lock
- bool empty_intern() const {
- return m_queue.front() == T();
- }
-
- public:
-
- SortedQueue() :
- m_mutex(),
- m_queue(1),
- m_data_available(),
- m_offset(0) {
- }
-
- /**
- * Push an item into the queue.
- *
- * @param value The item to push into the queue.
- * @param num Number to describe ordering for the items.
- * It must increase monotonically.
- */
- void push(T value, size_type num) {
- std::lock_guard<std::mutex> lock(m_mutex);
-
- num -= m_offset;
- if (m_queue.size() <= num + 1) {
- m_queue.resize(num + 2);
- }
- m_queue[num] = std::move(value);
-
- m_data_available.notify_one();
- }
-
- /**
- * Wait until the next item becomes available and make it
- * available through value.
- */
- void wait_and_pop(T& value) {
- std::unique_lock<std::mutex> lock(m_mutex);
-
- m_data_available.wait(lock, [this] {
- return !empty_intern();
- });
- value = std::move(m_queue.front());
- m_queue.pop_front();
- ++m_offset;
- }
-
- /**
- * Get next item if it is available and return true. Or
- * return false otherwise.
- */
- bool try_pop(T& value) {
- std::lock_guard<std::mutex> lock(m_mutex);
-
- if (empty_intern()) {
- return false;
- }
- value = std::move(m_queue.front());
- m_queue.pop_front();
- ++m_offset;
- return true;
- }
-
- /**
- * The queue is empty. This means try_pop() would fail if called.
- * It does not mean that there is nothing on the queue. Because
- * the queue is sorted, it could mean that the next item in the
- * queue is not available, but other items are.
- */
- bool empty() const {
- std::lock_guard<std::mutex> lock(m_mutex);
-
- return empty_intern();
- }
-
- /**
- * Returns the number of items in the queue, regardless of whether
- * they can be accessed. If this is =0 it
- * implies empty()==true, but not the other way around.
- */
- size_t size() const {
- std::lock_guard<std::mutex> lock(m_mutex);
- return m_queue.size();
- }
-
- }; // class SortedQueue
-
- } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_SORTED_QUEUE_HPP
diff --git a/contrib/libosmium/osmium/thread/util.hpp b/contrib/libosmium/osmium/thread/util.hpp
deleted file mode 100644
index 00de0d8..0000000
--- a/contrib/libosmium/osmium/thread/util.hpp
+++ /dev/null
@@ -1,116 +0,0 @@
-#ifndef OSMIUM_THREAD_UTIL_HPP
-#define OSMIUM_THREAD_UTIL_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <chrono>
-#include <future>
-
-#ifdef __linux__
-# include <sys/prctl.h>
-#endif
-
-namespace osmium {
-
- namespace thread {
-
- /**
- * Check if the future resulted in an exception. This will re-throw
- * the exception stored in the future if there was one. Otherwise it
- * will just return.
- */
- template <typename T>
- inline void check_for_exception(std::future<T>& future) {
- if (future.valid() && future.wait_for(std::chrono::seconds(0)) == std::future_status::ready) {
- future.get();
- }
- }
-
- /**
- * Wait until the given future becomes ready. Will block if the future
- * is not ready. Can be called more than once unlike future.get().
- */
- template <typename T>
- inline void wait_until_done(std::future<T>& future) {
- if (future.valid()) {
- future.get();
- }
- }
-
- /**
- * Set name of current thread for debugging. This only works on Linux.
- */
-#ifdef __linux__
- inline void set_thread_name(const char* name) noexcept {
- prctl(PR_SET_NAME, name, 0, 0, 0);
- }
-#else
- inline void set_thread_name(const char*) noexcept {
- // intentionally left blank
- }
-#endif
-
- class thread_handler {
-
- std::thread m_thread;
-
- public:
-
- thread_handler() :
- m_thread() {
- }
-
- template <typename TFunction, typename... TArgs>
- thread_handler(TFunction&& f, TArgs&&... args) :
- m_thread(std::forward<TFunction>(f), std::forward<TArgs>(args)...) {
- }
-
- thread_handler(const thread_handler&) = delete;
- thread_handler& operator=(const thread_handler&) = delete;
-
- thread_handler(thread_handler&&) = default;
- thread_handler& operator=(thread_handler&&) = default;
-
- ~thread_handler() {
- if (m_thread.joinable()) {
- m_thread.join();
- }
- }
-
- }; // class thread_handler
-
- } // namespace thread
-
-} // namespace osmium
-
-#endif // OSMIUM_THREAD_UTIL_HPP
diff --git a/contrib/libosmium/osmium/util/cast.hpp b/contrib/libosmium/osmium/util/cast.hpp
deleted file mode 100644
index 4866fde..0000000
--- a/contrib/libosmium/osmium/util/cast.hpp
+++ /dev/null
@@ -1,103 +0,0 @@
-#ifndef OSMIUM_UTIL_CAST_HPP
-#define OSMIUM_UTIL_CAST_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-#ifndef assert
-# include <cassert>
-#endif
-
-#include <cstdint>
-#include <limits>
-#include <type_traits>
-
-namespace osmium {
-
- // These functions are wrappers around static_cast<>() that call assert()
- // to check that there is no integer overflow happening before doing the
- // cast. There are several versions of this templated function here
- // depending on the types of the input and output. In any case, both input
- // and output have to be integral types. If the cast can't overflow, no
- // check is done.
-
- template <typename A, typename B>
- struct are_real_integers :
- std::integral_constant<bool,
- std::is_integral<A>::value &&
- std::is_integral<B>::value &&
- !std::is_same<A, bool>::value &&
- !std::is_same<B, bool>::value> {
- };
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && std::is_same<T, F>::value, int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- return value;
- }
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) > sizeof(F)), int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- return static_cast<T>(value);
- }
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && std::is_signed<T>::value == std::is_signed<F>::value && (sizeof(T) == sizeof(F)), int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- return static_cast<T>(value);
- }
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) < sizeof(F)) && std::is_signed<T>::value && std::is_signed<F>::value, int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- assert(value >= std::numeric_limits<T>::min() && value <= std::numeric_limits<T>::max());
- return static_cast<T>(value);
- }
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) <= sizeof(F)) && std::is_unsigned<T>::value && std::is_signed<F>::value, int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- assert(value >= 0 && static_cast<typename std::make_unsigned<F>::type>(value) <= std::numeric_limits<T>::max());
- return static_cast<T>(value);
- }
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) < sizeof(F)) && std::is_unsigned<T>::value && std::is_unsigned<F>::value, int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- assert(value <= std::numeric_limits<T>::max());
- return static_cast<T>(value);
- }
-
- template <typename T, typename F, typename std::enable_if<are_real_integers<T, F>::value && !std::is_same<T, F>::value && (sizeof(T) <= sizeof(F)) && std::is_signed<T>::value && std::is_unsigned<F>::value, int>::type = 0>
- inline T static_cast_with_assert(const F value) {
- assert(static_cast<int64_t>(value) <= static_cast<int64_t>(std::numeric_limits<T>::max()));
- return static_cast<T>(value);
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_CAST_HPP
diff --git a/contrib/libosmium/osmium/util/compatibility.hpp b/contrib/libosmium/osmium/util/compatibility.hpp
deleted file mode 100644
index 23753ce..0000000
--- a/contrib/libosmium/osmium/util/compatibility.hpp
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef OSMIUM_UTIL_COMPATIBILITY_HPP
-#define OSMIUM_UTIL_COMPATIBILITY_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-// Workarounds for MSVC which doesn't support
-// * constexpr in all cases yet
-// * [[noreturn]]
-#ifdef _MSC_VER
-# define OSMIUM_CONSTEXPR
-# define OSMIUM_NORETURN __declspec(noreturn)
-#else
-# define OSMIUM_CONSTEXPR constexpr
-# define OSMIUM_NORETURN [[noreturn]]
-#endif
-
-// [[deprecated]] is only available in C++14, use this for the time being
-#ifdef __GNUC__
-# define OSMIUM_DEPRECATED __attribute__((deprecated))
-#elif defined(_MSC_VER)
-# define OSMIUM_DEPRECATED __declspec(deprecated)
-#else
-# define OSMIUM_DEPRECATED
-#endif
-
-#endif // OSMIUM_UTIL_COMPATIBILITY_HPP
diff --git a/contrib/libosmium/osmium/util/config.hpp b/contrib/libosmium/osmium/util/config.hpp
deleted file mode 100644
index 3285eed..0000000
--- a/contrib/libosmium/osmium/util/config.hpp
+++ /dev/null
@@ -1,72 +0,0 @@
-#ifndef OSMIUM_UTIL_CONFIG_HPP
-#define OSMIUM_UTIL_CONFIG_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cstdlib>
-#include <cstring>
-
-#ifdef _MSC_VER
-# define strcasecmp _stricmp
-#endif
-
-namespace osmium {
-
- namespace config {
-
- inline int get_pool_threads() {
- const char* env = getenv("OSMIUM_POOL_THREADS");
- if (env) {
- return std::atoi(env);
- }
- return -2;
- }
-
- inline bool use_pool_threads_for_pbf_parsing() {
- const char* env = getenv("OSMIUM_USE_POOL_THREADS_FOR_PBF_PARSING");
- if (env) {
- if (!strcasecmp(env, "off") ||
- !strcasecmp(env, "false") ||
- !strcasecmp(env, "no") ||
- !strcasecmp(env, "0")) {
- return false;
- }
- }
- return true;
- }
-
- } // namespace config
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_CONFIG_HPP
diff --git a/contrib/libosmium/osmium/util/data_file.hpp b/contrib/libosmium/osmium/util/data_file.hpp
deleted file mode 100644
index 53bb81c..0000000
--- a/contrib/libosmium/osmium/util/data_file.hpp
+++ /dev/null
@@ -1,194 +0,0 @@
-#ifndef OSMIUM_UTIL_DATA_FILE_HPP
-#define OSMIUM_UTIL_DATA_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <cstddef>
-#include <cstdio>
-#include <stdexcept>
-#include <string>
-#include <system_error>
-
-#ifdef _WIN32
-# include <io.h>
-# include <windows.h>
-#endif
-
-#include <osmium/util/file.hpp>
-
-namespace osmium {
-
- namespace util {
-
- /**
- * Class wrapper for convenient access to some low-level file
- * functions.
- */
- class DataFile {
-
- FILE* m_file;
-
- public:
-
- /**
- * Create and open a temporary file. It is removed after opening.
- *
- * @throws std::system_error if something went wrong.
- */
- DataFile() :
- m_file(::tmpfile()) {
- if (!m_file) {
- throw std::system_error(errno, std::system_category(), "tmpfile failed");
- }
- }
-
- /**
- * Create and open a temporary file with the specified size. It
- * is removed after opening.
- *
- * @throws std::system_error if something went wrong.
- */
- explicit DataFile(size_t size) :
- DataFile() {
- grow(size);
- }
-
- /**
- * Create and open a named file.
- *
- * @param filename the name of the file
- * @param writable should the file be writable?
- * @throws std::system_error if something went wrong.
- */
- DataFile(const char* filename, bool writable) :
- m_file(::fopen(filename, writable ? "wb+" : "rb" )) {
- if (!m_file) {
- throw std::system_error(errno, std::system_category(), "fopen failed");
- }
- }
-
- /**
- * Create and open a named file.
- *
- * @param filename the name of the file
- * @param writable should the file be writable?
- * @throws std::system_error if something went wrong.
- */
- DataFile(const std::string& filename, bool writable) :
- DataFile(filename.c_str(), writable) {
- }
-
- /**
- * In boolean context the DataFile class returns true if the file
- * is open.
- */
- operator bool() const noexcept {
- return m_file != nullptr;
- }
-
- /**
- * Close the file.
- *
- * Does nothing if the file is already closed.
- *
- * @throws std::system_error if file could not be closed
- */
- void close() {
- if (m_file) {
- if (::fclose(m_file) != 0) {
- throw std::system_error(errno, std::system_category(), "fclose failed");
- }
- m_file = nullptr;
- }
- }
-
- ~DataFile() noexcept {
- try {
- close();
- } catch (std::system_error&) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- /**
- * Get file descriptor of underlying file.
- *
- * @throws std::runtime_errro if file is not open
- * @throws std::system_error if fileno(3) call failed
- */
- int fd() const {
- if (!m_file) {
- throw std::runtime_error("no open file");
- }
-
- int fd = ::fileno(m_file);
-
- if (fd == -1) {
- throw std::system_error(errno, std::system_category(), "fileno failed");
- }
-
- return fd;
- }
-
- /**
- * Ask the operating system for the size of this file.
- *
- * @throws std::system_error if fstat(2) call failed
- */
- size_t size() const {
- return osmium::util::file_size(fd());
- }
-
- /**
- * Grow file to given size.
- *
- * If the file is large enough already, nothing is done.
- * The file is never shrunk.
- *
- * @throws std::system_error if ftruncate(2) call failed
- */
- void grow(size_t new_size) const {
- if (size() < new_size) {
- osmium::util::resize_file(fd(), new_size);
- }
- }
-
- }; // class DataFile
-
- } // namespace util
-
-} // namespace osmium
-
-
-#endif // OSMIUM_UTIL_DATA_FILE_HPP
diff --git a/contrib/libosmium/osmium/util/delta.hpp b/contrib/libosmium/osmium/util/delta.hpp
deleted file mode 100644
index cdf3674..0000000
--- a/contrib/libosmium/osmium/util/delta.hpp
+++ /dev/null
@@ -1,174 +0,0 @@
-#ifndef OSMIUM_UTIL_DELTA_HPP
-#define OSMIUM_UTIL_DELTA_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <iterator>
-#include <type_traits>
-#include <utility>
-
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
- namespace util {
-
- /**
- * Helper class for delta encoding.
- */
- template <typename TValue, typename TDelta = int64_t>
- class DeltaEncode {
-
- static_assert(std::is_integral<TValue>::value,
- "DeltaEncode value type must be some integer");
-
- static_assert(std::is_integral<TDelta>::value && std::is_signed<TDelta>::value,
- "DeltaEncode delta type must be some signed integer");
-
- TValue m_value;
-
- public:
-
- using value_type = TValue;
- using delta_type = TDelta;
-
- DeltaEncode(TValue value = 0) :
- m_value(value) {
- }
-
- void clear() noexcept {
- m_value = 0;
- }
-
- TValue value() const noexcept {
- return m_value;
- }
-
- TDelta update(TValue new_value) noexcept {
- using std::swap;
- swap(m_value, new_value);
- return static_cast_with_assert<TDelta>(m_value) -
- static_cast_with_assert<TDelta>(new_value);
- }
-
- }; // class DeltaEncode
-
- /**
- * Helper class for delta decoding.
- */
- template <typename TValue, typename TDelta = int64_t>
- class DeltaDecode {
-
- static_assert(std::is_integral<TValue>::value,
- "DeltaDecode value type must be some integer");
-
- static_assert(std::is_integral<TDelta>::value && std::is_signed<TDelta>::value,
- "DeltaDecode delta type must be some signed integer");
-
- TValue m_value;
-
- public:
-
- using value_type = TValue;
- using delta_type = TDelta;
-
- DeltaDecode() :
- m_value(0) {
- }
-
- void clear() noexcept {
- m_value = 0;
- }
-
- TValue update(TDelta delta) noexcept {
- m_value = static_cast_with_assert<TValue>(
- static_cast_with_assert<TDelta>(m_value) + delta);
- return m_value;
- }
-
- }; // class DeltaDecode
-
- template <typename TBaseIterator, typename TTransform, typename TValue, typename TDelta = int64_t>
- class DeltaEncodeIterator : public std::iterator<std::input_iterator_tag, TValue> {
-
- TBaseIterator m_it;
- TBaseIterator m_end;
- TTransform m_trans;
- DeltaEncode<TValue, TDelta> m_value;
- TDelta m_delta;
-
- public:
-
- using value_type = TValue;
- using delta_type = TDelta;
-
- DeltaEncodeIterator(TBaseIterator first, TBaseIterator last, TTransform& trans) :
- m_it(first),
- m_end(last),
- m_trans(trans),
- m_value(m_it != m_end ? m_trans(m_it) : 0),
- m_delta(static_cast_with_assert<TDelta>(m_value.value())) {
- }
-
- DeltaEncodeIterator& operator++() {
- if (++m_it != m_end) {
- m_delta = m_value.update(m_trans(m_it));
- }
- return *this;
- }
-
- DeltaEncodeIterator operator++(int) {
- DeltaEncodeIterator tmp(*this);
- operator++();
- return tmp;
- }
-
- TDelta operator*() {
- return m_delta;
- }
-
- bool operator==(const DeltaEncodeIterator& rhs) const {
- return m_it == rhs.m_it && m_end == rhs.m_end;
- }
-
- bool operator!=(const DeltaEncodeIterator& rhs) const {
- return !(*this == rhs);
- }
-
- }; // class DeltaEncodeIterator
-
- } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_DELTA_HPP
diff --git a/contrib/libosmium/osmium/util/double.hpp b/contrib/libosmium/osmium/util/double.hpp
deleted file mode 100644
index 85a2508..0000000
--- a/contrib/libosmium/osmium/util/double.hpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#ifndef OSMIUM_UTIL_DOUBLE_HPP
-#define OSMIUM_UTIL_DOUBLE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <algorithm>
-#include <cassert>
-#include <cmath>
-#include <cstdio>
-#include <iterator>
-#include <string>
-
-namespace osmium {
-
- namespace util {
-
- constexpr int max_double_length = 20; // should fit any double
-
- /**
- * Write double to iterator, removing superfluous '0' characters at
- * the end. The decimal dot will also be removed if necessary.
- *
- * @tparam T iterator type
- * @param iterator output iterator
- * @param value the value that should be written
- * @param precision max number of digits after the decimal point (must be <= 17)
- */
- template <typename T>
- inline T double2string(T iterator, double value, int precision) {
- assert(precision <= 17);
-
- char buffer[max_double_length];
-
-#ifndef _MSC_VER
- int len = snprintf(buffer, max_double_length, "%.*f", precision, value);
-#else
- int len = _snprintf(buffer, max_double_length, "%.*f", precision, value);
-#endif
- assert(len > 0 && len < max_double_length);
-
- while (buffer[len-1] == '0') --len;
- if (buffer[len-1] == '.') --len;
-
- return std::copy_n(buffer, len, iterator);
- }
-
- /**
- * Write double to string, removing superfluous '0' characters at
- * the end. The decimal dot will also be removed if necessary.
- *
- * @param out string
- * @param value the value that should be written
- * @param precision max number of digits after the decimal point
- */
- inline void double2string(std::string& out, double value, int precision) {
- double2string(std::back_inserter(out), value, precision);
- }
-
- } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_DOUBLE_HPP
diff --git a/contrib/libosmium/osmium/util/endian.hpp b/contrib/libosmium/osmium/util/endian.hpp
deleted file mode 100644
index a5d9154..0000000
--- a/contrib/libosmium/osmium/util/endian.hpp
+++ /dev/null
@@ -1,45 +0,0 @@
-#ifndef OSMIUM_UTIL_ENDIAN_HPP
-#define OSMIUM_UTIL_ENDIAN_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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.
-
-*/
-
-// Windows is only available for little endian architectures
-// http://stackoverflow.com/questions/6449468/can-i-safely-assume-that-windows-installations-will-always-be-little-endian
-#if !defined(_WIN32) && !defined(__APPLE__)
-# include <endian.h>
-#else
-# define __LITTLE_ENDIAN 1234
-# define __BYTE_ORDER __LITTLE_ENDIAN
-#endif
-
-#endif // OSMIUM_UTIL_ENDIAN_HPP
diff --git a/contrib/libosmium/osmium/util/file.hpp b/contrib/libosmium/osmium/util/file.hpp
deleted file mode 100644
index 39e01af..0000000
--- a/contrib/libosmium/osmium/util/file.hpp
+++ /dev/null
@@ -1,121 +0,0 @@
-#ifndef OSMIUM_UTIL_FILE_HPP
-#define OSMIUM_UTIL_FILE_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <cstddef>
-#include <cstdio>
-#include <system_error>
-#include <sys/stat.h>
-#include <sys/types.h>
-
-#ifdef _WIN32
-# include <io.h>
-# include <windows.h>
-#endif
-
-#ifndef _MSC_VER
-# include <unistd.h>
-#else
-// https://msdn.microsoft.com/en-us/library/whx354w1.aspx
-# define ftruncate _chsize_s
-#endif
-
-#include <osmium/util/cast.hpp>
-
-namespace osmium {
-
- namespace util {
-
- /**
- * Get file size.
- * This is a small wrapper around a system call.
- *
- * @param fd File descriptor
- * @returns file size
- * @throws std::system_error If system call failed
- */
- inline size_t file_size(int fd) {
-#ifdef _MSC_VER
- // Windows implementation
- // https://msdn.microsoft.com/en-us/library/dfbc2kec.aspx
- auto size = ::_filelengthi64(fd);
- if (size == -1L) {
- throw std::system_error(errno, std::system_category(), "_filelengthi64 failed");
- }
- return size_t(size);
-#else
- // Unix implementation
- struct stat s;
- if (::fstat(fd, &s) != 0) {
- throw std::system_error(errno, std::system_category(), "fstat failed");
- }
- return size_t(s.st_size);
-#endif
- }
-
- /**
- * Resize file.
- * Small wrapper around ftruncate(2) system call.
- *
- * @param fd File descriptor
- * @param new_size New size
- * @throws std::system_error If ftruncate(2) call failed
- */
- inline void resize_file(int fd, size_t new_size) {
- if (::ftruncate(fd, static_cast_with_assert<off_t>(new_size)) != 0) {
- throw std::system_error(errno, std::system_category(), "ftruncate failed");
- }
- }
-
- /**
- * Get the page size for this system.
- */
- inline size_t get_pagesize() {
-#ifdef _WIN32
- // Windows implementation
- SYSTEM_INFO si;
- GetSystemInfo(&si);
- return si.dwPageSize;
-#else
- // Unix implementation
- return size_t(::sysconf(_SC_PAGESIZE));
-#endif
- }
-
- } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_FILE_HPP
diff --git a/contrib/libosmium/osmium/util/memory_mapping.hpp b/contrib/libosmium/osmium/util/memory_mapping.hpp
deleted file mode 100644
index d5a057d..0000000
--- a/contrib/libosmium/osmium/util/memory_mapping.hpp
+++ /dev/null
@@ -1,757 +0,0 @@
-#ifndef OSMIUM_UTIL_MEMORY_MAPPING_HPP
-#define OSMIUM_UTIL_MEMORY_MAPPING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <cerrno>
-#include <stdexcept>
-#include <system_error>
-
-#include <osmium/util/file.hpp>
-
-#ifndef _WIN32
-# include <sys/mman.h>
-#else
-# include <fcntl.h>
-# include <io.h>
-# include <windows.h>
-# include <sys/types.h>
-#endif
-
-namespace osmium {
-
- namespace util {
-
- /**
- * Class for wrapping memory mapping system calls.
- *
- * Usage for anonymous mapping:
- * @code
- * MemoryMapping mapping(1024); // create anonymous mapping with size
- * auto ptr = mapping.get_addr<char*>(); // get pointer to memory
- * mapping.unmap(); // release mapping by calling unmap() (or at end of scope)
- * @endcode
- *
- * Or for file-backed mapping:
- * @code
- * int fd = ::open(...);
- * {
- * MemoryMapping mapping(1024, MemoryMapping::mapping_mode::write_shared, fd, offset);
- * // use mapping
- * }
- * ::close(fd);
- * @endcode
- *
- * If the file backing a file-backed mapping is not large enough, it
- * will be resized. This works, of course, only for writable files,
- * so for read-only files you have to make sure they are large enough
- * for any mapping you want.
- *
- * If you ask for a zero-sized mapping, a mapping of the systems page
- * size will be created instead. For file-backed mapping this will only
- * work if the file is writable.
- *
- * There are different implementations for Unix and Windows systems.
- * On Unix systems this wraps the mmap(), munmap(), and the mremap()
- * system calls. On Windows it wraps the CreateFileMapping(),
- * CloseHandle(), MapViewOfFile(), and UnmapViewOfFile() functions.
- *
- * On Windows the file will be set to binary mode before the memory
- * mapping.
- */
- class MemoryMapping {
-
-public:
- enum class mapping_mode {
- readonly = 0,
- write_private = 1,
- write_shared = 2
- };
-
-private:
-
- /// The size of the mapping
- size_t m_size;
-
- /// Offset into the file
- off_t m_offset;
-
- /// File handle we got the mapping from
- int m_fd;
-
- /// Mapping mode
- mapping_mode m_mapping_mode;
-
-#ifdef _WIN32
- HANDLE m_handle;
-#endif
-
- /// The address where the memory is mapped
- void* m_addr;
-
- bool is_valid() const noexcept;
-
- void make_invalid() noexcept;
-
-#ifdef _WIN32
- typedef DWORD flag_type;
-#else
- typedef int flag_type;
-#endif
-
- flag_type get_protection() const noexcept;
-
- flag_type get_flags() const noexcept;
-
- // A zero-sized mapping is not allowed by the operating system.
- // So if the user asks for a mapping of size 0, we map a full
- // page instead. This way we don't have a special case in the rest
- // of the code.
- static size_t initial_size(size_t size) {
- if (size == 0) {
- return osmium::util::get_pagesize();
- }
- return size;
- }
-
-#ifdef _WIN32
- HANDLE get_handle() const noexcept;
- HANDLE osmium::util::MemoryMapping::create_file_mapping() const noexcept;
- void* osmium::util::MemoryMapping::map_view_of_file() const noexcept;
-#endif
-
- int resize_fd(int fd) {
- // Anonymous mapping doesn't need resizing.
- if (fd == -1) {
- return -1;
- }
-
- // Make sure the file backing this mapping is large enough.
- if (osmium::util::file_size(fd) < m_size + m_offset) {
- osmium::util::resize_file(fd, m_size + m_offset);
- }
- return fd;
- }
-
- public:
-
- /**
- * Create memory mapping of given size.
- *
- * If fd is not set (or fd == -1), an anonymous mapping will be
- * created, otherwise a mapping based on the file descriptor will
- * be created.
- *
- * @pre size > 0 or mode == write_shared oder write_private
- *
- * @param size Size of the mapping in bytes
- * @param mode Mapping mode: readonly, or writable (shared or private)
- * @param fd Open file descriptor of a file we want to map
- * @param offset Offset into the file where the mapping should start
- * @throws std::system_error if the mapping fails
- */
- MemoryMapping(size_t size, mapping_mode mode, int fd=-1, off_t offset=0);
-
- /// DEPRECATED: For backwards compatibility
- MemoryMapping(size_t size, bool writable=true, int fd=-1, off_t offset=0) :
- MemoryMapping(size, writable ? mapping_mode::write_shared : mapping_mode::readonly, fd, offset) {
- }
-
- /// You can not copy construct a MemoryMapping.
- MemoryMapping(const MemoryMapping&) = delete;
-
- /// You can not copy a MemoryMapping.
- MemoryMapping& operator=(const MemoryMapping&) = delete;
-
- /**
- * Move construct a mapping from another one. The other mapping
- * will be marked as invalid.
- */
- MemoryMapping(MemoryMapping&& other);
-
- /**
- * Move a mapping. The other mapping will be marked as invalid.
- */
- MemoryMapping& operator=(MemoryMapping&& other);
-
- /**
- * Releases the mapping by calling unmap(). Will never throw.
- * Call unmap() instead if you want to be notified of any error.
- */
- ~MemoryMapping() noexcept {
- try {
- unmap();
- } catch (std::system_error&) {
- // Ignore any exceptions because destructor must not throw.
- }
- }
-
- /**
- * Unmap a mapping. If the mapping is not valid, it will do
- * nothing.
- *
- * @throws std::system_error if the unmapping fails
- */
- void unmap();
-
- /**
- * Resize a mapping to the given new size.
- *
- * On Linux systems this will use the mremap() function. On other
- * systems it will unmap and remap the memory. This can only be
- * done for file-based mappings, not anonymous mappings!
- *
- * @param new_size Number of bytes to resize to
- * @throws std::system_error if the remapping fails
- */
- void resize(size_t new_size);
-
- /**
- * In a boolean context a MemoryMapping is true when it is a valid
- * existing mapping.
- */
- operator bool() const noexcept {
- return is_valid();
- }
-
- /**
- * The number of bytes mapped. This is the same size you created
- * the mapping with. The actual mapping will probably be larger
- * because the system will round it to the page size.
- */
- size_t size() const noexcept {
- return m_size;
- }
-
- /**
- * The file descriptor this mapping was created from.
- *
- * @returns file descriptor, -1 for anonymous mappings
- */
- int fd() const noexcept {
- return m_fd;
- }
-
- /**
- * Was this mapping created as a writable mapping?
- */
- bool writable() const noexcept {
- return m_mapping_mode != mapping_mode::readonly;
- }
-
- /**
- * Get the address of the mapping as any pointer type you like.
- *
- * @throws std::runtime_error if the mapping is invalid
- */
- template <typename T = void>
- T* get_addr() const {
- if (is_valid()) {
- return reinterpret_cast<T*>(m_addr);
- }
- throw std::runtime_error("invalid memory mapping");
- }
-
- }; // class MemoryMapping
-
- /**
- * Anonymous memory mapping.
- *
- * Usage for anonymous mapping:
- * @code
- * AnonymousMemoryMapping mapping(1024); // create anonymous mapping with size
- * auto ptr = mapping.get_addr<char*>(); // get pointer to memory
- * mapping.unmap(); // release mapping by calling unmap() (or at end of scope)
- * @endcode
- */
- class AnonymousMemoryMapping : public MemoryMapping {
-
- public:
-
- AnonymousMemoryMapping(size_t size) :
- MemoryMapping(size, mapping_mode::write_private) {
- }
-
-#ifndef __linux__
- /**
- * On systems other than Linux anonymous mappings can not be
- * resized!
- */
- void resize(size_t) = delete;
-#endif
-
- }; // class AnonymousMemoryMapping
-
- /**
- * A thin wrapper around the MemoryMapping class used when all the
- * data in the mapped memory is of the same type. Instead of thinking
- * about the number of bytes mapped, this counts sizes in the number
- * of objects of that type.
- *
- * Note that no effort is made to actually initialize the objects in
- * this memory. This has to be done by the caller!
- */
- template <typename T>
- class TypedMemoryMapping {
-
- MemoryMapping m_mapping;
-
- public:
-
- /**
- * Create anonymous typed memory mapping of given size.
- *
- * @param size Number of objects of type T to be mapped
- * @throws std::system_error if the mapping fails
- */
- TypedMemoryMapping(size_t size) :
- m_mapping(sizeof(T) * size, MemoryMapping::mapping_mode::write_private) {
- }
-
- /**
- * Create file-backed memory mapping of given size. The file must
- * contain at least `sizeof(T) * size` bytes!
- *
- * @param size Number of objects of type T to be mapped
- * @param mode Mapping mode: readonly, or writable (shared or private)
- * @param fd Open file descriptor of a file we want to map
- * @param offset Offset into the file where the mapping should start
- * @throws std::system_error if the mapping fails
- */
- TypedMemoryMapping(size_t size, MemoryMapping::mapping_mode mode, int fd, off_t offset = 0) :
- m_mapping(sizeof(T) * size, mode, fd, sizeof(T) * offset) {
- }
-
- /// DEPRECATED: For backwards compatibility
- TypedMemoryMapping(size_t size, bool writable, int fd, off_t offset = 0) :
- m_mapping(sizeof(T) * size, writable ? MemoryMapping::mapping_mode::write_shared : MemoryMapping::mapping_mode::readonly, fd, sizeof(T) * offset) {
- }
-
- /// You can not copy construct a TypedMemoryMapping.
- TypedMemoryMapping(const TypedMemoryMapping&) = delete;
-
- /// You can not copy a MemoryMapping.
- TypedMemoryMapping& operator=(const TypedMemoryMapping&) = delete;
-
- /**
- * Move construct a mapping from another one. The other mapping
- * will be marked as invalid.
- */
- TypedMemoryMapping(TypedMemoryMapping&& other) = default;
-
- /**
- * Move a mapping. The other mapping will be marked as invalid.
- */
- TypedMemoryMapping& operator=(TypedMemoryMapping&& other) = default;
-
- /**
- * Releases the mapping by calling unmap(). Will never throw.
- * Call unmap() instead if you want to be notified of any error.
- */
- ~TypedMemoryMapping() noexcept = default;
-
- /**
- * Unmap a mapping. If the mapping is not valid, it will do
- * nothing.
- *
- * @throws std::system_error if the unmapping fails
- */
- void unmap() {
- m_mapping.unmap();
- }
-
- /**
- * Resize a mapping to the given new size.
- *
- * On Linux systems this will use the mremap() function. On other
- * systems it will unmap and remap the memory. This can only be
- * done for file-based mappings, not anonymous mappings!
- *
- * @param new_size Number of objects of type T to resize to
- * @throws std::system_error if the remapping fails
- */
- void resize(size_t new_size) {
- m_mapping.resize(sizeof(T) * new_size);
- }
-
- /**
- * In a boolean context a TypedMemoryMapping is true when it is
- * a valid existing mapping.
- */
- operator bool() const noexcept {
- return !!m_mapping;
- }
-
- /**
- * The number of objects of class T mapped. This is the same size
- * you created the mapping with. The actual mapping will probably
- * be larger because the system will round it to the page size.
- */
- size_t size() const noexcept {
- assert(m_mapping.size() % sizeof(T) == 0);
- return m_mapping.size() / sizeof(T);
- }
-
- /**
- * The file descriptor this mapping was created from.
- *
- * @returns file descriptor, -1 for anonymous mappings
- */
- int fd() const noexcept {
- return m_mapping.fd();
- }
-
- /**
- * Was this mapping created as a writable mapping?
- */
- bool writable() const noexcept {
- return m_mapping.writable();
- }
-
- /**
- * Get the address of the beginning of the mapping.
- *
- * @throws std::runtime_error if the mapping is invalid
- */
- T* begin() {
- return m_mapping.get_addr<T>();
- }
-
- /**
- * Get the address one past the end of the mapping.
- *
- * @throws std::runtime_error if the mapping is invalid
- */
- T* end() {
- return m_mapping.get_addr<T>() + size();
- }
-
- const T* cbegin() const {
- return m_mapping.get_addr<T>();
- }
-
- const T* cend() const {
- return m_mapping.get_addr<T>() + size();
- }
-
- const T* begin() const {
- return m_mapping.get_addr<T>();
- }
-
- const T* end() const {
- return m_mapping.get_addr<T>() + size();
- }
-
- }; // class TypedMemoryMapping
-
- template <typename T>
- class AnonymousTypedMemoryMapping : public TypedMemoryMapping<T> {
-
- public:
-
- AnonymousTypedMemoryMapping(size_t size) :
- TypedMemoryMapping<T>(size) {
- }
-
-#ifndef __linux__
- /**
- * On systems other than Linux anonymous mappings can not be
- * resized!
- */
- void resize(size_t) = delete;
-#endif
-
- }; // class AnonymousTypedMemoryMapping
-
- } // namespace util
-
-} // namespace osmium
-
-#ifndef _WIN32
-
-// =========== Unix implementation =============
-
-// MAP_FAILED is often a macro containing an old style cast
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wold-style-cast"
-
-inline bool osmium::util::MemoryMapping::is_valid() const noexcept {
- return m_addr != MAP_FAILED;
-}
-
-inline void osmium::util::MemoryMapping::make_invalid() noexcept {
- m_addr = MAP_FAILED;
-}
-
-#pragma GCC diagnostic pop
-
-// for BSD systems
-#ifndef MAP_ANONYMOUS
-# define MAP_ANONYMOUS MAP_ANON
-#endif
-
-inline int osmium::util::MemoryMapping::get_protection() const noexcept {
- if (m_mapping_mode == mapping_mode::readonly) {
- return PROT_READ;
- }
- return PROT_READ | PROT_WRITE;
-}
-
-inline int osmium::util::MemoryMapping::get_flags() const noexcept {
- if (m_fd == -1) {
- return MAP_PRIVATE | MAP_ANONYMOUS;
- }
- if (m_mapping_mode == mapping_mode::write_shared) {
- return MAP_SHARED;
- }
- return MAP_PRIVATE;
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(size_t size, mapping_mode mode, int fd, off_t offset) :
- m_size(initial_size(size)),
- m_offset(offset),
- m_fd(resize_fd(fd)),
- m_mapping_mode(mode),
- m_addr(::mmap(nullptr, m_size, get_protection(), get_flags(), m_fd, m_offset)) {
- assert(!(fd == -1 && mode == mapping_mode::readonly));
- if (!is_valid()) {
- throw std::system_error(errno, std::system_category(), "mmap failed");
- }
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(MemoryMapping&& other) :
- m_size(other.m_size),
- m_offset(other.m_offset),
- m_fd(other.m_fd),
- m_mapping_mode(other.m_mapping_mode),
- m_addr(other.m_addr) {
- other.make_invalid();
-}
-
-inline osmium::util::MemoryMapping& osmium::util::MemoryMapping::operator=(osmium::util::MemoryMapping&& other) {
- unmap();
- m_size = other.m_size;
- m_offset = other.m_offset;
- m_fd = other.m_fd;
- m_mapping_mode = other.m_mapping_mode;
- m_addr = other.m_addr;
- other.make_invalid();
- return *this;
-}
-
-inline void osmium::util::MemoryMapping::unmap() {
- if (is_valid()) {
- if (::munmap(m_addr, m_size) != 0) {
- throw std::system_error(errno, std::system_category(), "munmap failed");
- }
- make_invalid();
- }
-}
-
-inline void osmium::util::MemoryMapping::resize(size_t new_size) {
- assert(new_size > 0 && "can not resize to zero size");
- if (m_fd == -1) { // anonymous mapping
-#ifdef __linux__
- m_addr = ::mremap(m_addr, m_size, new_size, MREMAP_MAYMOVE);
- if (!is_valid()) {
- throw std::system_error(errno, std::system_category(), "mremap failed");
- }
- m_size = new_size;
-#else
- assert(false && "can't resize anonymous mappings on non-linux systems");
-#endif
- } else { // file-based mapping
- unmap();
- m_size = new_size;
- resize_fd(m_fd);
- m_addr = ::mmap(nullptr, new_size, get_protection(), get_flags(), m_fd, m_offset);
- if (!is_valid()) {
- throw std::system_error(errno, std::system_category(), "mmap (remap) failed");
- }
- }
-}
-
-#else
-
-// =========== Windows implementation =============
-
-/* References:
- * CreateFileMapping: http://msdn.microsoft.com/en-us/library/aa366537(VS.85).aspx
- * CloseHandle: http://msdn.microsoft.com/en-us/library/ms724211(VS.85).aspx
- * MapViewOfFile: http://msdn.microsoft.com/en-us/library/aa366761(VS.85).aspx
- * UnmapViewOfFile: http://msdn.microsoft.com/en-us/library/aa366882(VS.85).aspx
- */
-
-namespace osmium {
-
- namespace util {
-
- inline DWORD dword_hi(uint64_t x) {
- return static_cast<DWORD>(x >> 32);
- }
-
- inline DWORD dword_lo(uint64_t x) {
- return static_cast<DWORD>(x & 0xffffffff);
- }
-
- } // namespace util
-
-} // namespace osmium
-
-inline DWORD osmium::util::MemoryMapping::get_protection() const noexcept {
- switch (m_mapping_mode) {
- case mapping_mode::readonly:
- return PAGE_READONLY;
- case mapping_mode::write_private:
- return PAGE_WRITECOPY;
- case mapping_mode::write_shared:
- return PAGE_READWRITE;
- }
-}
-
-inline DWORD osmium::util::MemoryMapping::get_flags() const noexcept {
- switch (m_mapping_mode) {
- case mapping_mode::readonly:
- return FILE_MAP_READ;
- case mapping_mode::write_private:
- return FILE_MAP_COPY;
- case mapping_mode::write_shared:
- return FILE_MAP_WRITE;
- }
-}
-
-inline HANDLE osmium::util::MemoryMapping::get_handle() const noexcept {
- if (m_fd == -1) {
- return INVALID_HANDLE_VALUE;
- }
- return reinterpret_cast<HANDLE>(_get_osfhandle(m_fd));
-}
-
-inline HANDLE osmium::util::MemoryMapping::create_file_mapping() const noexcept {
- if (m_fd != -1) {
- _setmode(m_fd, _O_BINARY);
- }
- return CreateFileMapping(get_handle(), nullptr, get_protection(), osmium::util::dword_hi(static_cast<uint64_t>(m_size) + m_offset), osmium::util::dword_lo(static_cast<uint64_t>(m_size) + m_offset), nullptr);
-}
-
-inline void* osmium::util::MemoryMapping::map_view_of_file() const noexcept {
- return MapViewOfFile(m_handle, get_flags(), osmium::util::dword_hi(m_offset), osmium::util::dword_lo(m_offset), m_size);
-}
-
-inline bool osmium::util::MemoryMapping::is_valid() const noexcept {
- return m_addr != nullptr;
-}
-
-inline void osmium::util::MemoryMapping::make_invalid() noexcept {
- m_addr = nullptr;
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(size_t size, MemoryMapping::mapping_mode mode, int fd, off_t offset) :
- m_size(initial_size(size)),
- m_offset(offset),
- m_fd(resize_fd(fd)),
- m_mapping_mode(mode),
- m_handle(create_file_mapping()),
- m_addr(nullptr) {
-
- if (!m_handle) {
- throw std::system_error(GetLastError(), std::system_category(), "CreateFileMapping failed");
- }
-
- m_addr = map_view_of_file();
- if (!is_valid()) {
- throw std::system_error(GetLastError(), std::system_category(), "MapViewOfFile failed");
- }
-}
-
-inline osmium::util::MemoryMapping::MemoryMapping(MemoryMapping&& other) :
- m_size(other.m_size),
- m_offset(other.m_offset),
- m_fd(other.m_fd),
- m_mapping_mode(other.m_mapping_mode),
- m_handle(std::move(other.m_handle)),
- m_addr(other.m_addr) {
- other.make_invalid();
- other.m_handle = nullptr;
-}
-
-inline osmium::util::MemoryMapping& osmium::util::MemoryMapping::operator=(osmium::util::MemoryMapping&& other) {
- unmap();
- m_size = other.m_size;
- m_offset = other.m_offset;
- m_fd = other.m_fd;
- m_mapping_mode = other.m_mapping_mode;
- m_handle = std::move(other.m_handle);
- m_addr = other.m_addr;
- other.make_invalid();
- other.m_handle = nullptr;
- return *this;
-}
-
-inline void osmium::util::MemoryMapping::unmap() {
- if (is_valid()) {
- if (! UnmapViewOfFile(m_addr)) {
- throw std::system_error(GetLastError(), std::system_category(), "UnmapViewOfFile failed");
- }
- make_invalid();
- }
-
- if (m_handle) {
- if (! CloseHandle(m_handle)) {
- throw std::system_error(GetLastError(), std::system_category(), "CloseHandle failed");
- }
- m_handle = nullptr;
- }
-}
-
-inline void osmium::util::MemoryMapping::resize(size_t new_size) {
- unmap();
-
- m_size = new_size;
- resize_fd(m_fd);
-
- m_handle = create_file_mapping();
- if (!m_handle) {
- throw std::system_error(GetLastError(), std::system_category(), "CreateFileMapping failed");
- }
-
- m_addr = map_view_of_file();
- if (!is_valid()) {
- throw std::system_error(GetLastError(), std::system_category(), "MapViewOfFile failed");
- }
-}
-
-#endif
-
-#endif // OSMIUM_UTIL_MEMORY_MAPPING_HPP
diff --git a/contrib/libosmium/osmium/util/minmax.hpp b/contrib/libosmium/osmium/util/minmax.hpp
deleted file mode 100644
index 2eb601a..0000000
--- a/contrib/libosmium/osmium/util/minmax.hpp
+++ /dev/null
@@ -1,120 +0,0 @@
-#ifndef OSMIUM_UTIL_MINMAX_HPP
-#define OSMIUM_UTIL_MINMAX_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <limits>
-
-namespace osmium {
-
- template <typename T>
- inline T min_op_start_value() {
- return std::numeric_limits<T>::max();
- }
-
- /**
- * Class for calculating the minimum of a bunch of values.
- * Works with any numeric type.
- *
- * Usage:
- *
- * min_op<int> x;
- * x.update(27);
- * x.update(12);
- * auto min = x.get(); // 12
- */
- template <typename T>
- class min_op {
-
- T m_value;
-
- public:
-
- explicit min_op(T start_value = min_op_start_value<T>()) :
- m_value(start_value) {
- }
-
- void update(T value) noexcept {
- if (value < m_value) {
- m_value = value;
- }
- }
-
- T operator()() const noexcept {
- return m_value;
- }
-
- };
-
- template <typename T>
- inline T max_op_start_value() {
- return std::numeric_limits<T>::min();
- }
-
- /**
- * Class for calculating the maximum of a bunch of values.
- * Works with any numeric type.
- *
- * Usage:
- *
- * max_op<int> x;
- * x.update(27);
- * x.update(12);
- * auto max = x.get(); // 27
- */
- template <typename T>
- class max_op {
-
- T m_value;
-
- public:
-
- explicit max_op(T start_value = max_op_start_value<T>()) :
- m_value(start_value) {
- }
-
- void update(T value) noexcept {
- if (value > m_value) {
- m_value = value;
- }
- }
-
- T operator()() const noexcept {
- return m_value;
- }
-
- };
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_MINMAX_HPP
diff --git a/contrib/libosmium/osmium/util/options.hpp b/contrib/libosmium/osmium/util/options.hpp
deleted file mode 100644
index 24c0918..0000000
--- a/contrib/libosmium/osmium/util/options.hpp
+++ /dev/null
@@ -1,165 +0,0 @@
-#ifndef OSMIUM_UTIL_OPTIONS_HPP
-#define OSMIUM_UTIL_OPTIONS_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <initializer_list>
-#include <map>
-#include <string>
-#include <utility>
-
-namespace osmium {
-
- namespace util {
-
- /**
- * Stores key=value type options. This class can be used stand-alone or
- * as a base class. Options are stored and retrieved by key using the
- * different set() and get() methods.
- *
- * You can iterate over all set options. Dereferencing an iterator
- * yields a std::pair of the key and value strings.
- */
- class Options {
-
- typedef std::map<std::string, std::string> option_map;
- option_map m_options;
-
- public:
-
- typedef option_map::iterator iterator;
- typedef option_map::const_iterator const_iterator;
- typedef option_map::value_type value_type;
-
- Options() = default;
-
- explicit Options(const std::initializer_list<value_type>& values) :
- m_options(values) {
- }
-
- Options(const Options&) = default;
- Options& operator=(const Options&) = default;
-
- Options(Options&&) = default;
- Options& operator=(Options&&) = default;
-
- ~Options() = default;
-
- void set(const std::string& key, const std::string& value) {
- m_options[key] = value;
- }
-
- void set(const std::string& key, const char* value) {
- m_options[key] = value;
- }
-
- void set(const std::string& key, bool value) {
- m_options[key] = value ? "true" : "false";
- }
-
- void set(std::string data) {
- size_t pos = data.find_first_of('=');
- if (pos == std::string::npos) {
- m_options[data] = "true";
- } else {
- std::string value = data.substr(pos+1);
- data.erase(pos);
- set(data, value);
- }
- }
-
- /**
- * Get value of "key" option. If not set the default_value (or
- * empty string) is returned.
- */
- std::string get(const std::string& key, const std::string& default_value="") const noexcept {
- auto it = m_options.find(key);
- if (it == m_options.end()) {
- return default_value;
- }
- return it->second;
- }
-
- /**
- * Is this option set to a true value ("true" or "yes")?
- * Will return false if the value is unset.
- */
- bool is_true(const std::string& key) const noexcept {
- std::string value = get(key);
- return (value == "true" || value == "yes");
- }
-
- /**
- * Is this option not set to a false value ("false" or "no")?
- * Will return true if the value is unset.
- */
- bool is_not_false(const std::string& key) const noexcept {
- std::string value = get(key);
- return !(value == "false" || value == "no");
- }
-
- size_t size() const noexcept {
- return m_options.size();
- }
-
- iterator begin() noexcept {
- return m_options.begin();
- }
-
- iterator end() noexcept {
- return m_options.end();
- }
-
- const_iterator begin() const noexcept {
- return m_options.cbegin();
- }
-
- const_iterator end() const noexcept {
- return m_options.cend();
- }
-
- const_iterator cbegin() const noexcept {
- return m_options.cbegin();
- }
-
- const_iterator cend() const noexcept {
- return m_options.cend();
- }
-
- }; // class Options
-
- } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_OPTIONS_HPP
diff --git a/contrib/libosmium/osmium/util/string.hpp b/contrib/libosmium/osmium/util/string.hpp
deleted file mode 100644
index 55bfc6c..0000000
--- a/contrib/libosmium/osmium/util/string.hpp
+++ /dev/null
@@ -1,102 +0,0 @@
-#ifndef OSMIUM_UTIL_STRING_HPP
-#define OSMIUM_UTIL_STRING_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <string>
-#include <vector>
-#include <iostream>
-
-namespace osmium {
-
- /**
- * Split string on the separator character.
- *
- * @param str The string to be split.
- * @param sep The separator character.
- * @param compact Set this to true to remove empty strings from result
- * @returns Vector with the parts of the string split up.
- */
- inline std::vector<std::string> split_string(const std::string& str, const char sep, bool compact = false) {
- std::vector<std::string> tokens;
-
- if (!str.empty()) {
- size_t pos = 0;
- size_t nextpos = str.find_first_of(sep);
- while (nextpos != std::string::npos) {
- if (!compact || (nextpos - pos != 0)) {
- tokens.push_back(str.substr(pos, nextpos-pos));
- }
- pos = nextpos + 1;
- nextpos = str.find_first_of(sep, pos);
- }
- if (!compact || pos != str.size()) {
- tokens.push_back(str.substr(pos));
- }
- }
-
- return tokens;
- }
-
- /**
- * Split string on the separator character(s).
- *
- * @param str The string to be split.
- * @param sep The separator character(s).
- * @param compact Set this to true to remove empty strings from result
- * @returns Vector with the parts of the string split up.
- */
- inline std::vector<std::string> split_string(const std::string& str, const char* sep, bool compact = false) {
- std::vector<std::string> tokens;
-
- if (!str.empty()) {
- size_t pos = 0;
- size_t nextpos = str.find_first_of(sep);
- while (nextpos != std::string::npos) {
- if (!compact || (nextpos - pos != 0)) {
- tokens.push_back(str.substr(pos, nextpos-pos));
- }
- pos = nextpos + 1;
- nextpos = str.find_first_of(sep, pos);
- }
- if (!compact || pos != str.size()) {
- tokens.push_back(str.substr(pos));
- }
- }
-
- return tokens;
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_STRING_HPP
diff --git a/contrib/libosmium/osmium/util/verbose_output.hpp b/contrib/libosmium/osmium/util/verbose_output.hpp
deleted file mode 100644
index 249d67f..0000000
--- a/contrib/libosmium/osmium/util/verbose_output.hpp
+++ /dev/null
@@ -1,139 +0,0 @@
-#ifndef OSMIUM_UTIL_VERBOSE_OUTPUT_HPP
-#define OSMIUM_UTIL_VERBOSE_OUTPUT_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <time.h>
-
-#include <iomanip>
-#include <iostream>
-#include <sstream>
-
-namespace osmium {
-
- /**
- * @brief Helpful utility classes and functions not strictly OSM related
- */
- namespace util {
-
- /**
- * Osmium programs often run for a long time because of the amount of
- * OSM data processed. This class helps with keeping the user up to
- * date by offering an easy way for programs to optionally output
- * verbose information about what's going on.
- *
- * Use an object of this class instead of std::cerr as an output
- * stream. Nothing is actually written if the object is not set to
- * verbose mode. If it is set to verbose mode, each line is prepended
- * with the running time, ie the time since the VerboseOutput object
- * was created.
- */
- class VerboseOutput {
-
- /// all time output will be relative to this start time
- time_t m_start;
-
- /// is verbose mode enabled?
- bool m_verbose;
-
- /// a newline was written, start next output with runtime
- bool m_newline;
-
- /**
- * If we remember that a newline was written as the last thing
- * write out the time elapsed and reset the newline flag.
- */
- void start_line() {
- if (m_newline) {
- time_t elapsed = runtime();
-
- char old_fill = std::cerr.fill();
- std::cerr << '[' << std::setw(2) << (elapsed / 60) << ':' << std::setw(2) << std::setfill('0') << (elapsed % 60) << "] ";
- std::cerr.fill(old_fill);
-
- m_newline = false;
- }
- }
-
- public:
-
- explicit VerboseOutput(bool verbose = false) noexcept :
- m_start(time(NULL)),
- m_verbose(verbose),
- m_newline(true) {
- }
-
- ~VerboseOutput() = default;
-
- VerboseOutput(const VerboseOutput&) = default;
- VerboseOutput& operator=(const VerboseOutput&) = default;
- VerboseOutput(VerboseOutput&&) = default;
- VerboseOutput& operator=(VerboseOutput&&) = default;
-
- time_t runtime() const noexcept {
- return time(NULL) - m_start;
- }
-
- /// Get "verbose" setting.
- bool verbose() const noexcept {
- return m_verbose;
- }
-
- /// Set "verbose" setting.
- void verbose(bool verbose) noexcept {
- m_verbose = verbose;
- }
-
- template<typename T>
- friend VerboseOutput& operator<<(VerboseOutput& verbose_output, const T& value) {
- if (verbose_output.m_verbose) {
- verbose_output.start_line();
- std::cerr << value;
-
- // check if there was a newline a the end and remember that
- std::ostringstream output_buffer;
- output_buffer << value;
- if (!output_buffer.str().empty() && output_buffer.str().back() == '\n') {
- verbose_output.m_newline = true;
- }
- }
- return verbose_output;
- }
-
- }; // class VerboseOutput
-
- } // namespace util
-
-} // namespace osmium
-
-#endif // OSMIUM_UTIL_VERBOSE_OUTPUT_HPP
diff --git a/contrib/libosmium/osmium/visitor.hpp b/contrib/libosmium/osmium/visitor.hpp
deleted file mode 100644
index 35fcb4e..0000000
--- a/contrib/libosmium/osmium/visitor.hpp
+++ /dev/null
@@ -1,258 +0,0 @@
-#ifndef OSMIUM_VISITOR_HPP
-#define OSMIUM_VISITOR_HPP
-
-/*
-
-This file is part of Osmium (http://osmcode.org/libosmium).
-
-Copyright 2013-2015 Jochen Topf <jochen at 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 <type_traits>
-
-#include <osmium/io/reader_iterator.hpp> // IWYU pragma: keep
-#include <osmium/memory/buffer.hpp>
-#include <osmium/osm.hpp>
-#include <osmium/osm/entity.hpp>
-#include <osmium/osm/item_type.hpp>
-
-namespace osmium {
-
- class TagList;
- class WayNodeList;
- class RelationMemberList;
- class OuterRing;
- class InnerRing;
-
- namespace memory {
- class Item;
- }
-
- namespace detail {
-
- template <typename T, typename U>
- using ConstIfConst = typename std::conditional<std::is_const<T>::value, typename std::add_const<U>::type, U>::type;
-
- template <typename THandler, typename TItem>
- inline void apply_item_recurse(TItem& item, THandler& handler) {
- switch (item.type()) {
- case osmium::item_type::undefined:
- break;
- case osmium::item_type::node:
- handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
- handler.node(static_cast<ConstIfConst<TItem, osmium::Node>&>(item));
- break;
- case osmium::item_type::way:
- handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
- handler.way(static_cast<ConstIfConst<TItem, osmium::Way>&>(item));
- break;
- case osmium::item_type::relation:
- handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
- handler.relation(static_cast<ConstIfConst<TItem, osmium::Relation>&>(item));
- break;
- case osmium::item_type::area:
- handler.osm_object(static_cast<ConstIfConst<TItem, osmium::OSMObject>&>(item));
- handler.area(static_cast<ConstIfConst<TItem, osmium::Area>&>(item));
- break;
- case osmium::item_type::changeset:
- handler.changeset(static_cast<ConstIfConst<TItem, osmium::Changeset>&>(item));
- break;
- case osmium::item_type::tag_list:
- handler.tag_list(static_cast<ConstIfConst<TItem, osmium::TagList>&>(item));
- break;
- case osmium::item_type::way_node_list:
- handler.way_node_list(static_cast<ConstIfConst<TItem, osmium::WayNodeList>&>(item));
- break;
- case osmium::item_type::relation_member_list:
- case osmium::item_type::relation_member_list_with_full_members:
- handler.relation_member_list(static_cast<ConstIfConst<TItem, osmium::RelationMemberList>&>(item));
- break;
- case osmium::item_type::outer_ring:
- handler.outer_ring(static_cast<ConstIfConst<TItem, osmium::OuterRing>&>(item));
- break;
- case osmium::item_type::inner_ring:
- handler.inner_ring(static_cast<ConstIfConst<TItem, osmium::InnerRing>&>(item));
- break;
- case osmium::item_type::changeset_discussion:
- handler.changeset_discussion(static_cast<ConstIfConst<TItem, osmium::ChangesetDiscussion>&>(item));
- break;
- }
- }
-
- template <typename THandler>
- inline void apply_item_recurse(const osmium::OSMEntity& item, THandler& handler) {
- switch (item.type()) {
- case osmium::item_type::node:
- handler.osm_object(static_cast<const osmium::OSMObject&>(item));
- handler.node(static_cast<const osmium::Node&>(item));
- break;
- case osmium::item_type::way:
- handler.osm_object(static_cast<const osmium::OSMObject&>(item));
- handler.way(static_cast<const osmium::Way&>(item));
- break;
- case osmium::item_type::relation:
- handler.osm_object(static_cast<const osmium::OSMObject&>(item));
- handler.relation(static_cast<const osmium::Relation&>(item));
- break;
- case osmium::item_type::area:
- handler.osm_object(static_cast<const osmium::OSMObject&>(item));
- handler.area(static_cast<const osmium::Area&>(item));
- break;
- case osmium::item_type::changeset:
- handler.changeset(static_cast<const osmium::Changeset&>(item));
- break;
- default:
- throw osmium::unknown_type();
- }
- }
-
- template <typename THandler>
- inline void apply_item_recurse(osmium::OSMEntity& item, THandler& handler) {
- switch (item.type()) {
- case osmium::item_type::node:
- handler.osm_object(static_cast<osmium::OSMObject&>(item));
- handler.node(static_cast<osmium::Node&>(item));
- break;
- case osmium::item_type::way:
- handler.osm_object(static_cast<osmium::OSMObject&>(item));
- handler.way(static_cast<osmium::Way&>(item));
- break;
- case osmium::item_type::relation:
- handler.osm_object(static_cast<osmium::OSMObject&>(item));
- handler.relation(static_cast<osmium::Relation&>(item));
- break;
- case osmium::item_type::area:
- handler.osm_object(static_cast<osmium::OSMObject&>(item));
- handler.area(static_cast<osmium::Area&>(item));
- break;
- case osmium::item_type::changeset:
- handler.changeset(static_cast<osmium::Changeset&>(item));
- break;
- default:
- throw osmium::unknown_type();
- }
- }
-
- template <typename THandler>
- inline void apply_item_recurse(const osmium::OSMObject& item, THandler& handler) {
- switch (item.type()) {
- case osmium::item_type::node:
- handler.osm_object(item);
- handler.node(static_cast<const osmium::Node&>(item));
- break;
- case osmium::item_type::way:
- handler.osm_object(item);
- handler.way(static_cast<const osmium::Way&>(item));
- break;
- case osmium::item_type::relation:
- handler.osm_object(item);
- handler.relation(static_cast<const osmium::Relation&>(item));
- break;
- case osmium::item_type::area:
- handler.osm_object(item);
- handler.area(static_cast<const osmium::Area&>(item));
- break;
- default:
- throw osmium::unknown_type();
- }
- }
-
- template <typename THandler>
- inline void apply_item_recurse(osmium::OSMObject& item, THandler& handler) {
- switch (item.type()) {
- case osmium::item_type::node:
- handler.osm_object(item);
- handler.node(static_cast<osmium::Node&>(item));
- break;
- case osmium::item_type::way:
- handler.osm_object(item);
- handler.way(static_cast<osmium::Way&>(item));
- break;
- case osmium::item_type::relation:
- handler.osm_object(item);
- handler.relation(static_cast<osmium::Relation&>(item));
- break;
- case osmium::item_type::area:
- handler.osm_object(item);
- handler.area(static_cast<osmium::Area&>(item));
- break;
- default:
- throw osmium::unknown_type();
- }
- }
-
- template <typename THandler, typename TItem, typename... TRest>
- inline void apply_item_recurse(TItem& item, THandler& handler, TRest&... more) {
- apply_item_recurse(item, handler);
- apply_item_recurse(item, more...);
- }
-
- template <typename THandler>
- inline void flush_recurse(THandler& handler) {
- handler.flush();
- }
-
- template <typename THandler, typename... TRest>
- inline void flush_recurse(THandler& handler, TRest&... more) {
- flush_recurse(handler);
- flush_recurse(more...);
- }
-
- } // namespace detail
-
- template <typename... THandlers>
- inline void apply_item(const osmium::memory::Item& item, THandlers&... handlers) {
- detail::apply_item_recurse(item, handlers...);
- }
-
- template <typename... THandlers>
- inline void apply_item(osmium::memory::Item& item, THandlers&... handlers) {
- detail::apply_item_recurse(item, handlers...);
- }
-
- template <typename TIterator, typename... THandlers>
- inline void apply(TIterator it, TIterator end, THandlers&... handlers) {
- for (; it != end; ++it) {
- detail::apply_item_recurse(*it, handlers...);
- }
- detail::flush_recurse(handlers...);
- }
-
- template <typename TContainer, typename... THandlers>
- inline void apply(TContainer& c, THandlers&... handlers) {
- apply(std::begin(c), std::end(c), handlers...);
- }
-
- template <typename... THandlers>
- inline void apply(const osmium::memory::Buffer& buffer, THandlers&... handlers) {
- apply(buffer.cbegin(), buffer.cend(), handlers...);
- }
-
-} // namespace osmium
-
-#endif // OSMIUM_VISITOR_HPP
diff --git a/contrib/libosmium/protozero/byteswap.hpp b/contrib/libosmium/protozero/byteswap.hpp
deleted file mode 100644
index 29c312a..0000000
--- a/contrib/libosmium/protozero/byteswap.hpp
+++ /dev/null
@@ -1,69 +0,0 @@
-#ifndef PROTOZERO_BYTESWAP_HPP
-#define PROTOZERO_BYTESWAP_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file byteswap.hpp
- *
- * @brief Contains functions to swap bytes in values (for different endianness).
- */
-
-#include <cstdint>
-#include <cassert>
-
-namespace protozero {
-
-/**
- * Swap N byte value between endianness formats. This template function must
- * be specialized to actually work.
- */
-template <int N>
-inline void byteswap(const char* /*data*/, char* /*result*/) {
- static_assert(N == 1, "Can only swap 4 or 8 byte values");
-}
-
-/**
- * Swap 4 byte value (int32_t, uint32_t, float) between endianness formats.
- */
-template <>
-inline void byteswap<4>(const char* data, char* result) {
-# if defined(__GNUC__) || defined(__clang__)
- *reinterpret_cast<uint32_t*>(result) = __builtin_bswap32(*reinterpret_cast<const uint32_t*>(data));
-# else
- result[3] = data[0];
- result[2] = data[1];
- result[1] = data[2];
- result[0] = data[3];
-#endif
-}
-
-/**
- * Swap 8 byte value (int64_t, uint64_t, double) between endianness formats.
- */
-template <>
-inline void byteswap<8>(const char* data, char* result) {
-# if defined(__GNUC__) || defined(__clang__)
- *reinterpret_cast<uint64_t*>(result) = __builtin_bswap64(*reinterpret_cast<const uint64_t*>(data));
-# else
- result[7] = data[0];
- result[6] = data[1];
- result[5] = data[2];
- result[4] = data[3];
- result[3] = data[4];
- result[2] = data[5];
- result[1] = data[6];
- result[0] = data[7];
-#endif
-}
-
-} // end namespace protozero
-
-#endif // PROTOZERO_BYTESWAP_HPP
diff --git a/contrib/libosmium/protozero/exception.hpp b/contrib/libosmium/protozero/exception.hpp
deleted file mode 100644
index 1229f7d..0000000
--- a/contrib/libosmium/protozero/exception.hpp
+++ /dev/null
@@ -1,68 +0,0 @@
-#ifndef PROTOZERO_EXCEPTION_HPP
-#define PROTOZERO_EXCEPTION_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file exception.hpp
- *
- * @brief Contains the exceptions used in the protozero library.
- */
-
-#include <exception>
-
-/**
- * @brief All parts of the protozero header-only library are in this namespace.
- */
-namespace protozero {
-
-/**
- * All exceptions explicitly thrown by the functions of the protozero library
- * derive from this exception.
- */
-struct exception : std::exception {
- /// Returns the explanatory string.
- const char *what() const noexcept { return "pbf exception"; }
-};
-
-/**
- * This exception is thrown when parsing a varint thats larger than allowed.
- * This should never happen unless the data is corrupted.
- */
-struct varint_too_long_exception : exception {
- /// Returns the explanatory string.
- const char *what() const noexcept { return "varint too long exception"; }
-};
-
-/**
- * This exception is thrown when the wire type of a pdf field is unknown.
- * This should never happen unless the data is corrupted.
- */
-struct unknown_pbf_wire_type_exception : exception {
- /// Returns the explanatory string.
- const char *what() const noexcept { return "unknown pbf field type exception"; }
-};
-
-/**
- * This exception is thrown when we are trying to read a field and there
- * are not enough bytes left in the buffer to read it. Almost all functions
- * of the pbf_reader class can throw this exception.
- *
- * This should never happen unless the data is corrupted or you have
- * initialized the pbf_reader object with incomplete data.
- */
-struct end_of_buffer_exception : exception {
- /// Returns the explanatory string.
- const char *what() const noexcept { return "end of buffer exception"; }
-};
-
-} // end namespace protozero
-
-#endif // PROTOZERO_EXCEPTION_HPP
diff --git a/contrib/libosmium/protozero/pbf_builder.hpp b/contrib/libosmium/protozero/pbf_builder.hpp
deleted file mode 100644
index 063fa9c..0000000
--- a/contrib/libosmium/protozero/pbf_builder.hpp
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifndef PROTOZERO_PBF_BUILDER_HPP
-#define PROTOZERO_PBF_BUILDER_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_builder.hpp
- *
- * @brief Contains the pbf_builder template class.
- */
-
-#include <type_traits>
-
-#include <protozero/pbf_types.hpp>
-#include <protozero/pbf_writer.hpp>
-
-namespace protozero {
-
-/**
- * The pbf_builder is used to write PBF formatted messages into a buffer. It
- * is based on the pbf_writer class and has all the same methods. The
- * difference is that whereever the pbf_writer class takes an integer tag,
- * this template class takes a tag of the template type T.
- *
- * Almost all methods in this class can throw an std::bad_alloc exception if
- * the std::string used as a buffer wants to resize.
- *
- * Read the tutorial to understand how this class is used.
- */
-template <typename T>
-class pbf_builder : public pbf_writer {
-
- static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value,
- "T must be enum with underlying type protozero::pbf_tag_type");
-
-public:
-
- using enum_type = T;
-
- pbf_builder(std::string& data) noexcept :
- pbf_writer(data) {
- }
-
- template <typename P>
- pbf_builder(pbf_writer& parent_writer, P tag) noexcept :
- pbf_writer(parent_writer, pbf_tag_type(tag)) {
- }
-
-/// @cond INTERNAL
-#define PROTOZERO_WRITER_WRAP_ADD_SCALAR(name, type) \
- inline void add_##name(T tag, type value) { \
- pbf_writer::add_##name(pbf_tag_type(tag), value); \
- }
-
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(bool, bool)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(enum, int32_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(int32, int32_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint32, int32_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint32, uint32_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(int64, int64_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(sint64, int64_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(uint64, uint64_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed32, uint32_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed32, int32_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(fixed64, uint64_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(sfixed64, int64_t)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(float, float)
- PROTOZERO_WRITER_WRAP_ADD_SCALAR(double, double)
-
-#undef PROTOZERO_WRITER_WRAP_ADD_SCALAR
-/// @endcond
-
- inline void add_bytes(T tag, const char* value, size_t size) {
- pbf_writer::add_bytes(pbf_tag_type(tag), value, size);
- }
-
- inline void add_bytes(T tag, const std::string& value) {
- pbf_writer::add_bytes(pbf_tag_type(tag), value);
- }
-
- inline void add_string(T tag, const char* value, size_t size) {
- pbf_writer::add_string(pbf_tag_type(tag), value, size);
- }
-
- inline void add_string(T tag, const std::string& value) {
- pbf_writer::add_string(pbf_tag_type(tag), value);
- }
-
- inline void add_string(T tag, const char* value) {
- pbf_writer::add_string(pbf_tag_type(tag), value);
- }
-
- inline void add_message(T tag, const char* value, size_t size) {
- pbf_writer::add_message(pbf_tag_type(tag), value, size);
- }
-
- inline void add_message(T tag, const std::string& value) {
- pbf_writer::add_message(pbf_tag_type(tag), value);
- }
-
-/// @cond INTERNAL
-#define PROTOZERO_WRITER_WRAP_ADD_PACKED(name) \
- template <typename InputIterator> \
- inline void add_packed_##name(T tag, InputIterator first, InputIterator last) { \
- pbf_writer::add_packed_##name(pbf_tag_type(tag), first, last); \
- }
-
- PROTOZERO_WRITER_WRAP_ADD_PACKED(bool)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(enum)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(int32)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(sint32)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(uint32)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(int64)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(sint64)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(uint64)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed32)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed32)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(fixed64)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(sfixed64)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(float)
- PROTOZERO_WRITER_WRAP_ADD_PACKED(double)
-
-#undef PROTOZERO_WRITER_WRAP_ADD_PACKED
-/// @endcond
-
-};
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_BUILDER_HPP
diff --git a/contrib/libosmium/protozero/pbf_message.hpp b/contrib/libosmium/protozero/pbf_message.hpp
deleted file mode 100644
index 7fef06f..0000000
--- a/contrib/libosmium/protozero/pbf_message.hpp
+++ /dev/null
@@ -1,94 +0,0 @@
-#ifndef PROTOZERO_PBF_MESSAGE_HPP
-#define PROTOZERO_PBF_MESSAGE_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_message.hpp
- *
- * @brief Contains the pbf_message class.
- */
-
-#include <type_traits>
-
-#include <protozero/pbf_reader.hpp>
-#include <protozero/pbf_types.hpp>
-
-namespace protozero {
-
-/**
- * This class represents a protobuf message. Either a top-level message or
- * a nested sub-message. Top-level messages can be created from any buffer
- * with a pointer and length:
- *
- * @code
- * enum class Message : protozero::pbf_tag_type {
- * ...
- * };
- *
- * std::string buffer;
- * // fill buffer...
- * pbf_message<Message> message(buffer.data(), buffer.size());
- * @endcode
- *
- * Sub-messages are created using get_message():
- *
- * @code
- * enum class SubMessage : protozero::pbf_tag_type {
- * ...
- * };
- *
- * pbf_message<Message> message(...);
- * message.next();
- * pbf_message<SubMessage> submessage = message.get_message();
- * @endcode
- *
- * All methods of the pbf_message class except get_bytes() and get_string()
- * provide the strong exception guarantee, ie they either succeed or do not
- * change the pbf_message object they are called on. Use the get_data() method
- * instead of get_bytes() or get_string(), if you need this guarantee.
- *
- * This template class is based on the pbf_reader class and has all the same
- * methods. The difference is that whereever the pbf_reader class takes an
- * integer tag, this template class takes a tag of the template type T.
- *
- * Read the tutorial to understand how this class is used.
- */
-template <typename T>
-class pbf_message : public pbf_reader {
-
- static_assert(std::is_same<pbf_tag_type, typename std::underlying_type<T>::type>::value, "T must be enum with underlying type protozero::pbf_tag_type");
-
-public:
-
- using enum_type = T;
-
- template <typename... Args>
- pbf_message(Args&&... args) noexcept :
- pbf_reader(std::forward<Args>(args)...) {
- }
-
- inline bool next() {
- return pbf_reader::next();
- }
-
- inline bool next(T tag) {
- return pbf_reader::next(pbf_tag_type(tag));
- }
-
- inline T tag() const noexcept {
- return T(pbf_reader::tag());
- }
-
-};
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_MESSAGE_HPP
diff --git a/contrib/libosmium/protozero/pbf_reader.hpp b/contrib/libosmium/protozero/pbf_reader.hpp
deleted file mode 100644
index ac3220c..0000000
--- a/contrib/libosmium/protozero/pbf_reader.hpp
+++ /dev/null
@@ -1,1067 +0,0 @@
-#ifndef PROTOZERO_PBF_READER_HPP
-#define PROTOZERO_PBF_READER_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_reader.hpp
- *
- * @brief Contains the pbf_reader class.
- */
-
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <iterator>
-#include <string>
-#include <utility>
-
-#include <protozero/pbf_types.hpp>
-#include <protozero/exception.hpp>
-#include <protozero/varint.hpp>
-
-#if __BYTE_ORDER != __LITTLE_ENDIAN
-# include <protozero/byteswap.hpp>
-#endif
-
-/// Wrapper for assert() used for testing
-#ifndef protozero_assert
-# define protozero_assert(x) assert(x)
-#endif
-
-namespace protozero {
-
-/**
- * This class represents a protobuf message. Either a top-level message or
- * a nested sub-message. Top-level messages can be created from any buffer
- * with a pointer and length:
- *
- * @code
- * std::string buffer;
- * // fill buffer...
- * pbf_reader message(buffer.data(), buffer.size());
- * @endcode
- *
- * Sub-messages are created using get_message():
- *
- * @code
- * pbf_reader message(...);
- * message.next();
- * pbf_reader submessage = message.get_message();
- * @endcode
- *
- * All methods of the pbf_reader class except get_bytes() and get_string()
- * provide the strong exception guarantee, ie they either succeed or do not
- * change the pbf_reader object they are called on. Use the get_data() method
- * instead of get_bytes() or get_string(), if you need this guarantee.
- */
-class pbf_reader {
-
- // A pointer to the next unread data.
- const char *m_data = nullptr;
-
- // A pointer to one past the end of data.
- const char *m_end = nullptr;
-
- // The wire type of the current field.
- pbf_wire_type m_wire_type = pbf_wire_type::unknown;
-
- // The tag of the current field.
- pbf_tag_type m_tag = 0;
-
- template <typename T>
- inline T get_fixed() {
- T result;
- skip_bytes(sizeof(T));
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- memcpy(&result, m_data - sizeof(T), sizeof(T));
-#else
- byteswap<sizeof(T)>(m_data - sizeof(T), reinterpret_cast<char*>(&result));
-#endif
- return result;
- }
-
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- template <typename T>
- inline std::pair<const T*, const T*> packed_fixed() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- protozero_assert(len % sizeof(T) == 0);
- return std::make_pair(reinterpret_cast<const T*>(m_data-len), reinterpret_cast<const T*>(m_data));
- }
-
-#else
-
- template <typename T>
- class const_fixed_iterator : public std::iterator<std::forward_iterator_tag, T> {
-
- const char* m_data;
- const char* m_end;
-
- public:
-
- const_fixed_iterator() noexcept :
- m_data(nullptr),
- m_end(nullptr) {
- }
-
- const_fixed_iterator(const char *data, const char* end) noexcept :
- m_data(data),
- m_end(end) {
- }
-
- const_fixed_iterator(const const_fixed_iterator&) noexcept = default;
- const_fixed_iterator(const_fixed_iterator&&) noexcept = default;
-
- const_fixed_iterator& operator=(const const_fixed_iterator&) noexcept = default;
- const_fixed_iterator& operator=(const_fixed_iterator&&) noexcept = default;
-
- ~const_fixed_iterator() noexcept = default;
-
- T operator*() {
- T result;
- byteswap<sizeof(T)>(m_data, reinterpret_cast<char*>(&result));
- return result;
- }
-
- const_fixed_iterator& operator++() {
- m_data += sizeof(T);
- return *this;
- }
-
- const_fixed_iterator operator++(int) {
- const const_fixed_iterator tmp(*this);
- ++(*this);
- return tmp;
- }
-
- bool operator==(const const_fixed_iterator& rhs) const noexcept {
- return m_data == rhs.m_data && m_end == rhs.m_end;
- }
-
- bool operator!=(const const_fixed_iterator& rhs) const noexcept {
- return !(*this == rhs);
- }
-
- }; // class const_fixed_iterator
-
- template <typename T>
- inline std::pair<const_fixed_iterator<T>, const_fixed_iterator<T>> packed_fixed() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- protozero_assert(len % sizeof(T) == 0);
- return std::make_pair(const_fixed_iterator<T>(m_data-len, m_data),
- const_fixed_iterator<T>(m_data, m_data));
- }
-#endif
-
- template <typename T> inline T get_varint();
- template <typename T> inline T get_svarint();
-
- inline pbf_length_type get_length() { return get_varint<pbf_length_type>(); }
-
- inline void skip_bytes(pbf_length_type len);
-
- inline pbf_length_type get_len_and_skip();
-
-public:
-
- /**
- * Construct a pbf_reader message from a data pointer and a length. The pointer
- * will be stored inside the pbf_reader object, no data is copied. So you must
- * make sure the buffer stays valid as long as the pbf_reader object is used.
- *
- * The buffer must contain a complete protobuf message.
- *
- * @post There is no current field.
- */
- inline pbf_reader(const char *data, size_t length) noexcept;
-
- /**
- * Construct a pbf_reader message from a data pointer and a length. The pointer
- * will be stored inside the pbf_reader object, no data is copied. So you must
- * make sure the buffer stays valid as long as the pbf_reader object is used.
- *
- * The buffer must contain a complete protobuf message.
- *
- * @post There is no current field.
- */
- inline pbf_reader(std::pair<const char *, size_t> data) noexcept;
-
- /**
- * Construct a pbf_reader message from a std::string. A pointer to the string
- * internals will be stored inside the pbf_reader object, no data is copied.
- * So you must make sure the string is unchanged as long as the pbf_reader
- * object is used.
- *
- * The string must contain a complete protobuf message.
- *
- * @post There is no current field.
- */
- inline pbf_reader(const std::string& data) noexcept;
-
- /**
- * pbf_reader can be default constructed and behaves like it has an empty
- * buffer.
- */
- inline pbf_reader() noexcept = default;
-
- /// pbf_reader messages can be copied trivially.
- inline pbf_reader(const pbf_reader&) noexcept = default;
-
- /// pbf_reader messages can be moved trivially.
- inline pbf_reader(pbf_reader&&) noexcept = default;
-
- /// pbf_reader messages can be copied trivially.
- inline pbf_reader& operator=(const pbf_reader& other) noexcept = default;
-
- /// pbf_reader messages can be moved trivially.
- inline pbf_reader& operator=(pbf_reader&& other) noexcept = default;
-
- inline ~pbf_reader() = default;
-
- /**
- * In a boolean context the pbf_reader class evaluates to `true` if there are
- * still fields available and to `false` if the last field has been read.
- */
- inline operator bool() const noexcept;
-
- /**
- * Return the length in bytes of the current message. If you have
- * already called next() and/or any of the get_*() functions, this will
- * return the remaining length.
- *
- * This can, for instance, be used to estimate the space needed for a
- * buffer. Of course you have to know reasonably well what data to expect
- * and how it is encoded for this number to have any meaning.
- */
- size_t length() const noexcept {
- return size_t(m_end - m_data);
- }
-
- /**
- * Set next field in the message as the current field. This is usually
- * called in a while loop:
- *
- * @code
- * pbf_reader message(...);
- * while (message.next()) {
- * // handle field
- * }
- * @endcode
- *
- * @returns `true` if there is a next field, `false` if not.
- * @pre There must be no current field.
- * @post If it returns `true` there is a current field now.
- */
- inline bool next();
-
- /**
- * Set next field with given tag in the message as the current field.
- * Fields with other tags are skipped. This is usually called in a while
- * loop for repeated fields:
- *
- * @code
- * pbf_reader message(...);
- * while (message.next(17)) {
- * // handle field
- * }
- * @endcode
- *
- * or you can call it just once to get the one field with this tag:
- *
- * @code
- * pbf_reader message(...);
- * if (message.next(17)) {
- * // handle field
- * }
- * @endcode
- *
- * @returns `true` if there is a next field with this tag.
- * @pre There must be no current field.
- * @post If it returns `true` there is a current field now with the given tag.
- */
- inline bool next(pbf_tag_type tag);
-
- /**
- * The tag of the current field. The tag is the field number from the
- * description in the .proto file.
- *
- * Call next() before calling this function to set the current field.
- *
- * @returns tag of the current field.
- * @pre There must be a current field (ie. next() must have returned `true`).
- */
- inline pbf_tag_type tag() const noexcept;
-
- /**
- * Get the wire type of the current field. The wire types are:
- *
- * * 0 - varint
- * * 1 - 64 bit
- * * 2 - length-delimited
- * * 5 - 32 bit
- *
- * All other types are illegal.
- *
- * Call next() before calling this function to set the current field.
- *
- * @returns wire type of the current field.
- * @pre There must be a current field (ie. next() must have returned `true`).
- */
- inline pbf_wire_type wire_type() const noexcept;
-
- /**
- * Check the wire type of the current field.
- *
- * @returns `true` if the current field has the given wire type.
- * @pre There must be a current field (ie. next() must have returned `true`).
- */
- inline bool has_wire_type(pbf_wire_type type) const noexcept;
-
- /**
- * Consume the current field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @post The current field was consumed and there is no current field now.
- */
- inline void skip();
-
- ///@{
- /**
- * @name Scalar field accessor functions
- */
-
- /**
- * Consume and return value of current "bool" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "bool".
- * @post The current field was consumed and there is no current field now.
- */
- inline bool get_bool();
-
- /**
- * Consume and return value of current "enum" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "enum".
- * @post The current field was consumed and there is no current field now.
- */
- inline int32_t get_enum() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_varint<int32_t>();
- }
-
- /**
- * Consume and return value of current "int32" varint field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "int32".
- * @post The current field was consumed and there is no current field now.
- */
- inline int32_t get_int32() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_varint<int32_t>();
- }
-
- /**
- * Consume and return value of current "sint32" varint field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "sint32".
- * @post The current field was consumed and there is no current field now.
- */
- inline int32_t get_sint32() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_svarint<int32_t>();
- }
-
- /**
- * Consume and return value of current "uint32" varint field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "uint32".
- * @post The current field was consumed and there is no current field now.
- */
- inline uint32_t get_uint32() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_varint<uint32_t>();
- }
-
- /**
- * Consume and return value of current "int64" varint field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "int64".
- * @post The current field was consumed and there is no current field now.
- */
- inline int64_t get_int64() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_varint<int64_t>();
- }
-
- /**
- * Consume and return value of current "sint64" varint field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "sint64".
- * @post The current field was consumed and there is no current field now.
- */
- inline int64_t get_sint64() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_svarint<int64_t>();
- }
-
- /**
- * Consume and return value of current "uint64" varint field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "uint64".
- * @post The current field was consumed and there is no current field now.
- */
- inline uint64_t get_uint64() {
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- return get_varint<uint64_t>();
- }
-
- /**
- * Consume and return value of current "fixed32" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "fixed32".
- * @post The current field was consumed and there is no current field now.
- */
- inline uint32_t get_fixed32();
-
- /**
- * Consume and return value of current "sfixed32" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "sfixed32".
- * @post The current field was consumed and there is no current field now.
- */
- inline int32_t get_sfixed32();
-
- /**
- * Consume and return value of current "fixed64" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "fixed64".
- * @post The current field was consumed and there is no current field now.
- */
- inline uint64_t get_fixed64();
-
- /**
- * Consume and return value of current "sfixed64" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "sfixed64".
- * @post The current field was consumed and there is no current field now.
- */
- inline int64_t get_sfixed64();
-
- /**
- * Consume and return value of current "float" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "float".
- * @post The current field was consumed and there is no current field now.
- */
- inline float get_float();
-
- /**
- * Consume and return value of current "double" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "double".
- * @post The current field was consumed and there is no current field now.
- */
- inline double get_double();
-
- /**
- * Consume and return value of current "bytes" or "string" field.
- *
- * @returns A pair with a pointer to the data and the length of the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "bytes" or "string".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<const char*, pbf_length_type> get_data();
-
- /**
- * Consume and return value of current "bytes" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "bytes".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::string get_bytes();
-
- /**
- * Consume and return value of current "string" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "string".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::string get_string();
-
- /**
- * Consume and return value of current "message" field.
- *
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "message".
- * @post The current field was consumed and there is no current field now.
- */
- inline pbf_reader get_message() {
- return pbf_reader(get_data());
- }
-
- ///@}
-
-private:
-
- template <typename T>
- class const_varint_iterator : public std::iterator<std::forward_iterator_tag, T> {
-
- protected:
-
- const char* m_data;
- const char* m_end;
-
- public:
-
- const_varint_iterator() noexcept :
- m_data(nullptr),
- m_end(nullptr) {
- }
-
- const_varint_iterator(const char *data, const char* end) noexcept :
- m_data(data),
- m_end(end) {
- }
-
- const_varint_iterator(const const_varint_iterator&) noexcept = default;
- const_varint_iterator(const_varint_iterator&&) noexcept = default;
-
- const_varint_iterator& operator=(const const_varint_iterator&) noexcept = default;
- const_varint_iterator& operator=(const_varint_iterator&&) noexcept = default;
-
- ~const_varint_iterator() noexcept = default;
-
- T operator*() {
- const char* d = m_data; // will be thrown away
- return static_cast<T>(decode_varint(&d, m_end));
- }
-
- const_varint_iterator& operator++() {
- // Ignore the result, we call decode_varint() just for the
- // side-effect of updating m_data.
- decode_varint(&m_data, m_end);
- return *this;
- }
-
- const_varint_iterator operator++(int) {
- const const_varint_iterator tmp(*this);
- ++(*this);
- return tmp;
- }
-
- bool operator==(const const_varint_iterator& rhs) const noexcept {
- return m_data == rhs.m_data && m_end == rhs.m_end;
- }
-
- bool operator!=(const const_varint_iterator& rhs) const noexcept {
- return !(*this == rhs);
- }
-
- }; // class const_varint_iterator
-
- template <typename T>
- class const_svarint_iterator : public const_varint_iterator<T> {
-
- public:
-
- const_svarint_iterator() noexcept :
- const_varint_iterator<T>() {
- }
-
- const_svarint_iterator(const char *data, const char* end) noexcept :
- const_varint_iterator<T>(data, end) {
- }
-
- const_svarint_iterator(const const_svarint_iterator&) = default;
- const_svarint_iterator(const_svarint_iterator&&) = default;
-
- const_svarint_iterator& operator=(const const_svarint_iterator&) = default;
- const_svarint_iterator& operator=(const_svarint_iterator&&) = default;
-
- ~const_svarint_iterator() = default;
-
- T operator*() {
- const char* d = this->m_data; // will be thrown away
- return static_cast<T>(decode_zigzag64(decode_varint(&d, this->m_end)));
- }
-
- const_svarint_iterator& operator++() {
- // Ignore the result, we call decode_varint() just for the
- // side-effect of updating m_data.
- decode_varint(&this->m_data, this->m_end);
- return *this;
- }
-
- const_svarint_iterator operator++(int) {
- const const_svarint_iterator tmp(*this);
- ++(*this);
- return tmp;
- }
-
- }; // class const_svarint_iterator
-
-public:
-
- /// Forward iterator for iterating over bool (int32 varint) values.
- typedef const_varint_iterator< int32_t> const_bool_iterator;
-
- /// Forward iterator for iterating over enum (int32 varint) values.
- typedef const_varint_iterator< int32_t> const_enum_iterator;
-
- /// Forward iterator for iterating over int32 (varint) values.
- typedef const_varint_iterator< int32_t> const_int32_iterator;
-
- /// Forward iterator for iterating over sint32 (varint) values.
- typedef const_svarint_iterator<int32_t> const_sint32_iterator;
-
- /// Forward iterator for iterating over uint32 (varint) values.
- typedef const_varint_iterator<uint32_t> const_uint32_iterator;
-
- /// Forward iterator for iterating over int64 (varint) values.
- typedef const_varint_iterator< int64_t> const_int64_iterator;
-
- /// Forward iterator for iterating over sint64 (varint) values.
- typedef const_svarint_iterator<int64_t> const_sint64_iterator;
-
- /// Forward iterator for iterating over uint64 (varint) values.
- typedef const_varint_iterator<uint64_t> const_uint64_iterator;
-
- ///@{
- /**
- * @name Repeated packed field accessor functions
- */
-
- /**
- * Consume current "repeated packed bool" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed bool".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_bool_iterator, pbf_reader::const_bool_iterator> get_packed_bool();
-
- /**
- * Consume current "repeated packed enum" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed enum".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_enum_iterator, pbf_reader::const_enum_iterator> get_packed_enum();
-
- /**
- * Consume current "repeated packed int32" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed int32".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_int32_iterator, pbf_reader::const_int32_iterator> get_packed_int32();
-
- /**
- * Consume current "repeated packed sint32" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed sint32".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_sint32_iterator, pbf_reader::const_sint32_iterator> get_packed_sint32();
-
- /**
- * Consume current "repeated packed uint32" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed uint32".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_uint32_iterator, pbf_reader::const_uint32_iterator> get_packed_uint32();
-
- /**
- * Consume current "repeated packed int64" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed int64".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_int64_iterator, pbf_reader::const_int64_iterator> get_packed_int64();
-
- /**
- * Consume current "repeated packed sint64" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed sint64".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_sint64_iterator, pbf_reader::const_sint64_iterator> get_packed_sint64();
-
- /**
- * Consume current "repeated packed uint64" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed uint64".
- * @post The current field was consumed and there is no current field now.
- */
- inline std::pair<pbf_reader::const_uint64_iterator, pbf_reader::const_uint64_iterator> get_packed_uint64();
-
- /**
- * Consume current "repeated packed fixed32" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed fixed32".
- * @post The current field was consumed and there is no current field now.
- */
- inline auto get_packed_fixed32() -> decltype(packed_fixed<uint32_t>()) {
- return packed_fixed<uint32_t>();
- }
-
- /**
- * Consume current "repeated packed sfixed32" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed sfixed32".
- * @post The current field was consumed and there is no current field now.
- */
- inline auto get_packed_sfixed32() -> decltype(packed_fixed<int32_t>()) {
- return packed_fixed<int32_t>();
- }
-
- /**
- * Consume current "repeated packed fixed64" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed fixed64".
- * @post The current field was consumed and there is no current field now.
- */
- inline auto get_packed_fixed64() -> decltype(packed_fixed<uint64_t>()) {
- return packed_fixed<uint64_t>();
- }
-
- /**
- * Consume current "repeated packed sfixed64" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed sfixed64".
- * @post The current field was consumed and there is no current field now.
- */
- inline auto get_packed_sfixed64() -> decltype(packed_fixed<int64_t>()) {
- return packed_fixed<int64_t>();
- }
-
- /**
- * Consume current "repeated packed float" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed float".
- * @post The current field was consumed and there is no current field now.
- */
- inline auto get_packed_float() -> decltype(packed_fixed<float>()) {
- return packed_fixed<float>();
- }
-
- /**
- * Consume current "repeated packed double" field.
- *
- * @returns a pair of iterators to the beginning and one past the end of
- * the data.
- * @pre There must be a current field (ie. next() must have returned `true`).
- * @pre The current field must be of type "repeated packed double".
- * @post The current field was consumed and there is no current field now.
- */
- inline auto get_packed_double() -> decltype(packed_fixed<double>()) {
- return packed_fixed<double>();
- }
-
- ///@}
-
-}; // class pbf_reader
-
-pbf_reader::pbf_reader(const char *data, size_t length) noexcept
- : m_data(data),
- m_end(data + length),
- m_wire_type(pbf_wire_type::unknown),
- m_tag(0) {
-}
-
-pbf_reader::pbf_reader(std::pair<const char *, size_t> data) noexcept
- : m_data(data.first),
- m_end(data.first + data.second),
- m_wire_type(pbf_wire_type::unknown),
- m_tag(0) {
-}
-
-pbf_reader::pbf_reader(const std::string& data) noexcept
- : m_data(data.data()),
- m_end(data.data() + data.size()),
- m_wire_type(pbf_wire_type::unknown),
- m_tag(0) {
-}
-
-pbf_reader::operator bool() const noexcept {
- return m_data < m_end;
-}
-
-bool pbf_reader::next() {
- if (m_data == m_end) {
- return false;
- }
-
- auto value = get_varint<uint32_t>();
- m_tag = value >> 3;
-
- // tags 0 and 19000 to 19999 are not allowed as per
- // https://developers.google.com/protocol-buffers/docs/proto
- protozero_assert(((m_tag > 0 && m_tag < 19000) || (m_tag > 19999 && m_tag <= ((1 << 29) - 1))) && "tag out of range");
-
- m_wire_type = pbf_wire_type(value & 0x07);
- switch (m_wire_type) {
- case pbf_wire_type::varint:
- case pbf_wire_type::fixed64:
- case pbf_wire_type::length_delimited:
- case pbf_wire_type::fixed32:
- break;
- default:
- throw unknown_pbf_wire_type_exception();
- }
-
- return true;
-}
-
-bool pbf_reader::next(pbf_tag_type requested_tag) {
- while (next()) {
- if (m_tag == requested_tag) {
- return true;
- } else {
- skip();
- }
- }
- return false;
-}
-
-pbf_tag_type pbf_reader::tag() const noexcept {
- return m_tag;
-}
-
-pbf_wire_type pbf_reader::wire_type() const noexcept {
- return m_wire_type;
-}
-
-bool pbf_reader::has_wire_type(pbf_wire_type type) const noexcept {
- return wire_type() == type;
-}
-
-void pbf_reader::skip_bytes(pbf_length_type len) {
- if (m_data + len > m_end) {
- throw end_of_buffer_exception();
- }
- m_data += len;
-
-// In debug builds reset the tag to zero so that we can detect (some)
-// wrong code.
-#ifndef NDEBUG
- m_tag = 0;
-#endif
-}
-
-void pbf_reader::skip() {
- protozero_assert(tag() != 0 && "call next() before calling skip()");
- switch (wire_type()) {
- case pbf_wire_type::varint:
- (void)get_uint32(); // called for the side-effect of skipping value
- break;
- case pbf_wire_type::fixed64:
- skip_bytes(8);
- break;
- case pbf_wire_type::length_delimited:
- skip_bytes(get_length());
- break;
- case pbf_wire_type::fixed32:
- skip_bytes(4);
- break;
- default:
- throw unknown_pbf_wire_type_exception();
- }
-}
-
-pbf_length_type pbf_reader::get_len_and_skip() {
- auto len = get_length();
- skip_bytes(len);
- return len;
-}
-
-template <typename T>
-T pbf_reader::get_varint() {
- return static_cast<T>(decode_varint(&m_data, m_end));
-}
-
-template <typename T>
-T pbf_reader::get_svarint() {
- protozero_assert((has_wire_type(pbf_wire_type::varint) || has_wire_type(pbf_wire_type::length_delimited)) && "not a varint");
- return static_cast<T>(decode_zigzag64(decode_varint(&m_data, m_end)));
-}
-
-uint32_t pbf_reader::get_fixed32() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed");
- return get_fixed<uint32_t>();
-}
-
-int32_t pbf_reader::get_sfixed32() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed");
- return get_fixed<int32_t>();
-}
-
-uint64_t pbf_reader::get_fixed64() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed");
- return get_fixed<uint64_t>();
-}
-
-int64_t pbf_reader::get_sfixed64() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed");
- return get_fixed<int64_t>();
-}
-
-float pbf_reader::get_float() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::fixed32) && "not a 32-bit fixed");
- return get_fixed<float>();
-}
-
-double pbf_reader::get_double() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::fixed64) && "not a 64-bit fixed");
- return get_fixed<double>();
-}
-
-bool pbf_reader::get_bool() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::varint) && "not a varint");
- protozero_assert((*m_data & 0x80) == 0 && "not a 1 byte varint");
- skip_bytes(1);
- return m_data[-1] != 0; // -1 okay because we incremented m_data the line before
-}
-
-std::pair<const char*, pbf_length_type> pbf_reader::get_data() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- protozero_assert(has_wire_type(pbf_wire_type::length_delimited) && "not of type string, bytes or message");
- auto len = get_len_and_skip();
- return std::make_pair(m_data-len, len);
-}
-
-std::string pbf_reader::get_bytes() {
- auto d = get_data();
- return std::string(d.first, d.second);
-}
-
-std::string pbf_reader::get_string() {
- return get_bytes();
-}
-
-std::pair<pbf_reader::const_bool_iterator, pbf_reader::const_bool_iterator> pbf_reader::get_packed_bool() {
- return get_packed_int32();
-}
-
-std::pair<pbf_reader::const_enum_iterator, pbf_reader::const_enum_iterator> pbf_reader::get_packed_enum() {
- return get_packed_int32();
-}
-
-std::pair<pbf_reader::const_int32_iterator, pbf_reader::const_int32_iterator> pbf_reader::get_packed_int32() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- return std::make_pair(pbf_reader::const_int32_iterator(m_data-len, m_data),
- pbf_reader::const_int32_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_uint32_iterator, pbf_reader::const_uint32_iterator> pbf_reader::get_packed_uint32() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- return std::make_pair(pbf_reader::const_uint32_iterator(m_data-len, m_data),
- pbf_reader::const_uint32_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_sint32_iterator, pbf_reader::const_sint32_iterator> pbf_reader::get_packed_sint32() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- return std::make_pair(pbf_reader::const_sint32_iterator(m_data-len, m_data),
- pbf_reader::const_sint32_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_int64_iterator, pbf_reader::const_int64_iterator> pbf_reader::get_packed_int64() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- return std::make_pair(pbf_reader::const_int64_iterator(m_data-len, m_data),
- pbf_reader::const_int64_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_uint64_iterator, pbf_reader::const_uint64_iterator> pbf_reader::get_packed_uint64() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- return std::make_pair(pbf_reader::const_uint64_iterator(m_data-len, m_data),
- pbf_reader::const_uint64_iterator(m_data, m_data));
-}
-
-std::pair<pbf_reader::const_sint64_iterator, pbf_reader::const_sint64_iterator> pbf_reader::get_packed_sint64() {
- protozero_assert(tag() != 0 && "call next() before accessing field value");
- auto len = get_len_and_skip();
- return std::make_pair(pbf_reader::const_sint64_iterator(m_data-len, m_data),
- pbf_reader::const_sint64_iterator(m_data, m_data));
-}
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_READER_HPP
diff --git a/contrib/libosmium/protozero/pbf_types.hpp b/contrib/libosmium/protozero/pbf_types.hpp
deleted file mode 100644
index 9f38584..0000000
--- a/contrib/libosmium/protozero/pbf_types.hpp
+++ /dev/null
@@ -1,49 +0,0 @@
-#ifndef PROTOZERO_PBF_TYPES_HPP
-#define PROTOZERO_PBF_TYPES_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_types.hpp
- *
- * @brief Contains the declaration of low-level types used in the pbf format.
- */
-
-#include <cstdint>
-
-namespace protozero {
-
- /**
- * The type used for field tags (field numbers).
- */
- typedef uint32_t pbf_tag_type;
-
- /**
- * The type used to encode type information.
- * See the table on
- * https://developers.google.com/protocol-buffers/docs/encoding
- */
- enum class pbf_wire_type : uint32_t {
- varint = 0, // int32/64, uint32/64, sint32/64, bool, enum
- fixed64 = 1, // fixed64, sfixed64, double
- length_delimited = 2, // string, bytes, embedded messages,
- // packed repeated fields
- fixed32 = 5, // fixed32, sfixed32, float
- unknown = 99 // used for default setting in this library
- };
-
- /**
- * The type used for length values, such as the length of a field.
- */
- typedef uint32_t pbf_length_type;
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_TYPES_HPP
diff --git a/contrib/libosmium/protozero/pbf_writer.hpp b/contrib/libosmium/protozero/pbf_writer.hpp
deleted file mode 100644
index e4e02de..0000000
--- a/contrib/libosmium/protozero/pbf_writer.hpp
+++ /dev/null
@@ -1,666 +0,0 @@
-#ifndef PROTOZERO_PBF_WRITER_HPP
-#define PROTOZERO_PBF_WRITER_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file pbf_writer.hpp
- *
- * @brief Contains the pbf_writer class.
- */
-
-#include <cassert>
-#include <cstddef>
-#include <cstdint>
-#include <cstring>
-#include <iterator>
-#include <limits>
-#include <string>
-
-#include <protozero/pbf_types.hpp>
-#include <protozero/varint.hpp>
-
-#if __BYTE_ORDER != __LITTLE_ENDIAN
-# include <protozero/byteswap.hpp>
-#endif
-
-/// Wrapper for assert() used for testing
-#ifndef protozero_assert
-# define protozero_assert(x) assert(x)
-#endif
-
-namespace protozero {
-
-/**
- * The pbf_writer is used to write PBF formatted messages into a buffer.
- *
- * Almost all methods in this class can throw an std::bad_alloc exception if
- * the std::string used as a buffer wants to resize.
- */
-class pbf_writer {
-
- std::string* m_data;
- pbf_writer* m_parent_writer;
- size_t m_pos = 0;
-
- inline void add_varint(uint64_t value) {
- protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
- protozero_assert(m_data);
- write_varint(std::back_inserter(*m_data), value);
- }
-
- inline void add_field(pbf_tag_type tag, pbf_wire_type type) {
- protozero_assert(((tag > 0 && tag < 19000) || (tag > 19999 && tag <= ((1 << 29) - 1))) && "tag out of range");
- uint32_t b = (tag << 3) | uint32_t(type);
- add_varint(b);
- }
-
- inline void add_tagged_varint(pbf_tag_type tag, uint64_t value) {
- add_field(tag, pbf_wire_type::varint);
- add_varint(value);
- }
-
- template <typename T>
- inline void add_fixed(T value) {
- protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
- protozero_assert(m_data);
-#if __BYTE_ORDER == __LITTLE_ENDIAN
- m_data->append(reinterpret_cast<const char*>(&value), sizeof(T));
-#else
- auto size = m_data->size();
- m_data->resize(size + sizeof(T));
- byteswap<sizeof(T)>(reinterpret_cast<const char*>(&value), const_cast<char*>(m_data->data() + size));
-#endif
- }
-
- template <typename T, typename It>
- inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::input_iterator_tag) {
- if (first == last) {
- return;
- }
-
- pbf_writer sw(*this, tag);
-
- while (first != last) {
- sw.add_fixed<T>(*first++);
- }
- }
-
- template <typename T, typename It>
- inline void add_packed_fixed(pbf_tag_type tag, It first, It last, std::forward_iterator_tag) {
- if (first == last) {
- return;
- }
-
- add_length_varint(tag, sizeof(T) * pbf_length_type(std::distance(first, last)));
-
- while (first != last) {
- add_fixed<T>(*first++);
- }
- }
-
- template <typename It>
- inline void add_packed_varint(pbf_tag_type tag, It first, It last) {
- if (first == last) {
- return;
- }
-
- pbf_writer sw(*this, tag);
-
- while (first != last) {
- sw.add_varint(uint64_t(*first++));
- }
- }
-
- template <typename It>
- inline void add_packed_svarint(pbf_tag_type tag, It first, It last) {
- if (first == last) {
- return;
- }
-
- pbf_writer sw(*this, tag);
-
- while (first != last) {
- sw.add_varint(encode_zigzag64(*first++));
- }
- }
-
- // The number of bytes to reserve for the varint holding the length of
- // a length-delimited field. The length has to fit into pbf_length_type,
- // and a varint needs 8 bit for every 7 bit.
- static const int reserve_bytes = sizeof(pbf_length_type) * 8 / 7 + 1;
-
- inline void open_submessage(pbf_tag_type tag) {
- protozero_assert(m_pos == 0);
- protozero_assert(m_data);
- add_field(tag, pbf_wire_type::length_delimited);
- m_data->append(size_t(reserve_bytes), '\0');
- m_pos = m_data->size();
- }
-
- inline void close_submessage() {
- protozero_assert(m_pos != 0);
- protozero_assert(m_data);
- auto length = pbf_length_type(m_data->size() - m_pos);
-
- protozero_assert(m_data->size() >= m_pos - reserve_bytes);
- auto n = write_varint(m_data->begin() + long(m_pos) - reserve_bytes, length);
-
- m_data->erase(m_data->begin() + long(m_pos) - reserve_bytes + n, m_data->begin() + long(m_pos));
- m_pos = 0;
- }
-
- inline void add_length_varint(pbf_tag_type tag, pbf_length_type length) {
- add_field(tag, pbf_wire_type::length_delimited);
- add_varint(length);
- }
-
-public:
-
- /**
- * Create a writer using the given string as a data store. The pbf_writer
- * stores a reference to that string and adds all data to it.
- */
- inline explicit pbf_writer(std::string& data) noexcept :
- m_data(&data),
- m_parent_writer(nullptr),
- m_pos(0) {
- }
-
- /**
- * Create a writer without a data store. In this form the writer can not
- * be used!
- */
- inline pbf_writer() noexcept :
- m_data(nullptr),
- m_parent_writer(nullptr),
- m_pos(0) {
- }
-
- /**
- * Construct a pbf_writer for a submessage from the pbf_writer of the
- * parent message.
- *
- * @param parent_writer The pbf_writer
- * @param tag Tag (field number) of the field that will be written
- */
- inline pbf_writer(pbf_writer& parent_writer, pbf_tag_type tag) :
- m_data(parent_writer.m_data),
- m_parent_writer(&parent_writer),
- m_pos(0) {
- m_parent_writer->open_submessage(tag);
- }
-
- /// A pbf_writer object can be copied
- pbf_writer(const pbf_writer&) noexcept = default;
-
- /// A pbf_writer object can be copied
- pbf_writer& operator=(const pbf_writer&) noexcept = default;
-
- /// A pbf_writer object can be moved
- inline pbf_writer(pbf_writer&&) noexcept = default;
-
- /// A pbf_writer object can be moved
- inline pbf_writer& operator=(pbf_writer&&) noexcept = default;
-
- inline ~pbf_writer() {
- if (m_parent_writer) {
- m_parent_writer->close_submessage();
- }
- }
-
- ///@{
- /**
- * @name Scalar field writer functions
- */
-
- /**
- * Add "bool" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_bool(pbf_tag_type tag, bool value) {
- add_field(tag, pbf_wire_type::varint);
- protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
- protozero_assert(m_data);
- m_data->append(1, value);
- }
-
- /**
- * Add "enum" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_enum(pbf_tag_type tag, int32_t value) {
- add_tagged_varint(tag, uint64_t(value));
- }
-
- /**
- * Add "int32" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_int32(pbf_tag_type tag, int32_t value) {
- add_tagged_varint(tag, uint64_t(value));
- }
-
- /**
- * Add "sint32" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_sint32(pbf_tag_type tag, int32_t value) {
- add_tagged_varint(tag, encode_zigzag32(value));
- }
-
- /**
- * Add "uint32" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_uint32(pbf_tag_type tag, uint32_t value) {
- add_tagged_varint(tag, value);
- }
-
- /**
- * Add "int64" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_int64(pbf_tag_type tag, int64_t value) {
- add_tagged_varint(tag, uint64_t(value));
- }
-
- /**
- * Add "sint64" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_sint64(pbf_tag_type tag, int64_t value) {
- add_tagged_varint(tag, encode_zigzag64(value));
- }
-
- /**
- * Add "uint64" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_uint64(pbf_tag_type tag, uint64_t value) {
- add_tagged_varint(tag, value);
- }
-
- /**
- * Add "fixed32" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_fixed32(pbf_tag_type tag, uint32_t value) {
- add_field(tag, pbf_wire_type::fixed32);
- add_fixed<uint32_t>(value);
- }
-
- /**
- * Add "sfixed32" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_sfixed32(pbf_tag_type tag, int32_t value) {
- add_field(tag, pbf_wire_type::fixed32);
- add_fixed<int32_t>(value);
- }
-
- /**
- * Add "fixed64" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_fixed64(pbf_tag_type tag, uint64_t value) {
- add_field(tag, pbf_wire_type::fixed64);
- add_fixed<uint64_t>(value);
- }
-
- /**
- * Add "sfixed64" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_sfixed64(pbf_tag_type tag, int64_t value) {
- add_field(tag, pbf_wire_type::fixed64);
- add_fixed<int64_t>(value);
- }
-
- /**
- * Add "float" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_float(pbf_tag_type tag, float value) {
- add_field(tag, pbf_wire_type::fixed32);
- add_fixed<float>(value);
- }
-
- /**
- * Add "double" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_double(pbf_tag_type tag, double value) {
- add_field(tag, pbf_wire_type::fixed64);
- add_fixed<double>(value);
- }
-
- /**
- * Add "bytes" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Pointer to value to be written
- * @param size Number of bytes to be written
- */
- inline void add_bytes(pbf_tag_type tag, const char* value, size_t size) {
- protozero_assert(m_pos == 0 && "you can't add fields to a parent pbf_writer if there is an existing pbf_writer for a submessage");
- protozero_assert(m_data);
- assert(size <= std::numeric_limits<pbf_length_type>::max());
- add_length_varint(tag, pbf_length_type(size));
- m_data->append(value, size);
- }
-
- /**
- * Add "bytes" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_bytes(pbf_tag_type tag, const std::string& value) {
- add_bytes(tag, value.data(), value.size());
- }
-
- /**
- * Add "string" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Pointer to value to be written
- * @param size Number of bytes to be written
- */
- inline void add_string(pbf_tag_type tag, const char* value, size_t size) {
- add_bytes(tag, value, size);
- }
-
- /**
- * Add "string" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written
- */
- inline void add_string(pbf_tag_type tag, const std::string& value) {
- add_bytes(tag, value.data(), value.size());
- }
-
- /**
- * Add "string" field to data. Bytes from the value are written until
- * a null byte is encountered. The null byte is not added.
- *
- * @param tag Tag (field number) of the field
- * @param value Pointer to value to be written
- */
- inline void add_string(pbf_tag_type tag, const char* value) {
- add_bytes(tag, value, std::strlen(value));
- }
-
- /**
- * Add "message" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Pointer to message to be written
- * @param size Length of the message
- */
- inline void add_message(pbf_tag_type tag, const char* value, size_t size) {
- add_bytes(tag, value, size);
- }
-
- /**
- * Add "message" field to data.
- *
- * @param tag Tag (field number) of the field
- * @param value Value to be written. The value must be a complete message.
- */
- inline void add_message(pbf_tag_type tag, const std::string& value) {
- add_bytes(tag, value.data(), value.size());
- }
-
- ///@}
-
- ///@{
- /**
- * @name Repeated packed field writer functions
- */
-
- /**
- * Add "repeated packed bool" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to bool.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_bool(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_varint(tag, first, last);
- }
-
- /**
- * Add "repeated packed enum" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int32_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_enum(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_varint(tag, first, last);
- }
-
- /**
- * Add "repeated packed int32" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int32_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_int32(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_varint(tag, first, last);
- }
-
- /**
- * Add "repeated packed sint32" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int32_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_sint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_svarint(tag, first, last);
- }
-
- /**
- * Add "repeated packed uint32" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to uint32_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_uint32(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_varint(tag, first, last);
- }
-
- /**
- * Add "repeated packed int64" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int64_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_int64(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_varint(tag, first, last);
- }
-
- /**
- * Add "repeated packed sint64" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int64_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_sint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_svarint(tag, first, last);
- }
-
- /**
- * Add "repeated packed uint64" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to uint64_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_uint64(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_varint(tag, first, last);
- }
-
- /**
- * Add "repeated packed fixed32" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to uint32_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_fixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_fixed<uint32_t, InputIterator>(tag, first, last,
- typename std::iterator_traits<InputIterator>::iterator_category());
- }
-
- /**
- * Add "repeated packed sfixed32" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int32_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_sfixed32(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_fixed<int32_t, InputIterator>(tag, first, last,
- typename std::iterator_traits<InputIterator>::iterator_category());
- }
-
- /**
- * Add "repeated packed fixed64" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to uint64_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_fixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_fixed<uint64_t, InputIterator>(tag, first, last,
- typename std::iterator_traits<InputIterator>::iterator_category());
- }
-
- /**
- * Add "repeated packed sfixed64" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to int64_t.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_sfixed64(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_fixed<int64_t, InputIterator>(tag, first, last,
- typename std::iterator_traits<InputIterator>::iterator_category());
- }
-
- /**
- * Add "repeated packed float" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to float.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_float(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_fixed<float, InputIterator>(tag, first, last,
- typename std::iterator_traits<InputIterator>::iterator_category());
- }
-
- /**
- * Add "repeated packed double" field to data.
- *
- * @tparam InputIterator An type satisfying the InputIterator concept.
- * Dereferencing the iterator must yield a type assignable to double.
- * @param tag Tag (field number) of the field
- * @param first Iterator pointing to the beginning of the data
- * @param last Iterator pointing one past the end of data
- */
- template <typename InputIterator>
- inline void add_packed_double(pbf_tag_type tag, InputIterator first, InputIterator last) {
- add_packed_fixed<double, InputIterator>(tag, first, last,
- typename std::iterator_traits<InputIterator>::iterator_category());
- }
-
- ///@}
-
-}; // class pbf_writer
-
-} // end namespace protozero
-
-#endif // PROTOZERO_PBF_WRITER_HPP
diff --git a/contrib/libosmium/protozero/varint.hpp b/contrib/libosmium/protozero/varint.hpp
deleted file mode 100644
index 27536fd..0000000
--- a/contrib/libosmium/protozero/varint.hpp
+++ /dev/null
@@ -1,132 +0,0 @@
-#ifndef PROTOZERO_VARINT_HPP
-#define PROTOZERO_VARINT_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-/**
- * @file varint.hpp
- *
- * @brief Contains low-level varint and zigzag encoding and decoding functions.
- */
-
-#include <cstdint>
-
-#include <protozero/exception.hpp>
-
-namespace protozero {
-
-/**
- * The maximum length of a 64bit varint.
- */
-const int8_t max_varint_length = sizeof(uint64_t) * 8 / 7 + 1;
-
-// from https://github.com/facebook/folly/blob/master/folly/Varint.h
-/**
- * Decode a 64bit varint.
- *
- * String exception guarantee: if there is an exception the data pointer will
- * not be changed.
- *
- * @param[in,out] data Pointer to pointer to the input data. After the function
- * returns this will point to the next data to be read.
- * @param[in] end Pointer one past the end of the input data.
- * @returns The decoded integer
- * @throws varint_too_long_exception if the varint is longer then the maximum
- * length that would fit in a 64bit int. Usually this means your data
- * is corrupted or you are trying to read something as a varint that
- * isn't.
- * @throws end_of_buffer_exception if the *end* of the buffer was reached
- * before the end of the varint.
- */
-inline uint64_t decode_varint(const char** data, const char* end) {
- const int8_t* begin = reinterpret_cast<const int8_t*>(*data);
- const int8_t* iend = reinterpret_cast<const int8_t*>(end);
- const int8_t* p = begin;
- uint64_t val = 0;
-
- if (iend - begin >= max_varint_length) { // fast path
- do {
- int64_t b;
- b = *p++; val = uint64_t((b & 0x7f) ); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 7); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 14); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 21); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 28); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 35); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 42); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 49); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 56); if (b >= 0) break;
- b = *p++; val |= uint64_t((b & 0x7f) << 63); if (b >= 0) break;
- throw varint_too_long_exception();
- } while (false);
- } else {
- int shift = 0;
- while (p != iend && *p < 0) {
- val |= uint64_t(*p++ & 0x7f) << shift;
- shift += 7;
- }
- if (p == iend) {
- throw end_of_buffer_exception();
- }
- val |= uint64_t(*p++) << shift;
- }
-
- *data = reinterpret_cast<const char*>(p);
- return val;
-}
-
-/**
- * Varint-encode a 64bit integer.
- */
-template <typename OutputIterator>
-inline int write_varint(OutputIterator data, uint64_t value) {
- int n=1;
-
- while (value >= 0x80) {
- *data++ = char((value & 0x7f) | 0x80);
- value >>= 7;
- ++n;
- }
- *data++ = char(value);
-
- return n;
-}
-
-/**
- * ZigZag encodes a 32 bit integer.
- */
-inline uint32_t encode_zigzag32(int32_t value) noexcept {
- return (static_cast<uint32_t>(value) << 1) ^ (static_cast<uint32_t>(value >> 31));
-}
-
-/**
- * ZigZag encodes a 64 bit integer.
- */
-inline uint64_t encode_zigzag64(int64_t value) noexcept {
- return (static_cast<uint64_t>(value) << 1) ^ (static_cast<uint64_t>(value >> 63));
-}
-
-/**
- * Decodes a 32 bit ZigZag-encoded integer.
- */
-inline int32_t decode_zigzag32(uint32_t value) noexcept {
- return int32_t(value >> 1) ^ -int32_t(value & 1);
-}
-
-/**
- * Decodes a 64 bit ZigZag-encoded integer.
- */
-inline int64_t decode_zigzag64(uint64_t value) noexcept {
- return int64_t(value >> 1) ^ -int64_t(value & 1);
-}
-
-} // end namespace protozero
-
-#endif // PROTOZERO_VARINT_HPP
diff --git a/contrib/libosmium/protozero/version.hpp b/contrib/libosmium/protozero/version.hpp
deleted file mode 100644
index f11d303..0000000
--- a/contrib/libosmium/protozero/version.hpp
+++ /dev/null
@@ -1,22 +0,0 @@
-#ifndef PROTOZERO_VERSION_HPP
-#define PROTOZERO_VERSION_HPP
-
-/*****************************************************************************
-
-protozero - Minimalistic protocol buffer decoder and encoder in C++.
-
-This file is from https://github.com/mapbox/protozero where you can find more
-documentation.
-
-*****************************************************************************/
-
-#define PROTOZERO_VERSION_MAJOR 1
-#define PROTOZERO_VERSION_MINOR 2
-#define PROTOZERO_VERSION_PATCH 2
-
-#define PROTOZERO_VERSION_CODE (PROTOZERO_VERSION_MAJOR * 10000 + PROTOZERO_VERSION_MINOR * 100 + PROTOZERO_VERSION_PATCH)
-
-#define PROTOZERO_VERSION_STRING "1.2.2"
-
-
-#endif // PROTOZERO_VERSION_HPP
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/osm2pgsql.git
More information about the Pkg-grass-devel
mailing list