Merge commit '8511256779228db8d2ffed7ccced2b53c70be248' as 'third_party/libosmium'
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/memory/buffer.hpp>
|
||||
|
||||
TEST_CASE("Buffer basics") {
|
||||
|
||||
osmium::memory::Buffer invalid_buffer1;
|
||||
osmium::memory::Buffer invalid_buffer2;
|
||||
osmium::memory::Buffer empty_buffer1(1024);
|
||||
osmium::memory::Buffer empty_buffer2(2048);
|
||||
|
||||
REQUIRE(!invalid_buffer1);
|
||||
REQUIRE(!invalid_buffer2);
|
||||
REQUIRE(empty_buffer1);
|
||||
REQUIRE(empty_buffer2);
|
||||
|
||||
REQUIRE(invalid_buffer1 == invalid_buffer2);
|
||||
REQUIRE(invalid_buffer1 != empty_buffer1);
|
||||
REQUIRE(empty_buffer1 != empty_buffer2);
|
||||
|
||||
REQUIRE(invalid_buffer1.capacity() == 0);
|
||||
REQUIRE(invalid_buffer1.written() == 0);
|
||||
REQUIRE(invalid_buffer1.committed() == 0);
|
||||
|
||||
REQUIRE(empty_buffer1.capacity() == 1024);
|
||||
REQUIRE(empty_buffer1.written() == 0);
|
||||
REQUIRE(empty_buffer1.committed() == 0);
|
||||
|
||||
REQUIRE(empty_buffer2.capacity() == 2048);
|
||||
REQUIRE(empty_buffer2.written() == 0);
|
||||
REQUIRE(empty_buffer2.committed() == 0);
|
||||
|
||||
}
|
||||
|
||||
@@ -0,0 +1,199 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/builder/osm_object_builder.hpp>
|
||||
#include <osmium/osm/node.hpp>
|
||||
|
||||
void check_node_1(osmium::Node& node) {
|
||||
REQUIRE(1 == node.id());
|
||||
REQUIRE(3 == node.version());
|
||||
REQUIRE(true == node.visible());
|
||||
REQUIRE(333 == node.changeset());
|
||||
REQUIRE(21 == node.uid());
|
||||
REQUIRE(123 == uint32_t(node.timestamp()));
|
||||
REQUIRE(osmium::Location(3.5, 4.7) == node.location());
|
||||
REQUIRE(std::string("testuser") == node.user());
|
||||
|
||||
for (osmium::memory::Item& item : node) {
|
||||
REQUIRE(osmium::item_type::tag_list == item.type());
|
||||
}
|
||||
|
||||
REQUIRE(node.tags().begin() == node.tags().end());
|
||||
REQUIRE(node.tags().empty());
|
||||
REQUIRE(0 == std::distance(node.tags().begin(), node.tags().end()));
|
||||
}
|
||||
|
||||
void check_node_2(osmium::Node& node) {
|
||||
REQUIRE(2 == node.id());
|
||||
REQUIRE(3 == node.version());
|
||||
REQUIRE(true == node.visible());
|
||||
REQUIRE(333 == node.changeset());
|
||||
REQUIRE(21 == node.uid());
|
||||
REQUIRE(123 == uint32_t(node.timestamp()));
|
||||
REQUIRE(osmium::Location(3.5, 4.7) == node.location());
|
||||
REQUIRE(std::string("testuser") == node.user());
|
||||
|
||||
for (osmium::memory::Item& item : node) {
|
||||
REQUIRE(osmium::item_type::tag_list == item.type());
|
||||
}
|
||||
|
||||
REQUIRE(!node.tags().empty());
|
||||
REQUIRE(2 == std::distance(node.tags().begin(), node.tags().end()));
|
||||
|
||||
int n = 0;
|
||||
for (const osmium::Tag& tag : node.tags()) {
|
||||
switch (n) {
|
||||
case 0:
|
||||
REQUIRE(std::string("amenity") == tag.key());
|
||||
REQUIRE(std::string("bank") == tag.value());
|
||||
break;
|
||||
case 1:
|
||||
REQUIRE(std::string("name") == tag.key());
|
||||
REQUIRE(std::string("OSM Savings") == tag.value());
|
||||
break;
|
||||
}
|
||||
++n;
|
||||
}
|
||||
REQUIRE(2 == n);
|
||||
}
|
||||
|
||||
TEST_CASE("Node in Buffer") {
|
||||
|
||||
constexpr size_t buffer_size = 10000;
|
||||
unsigned char data[buffer_size];
|
||||
|
||||
osmium::memory::Buffer buffer(data, buffer_size, 0);
|
||||
|
||||
SECTION("Add node to buffer") {
|
||||
|
||||
{
|
||||
// add node 1
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
osmium::Node& node = node_builder.object();
|
||||
REQUIRE(osmium::item_type::node == node.type());
|
||||
|
||||
node.set_id(1);
|
||||
node.set_version(3);
|
||||
node.set_visible(true);
|
||||
node.set_changeset(333);
|
||||
node.set_uid(21);
|
||||
node.set_timestamp(123);
|
||||
node.set_location(osmium::Location(3.5, 4.7));
|
||||
|
||||
node_builder.add_user("testuser");
|
||||
|
||||
buffer.commit();
|
||||
}
|
||||
|
||||
{
|
||||
// add node 2
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
osmium::Node& node = node_builder.object();
|
||||
REQUIRE(osmium::item_type::node == node.type());
|
||||
|
||||
node.set_id(2);
|
||||
node.set_version(3);
|
||||
node.set_visible(true);
|
||||
node.set_changeset(333);
|
||||
node.set_uid(21);
|
||||
node.set_timestamp(123);
|
||||
node.set_location(osmium::Location(3.5, 4.7));
|
||||
|
||||
node_builder.add_user("testuser");
|
||||
|
||||
{
|
||||
osmium::builder::TagListBuilder tag_builder(buffer, &node_builder);
|
||||
tag_builder.add_tag("amenity", "bank");
|
||||
tag_builder.add_tag("name", "OSM Savings");
|
||||
}
|
||||
|
||||
buffer.commit();
|
||||
}
|
||||
|
||||
REQUIRE(2 == std::distance(buffer.begin(), buffer.end()));
|
||||
int item_no = 0;
|
||||
for (osmium::memory::Item& item : buffer) {
|
||||
REQUIRE(osmium::item_type::node == item.type());
|
||||
|
||||
osmium::Node& node = static_cast<osmium::Node&>(item);
|
||||
|
||||
switch (item_no) {
|
||||
case 0:
|
||||
check_node_1(node);
|
||||
break;
|
||||
case 1:
|
||||
check_node_2(node);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
++item_no;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
SECTION("Add buffer to another one") {
|
||||
|
||||
{
|
||||
// add node 1
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
osmium::Node& node = node_builder.object();
|
||||
REQUIRE(osmium::item_type::node == node.type());
|
||||
|
||||
node.set_id(1);
|
||||
node.set_version(3);
|
||||
node.set_visible(true);
|
||||
node.set_changeset(333);
|
||||
node.set_uid(21);
|
||||
node.set_timestamp(123);
|
||||
node.set_location(osmium::Location(3.5, 4.7));
|
||||
|
||||
node_builder.add_user("testuser");
|
||||
|
||||
buffer.commit();
|
||||
}
|
||||
|
||||
osmium::memory::Buffer buffer2(buffer_size, osmium::memory::Buffer::auto_grow::yes);
|
||||
|
||||
buffer2.add_buffer(buffer);
|
||||
buffer2.commit();
|
||||
|
||||
REQUIRE(buffer.committed() == buffer2.committed());
|
||||
const osmium::Node& node = buffer2.get<osmium::Node>(0);
|
||||
REQUIRE(node.id() == 1);
|
||||
REQUIRE(123 == uint32_t(node.timestamp()));
|
||||
}
|
||||
|
||||
SECTION("Use back_inserter on buffer") {
|
||||
|
||||
{
|
||||
// add node 1
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
osmium::Node& node = node_builder.object();
|
||||
REQUIRE(osmium::item_type::node == node.type());
|
||||
|
||||
node.set_id(1);
|
||||
node.set_version(3);
|
||||
node.set_visible(true);
|
||||
node.set_changeset(333);
|
||||
node.set_uid(21);
|
||||
node.set_timestamp(123);
|
||||
node.set_location(osmium::Location(3.5, 4.7));
|
||||
|
||||
node_builder.add_user("testuser");
|
||||
|
||||
buffer.commit();
|
||||
}
|
||||
|
||||
osmium::memory::Buffer buffer2(buffer_size, osmium::memory::Buffer::auto_grow::yes);
|
||||
|
||||
std::copy(buffer.begin(), buffer.end(), std::back_inserter(buffer2));
|
||||
|
||||
REQUIRE(buffer.committed() == buffer2.committed());
|
||||
const osmium::Node& node = buffer2.get<osmium::Node>(0);
|
||||
REQUIRE(node.id() == 1);
|
||||
REQUIRE(123 == uint32_t(node.timestamp()));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,186 @@
|
||||
#include "catch.hpp"
|
||||
|
||||
#include <osmium/builder/osm_object_builder.hpp>
|
||||
#include <osmium/osm/node.hpp>
|
||||
|
||||
struct CallbackClass {
|
||||
|
||||
int count = 0;
|
||||
|
||||
void moving_in_buffer(size_t old_offset, size_t new_offset) {
|
||||
REQUIRE(old_offset > new_offset);
|
||||
++count;
|
||||
}
|
||||
|
||||
}; // struct CallbackClass
|
||||
|
||||
TEST_CASE("Purge data from buffer") {
|
||||
|
||||
constexpr size_t buffer_size = 10000;
|
||||
|
||||
SECTION("purge empty buffer") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 0);
|
||||
REQUIRE(buffer.committed() == 0);
|
||||
}
|
||||
|
||||
SECTION("purge buffer with one object but nothing to delete") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
}
|
||||
buffer.commit();
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
|
||||
size_t committed = buffer.committed();
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 0);
|
||||
REQUIRE(committed == buffer.committed());
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
|
||||
}
|
||||
|
||||
SECTION("purge buffer with one object which gets deleted") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 0);
|
||||
REQUIRE(buffer.committed() == 0);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
|
||||
}
|
||||
|
||||
SECTION("purge buffer with two objects, first gets deleted") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
size_t size1 = buffer.committed();
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
}
|
||||
buffer.commit();
|
||||
size_t size2 = buffer.committed() - size1;
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 2);
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 1);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
|
||||
REQUIRE(buffer.committed() == size2);
|
||||
}
|
||||
|
||||
SECTION("purge buffer with two objects, second gets deleted") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser_longer_name");
|
||||
}
|
||||
buffer.commit();
|
||||
size_t size1 = buffer.committed();
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 2);
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 0);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 1);
|
||||
REQUIRE(buffer.committed() == size1);
|
||||
}
|
||||
|
||||
SECTION("purge buffer with three objects, middle one gets deleted") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser_longer_name");
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("sn");
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 1);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 2);
|
||||
}
|
||||
|
||||
SECTION("purge buffer with three objects, all get deleted") {
|
||||
osmium::memory::Buffer buffer(buffer_size);
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser_longer_name");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("testuser");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
{
|
||||
osmium::builder::NodeBuilder node_builder(buffer);
|
||||
node_builder.add_user("sn");
|
||||
node_builder.object().set_removed(true);
|
||||
}
|
||||
buffer.commit();
|
||||
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 3);
|
||||
|
||||
CallbackClass callback;
|
||||
buffer.purge_removed(&callback);
|
||||
|
||||
REQUIRE(callback.count == 0);
|
||||
REQUIRE(std::distance(buffer.begin(), buffer.end()) == 0);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user