From b5809ed9a18682c398999c3966729b884376e029 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 13 Jan 2019 12:02:47 +0100 Subject: [PATCH 1/2] Hand outputs a shared pointer to the middle query object Binds the lifetime of the middle objects to the outputs. --- osm2pgsql.cpp | 6 ++- osmdata.cpp | 2 +- output-gazetteer.hpp | 36 +++++++------ output-multi.cpp | 36 ++++++------- output-multi.hpp | 17 +++--- output-null.cpp | 21 +++++--- output-null.hpp | 10 ++-- output-pgsql.cpp | 27 +++++----- output-pgsql.hpp | 10 ++-- output.cpp | 52 ++++++++++++------- output.hpp | 17 +++--- tests/common.hpp | 17 ++++++ tests/middle-tests.hpp | 41 ++++++++------- tests/test-hstore-match-only.cpp | 9 +--- tests/test-options-parse.cpp | 10 ++-- tests/test-options-projection.cpp | 7 +-- tests/test-output-multi-line-storage.cpp | 13 +---- tests/test-output-multi-line.cpp | 18 +++++-- tests/test-output-multi-point-multi-table.cpp | 16 ++++-- tests/test-output-multi-point.cpp | 20 ++++--- tests/test-output-multi-poly-trivial.cpp | 17 +----- tests/test-output-multi-polygon.cpp | 20 ++++--- tests/test-output-multi-tags.cpp | 13 +---- tests/test-output-pgsql-area.cpp | 8 +-- tests/test-output-pgsql-schema.cpp | 9 +--- tests/test-output-pgsql-tablespace.cpp | 9 +--- tests/test-output-pgsql-validgeom.cpp | 9 +--- tests/test-output-pgsql-z_order.cpp | 9 +--- tests/test-output-pgsql.cpp | 46 +++++----------- tests/test-parse-diff.cpp | 6 ++- tests/test-parse-extra-args.cpp | 4 +- tests/test-parse-xml2.cpp | 6 ++- 32 files changed, 276 insertions(+), 265 deletions(-) diff --git a/osm2pgsql.cpp b/osm2pgsql.cpp index fc1d41289..2b3d00ec6 100644 --- a/osm2pgsql.cpp +++ b/osm2pgsql.cpp @@ -60,11 +60,13 @@ int main(int argc, char *argv[]) if (options.slim) { auto mid = std::make_shared(); - outputs = output_t::create_outputs(mid.get(), options); + outputs = output_t::create_outputs( + std::static_pointer_cast(mid), options); middle = std::static_pointer_cast(mid); } else { auto mid = std::make_shared(); - outputs = output_t::create_outputs(mid.get(), options); + outputs = output_t::create_outputs( + std::static_pointer_cast(mid), options); middle = std::static_pointer_cast(mid); } diff --git a/osmdata.cpp b/osmdata.cpp index 1fb13995c..c1e4b2125 100644 --- a/osmdata.cpp +++ b/osmdata.cpp @@ -253,7 +253,7 @@ struct pending_threaded_processor : public middle_t::pending_processor { //clone the outs output_vec_t out_clones; for (const auto& out: outs) { - out_clones.push_back(out->clone(mid_clone.get())); + out_clones.push_back(out->clone(mid_clone)); } //keep the clones for a specific thread to use diff --git a/output-gazetteer.hpp b/output-gazetteer.hpp index bc82e5ca8..c173797eb 100644 --- a/output-gazetteer.hpp +++ b/output-gazetteer.hpp @@ -14,36 +14,38 @@ #include "pgsql.hpp" #include "util.hpp" - -class output_gazetteer_t : public output_t { -public: - output_gazetteer_t(const middle_query_t *mid_, const options_t &options_) - : output_t(mid_, options_), Connection(NULL), ConnectionDelete(NULL), - ConnectionError(NULL), copy_active(false), - m_builder(options_.projection, true), single_fmt("%1%"), +class output_gazetteer_t : public output_t +{ + output_gazetteer_t(output_gazetteer_t const *other, + std::shared_ptr const &cloned_mid) + : output_t(cloned_mid, other->m_options), Connection(NULL), + ConnectionDelete(NULL), ConnectionError(NULL), copy_active(false), + m_builder(other->m_options.projection, true), + single_fmt(other->single_fmt), osmium_buffer(PLACE_BUFFER_SIZE, osmium::memory::Buffer::auto_grow::yes) { buffer.reserve(PLACE_BUFFER_SIZE); - m_style.load_style(options_.style); + connect(); } - output_gazetteer_t(const output_gazetteer_t &other) - : output_t(other.m_mid, other.m_options), Connection(NULL), - ConnectionDelete(NULL), ConnectionError(NULL), copy_active(false), - m_builder(other.m_options.projection, true), single_fmt(other.single_fmt), +public: + output_gazetteer_t(std::shared_ptr const &mid, + options_t const &options) + : output_t(mid, options), Connection(NULL), ConnectionDelete(NULL), + ConnectionError(NULL), copy_active(false), + m_builder(options.projection, true), single_fmt("%1%"), osmium_buffer(PLACE_BUFFER_SIZE, osmium::memory::Buffer::auto_grow::yes) { buffer.reserve(PLACE_BUFFER_SIZE); - connect(); + m_style.load_style(options.style); } virtual ~output_gazetteer_t() {} - std::shared_ptr clone(const middle_query_t* cloned_middle) const override + std::shared_ptr + clone(std::shared_ptr const &mid) const override { - output_gazetteer_t *clone = new output_gazetteer_t(*this); - clone->m_mid = cloned_middle; - return std::shared_ptr(clone); + return std::shared_ptr(new output_gazetteer_t(this, mid)); } int start() override; diff --git a/output-multi.cpp b/output-multi.cpp index ed0481069..da5d8c282 100644 --- a/output-multi.cpp +++ b/output-multi.cpp @@ -11,12 +11,12 @@ #include #include -output_multi_t::output_multi_t(const std::string &name, +output_multi_t::output_multi_t(std::string const &name, std::shared_ptr processor_, - const struct export_list &export_list_, - const middle_query_t *mid_, - const options_t &options_) -: output_t(mid_, options_), + export_list const &export_list_, + std::shared_ptr const &mid, + options_t const &options) +: output_t(mid, options), m_tagtransform(tagtransform_t::make_tagtransform(&m_options)), m_export_list(new export_list(export_list_)), m_processor(processor_), m_proj(m_options.projection), @@ -40,31 +40,31 @@ output_multi_t::output_multi_t(const std::string &name, { } -output_multi_t::output_multi_t(const output_multi_t &other) -: output_t(other.m_mid, other.m_options), +output_multi_t::output_multi_t(output_multi_t const *other, + std::shared_ptr const &mid) +: output_t(mid, other->m_options), m_tagtransform(tagtransform_t::make_tagtransform(&m_options)), - m_export_list(new export_list(*other.m_export_list)), - m_processor(other.m_processor), m_proj(other.m_proj), - m_osm_type(other.m_osm_type), m_table(new table_t(*other.m_table)), + m_export_list(new export_list(*other->m_export_list)), + m_processor(other->m_processor), m_proj(other->m_proj), + m_osm_type(other->m_osm_type), m_table(new table_t(*other->m_table)), // NOTE: we need to know which ways were used by relations so each thread // must have a copy of the original marked done ways, its read only so its // ok - ways_done_tracker(other.ways_done_tracker), + ways_done_tracker(other->ways_done_tracker), m_expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox, m_options.projection), buffer(1024, osmium::memory::Buffer::auto_grow::yes), m_builder(m_options.projection, m_options.enable_multi), - m_way_area(other.m_way_area) + m_way_area(other->m_way_area) { } output_multi_t::~output_multi_t() = default; -std::shared_ptr output_multi_t::clone(const middle_query_t* cloned_middle) const +std::shared_ptr +output_multi_t::clone(std::shared_ptr const &mid) const { - auto *clone = new output_multi_t(*this); - clone->m_mid = cloned_middle; - return std::shared_ptr(clone); + return std::shared_ptr(new output_multi_t(this, mid)); } int output_multi_t::start() { @@ -365,7 +365,7 @@ int output_multi_t::process_relation(osmium::Relation const &rel, if (!filter) { //TODO: move this into geometry processor, figure a way to come back for tag transform //grab ways/nodes of the members in the relation, bail if none were used - if (m_relation_helper.set(rel, m_mid) < 1) + if (m_relation_helper.set(rel, m_mid.get()) < 1) return 0; //NOTE: make_polygon is preset here this is to force the tag matching @@ -383,7 +383,7 @@ int output_multi_t::process_relation(osmium::Relation const &rel, outtags, true); if (!filter) { - m_relation_helper.add_way_locations(m_mid); + m_relation_helper.add_way_locations(m_mid.get()); auto geoms = m_processor->process_relation( rel, m_relation_helper.data, &m_builder); for (const auto geom : geoms) { diff --git a/output-multi.hpp b/output-multi.hpp index 7c55d7437..44b4de19c 100644 --- a/output-multi.hpp +++ b/output-multi.hpp @@ -23,16 +23,21 @@ struct export_list; struct middle_query_t; struct options_t; -class output_multi_t : public output_t { +class output_multi_t : public output_t +{ + output_multi_t(output_multi_t const *other, + std::shared_ptr const &mid); + public: - output_multi_t(const std::string &name, + output_multi_t(std::string const &name, std::shared_ptr processor_, - const export_list &export_list_, - const middle_query_t* mid_, const options_t &options_); - output_multi_t(const output_multi_t& other); + export_list const &export_list_, + std::shared_ptr const &mid, + options_t const &options); virtual ~output_multi_t(); - std::shared_ptr clone(const middle_query_t* cloned_middle) const override; + std::shared_ptr + clone(std::shared_ptr const &mid) const override; int start() override; void stop(osmium::thread::Pool *pool) override; diff --git a/output-null.cpp b/output-null.cpp index 3dd054641..216e60665 100644 --- a/output-null.cpp +++ b/output-null.cpp @@ -62,17 +62,22 @@ int output_null_t::relation_modify(osmium::Relation const &) { return 0; } -std::shared_ptr output_null_t::clone(const middle_query_t* cloned_middle) const { - output_null_t *clone = new output_null_t(*this); - clone->m_mid = cloned_middle; - return std::shared_ptr(clone); +std::shared_ptr +output_null_t::clone(std::shared_ptr const &mid) const +{ + return std::shared_ptr(new output_null_t(this, mid)); } -output_null_t::output_null_t(const middle_query_t* mid_, const options_t &options_): output_t(mid_, options_) { +output_null_t::output_null_t(std::shared_ptr const &mid, + options_t const &options) +: output_t(mid, options) +{ } -output_null_t::output_null_t(const output_null_t& other): output_t(other.m_mid, other.m_options) { +output_null_t::output_null_t(output_null_t const *other, + std::shared_ptr const &mid) +: output_t(mid, other->m_options) +{ } -output_null_t::~output_null_t() { -} +output_null_t::~output_null_t() = default; diff --git a/output-null.hpp b/output-null.hpp index d60a0afac..82c469cae 100644 --- a/output-null.hpp +++ b/output-null.hpp @@ -7,12 +7,16 @@ #include "output.hpp" class output_null_t : public output_t { + output_null_t(output_null_t const *other, + std::shared_ptr const &mid); + public: - output_null_t(const middle_query_t* mid_, const options_t &options); - output_null_t(const output_null_t& other); + output_null_t(std::shared_ptr const &mid, + options_t const &options); virtual ~output_null_t(); - std::shared_ptr clone(const middle_query_t* cloned_middle) const override; + std::shared_ptr + clone(std::shared_ptr const &mid) const override; int start() override; void stop(osmium::thread::Pool *pool) override; diff --git a/output-pgsql.cpp b/output-pgsql.cpp index 4e5ee3344..d3dc9febe 100644 --- a/output-pgsql.cpp +++ b/output-pgsql.cpp @@ -502,14 +502,14 @@ int output_pgsql_t::start() return 0; } -std::shared_ptr output_pgsql_t::clone(const middle_query_t* cloned_middle) const +std::shared_ptr +output_pgsql_t::clone(std::shared_ptr const &mid) const { - auto *clone = new output_pgsql_t(*this); - clone->m_mid = cloned_middle; - return std::shared_ptr(clone); + return std::shared_ptr(new output_pgsql_t(this, mid)); } -output_pgsql_t::output_pgsql_t(const middle_query_t *mid, const options_t &o) +output_pgsql_t::output_pgsql_t(std::shared_ptr const &mid, + options_t const &o) : output_t(mid, o), m_builder(o.projection, o.enable_multi), expire(o.expire_tiles_zoom, o.expire_tiles_max_bbox, o.projection), ways_done_tracker(new id_tracker()), @@ -576,23 +576,24 @@ output_pgsql_t::output_pgsql_t(const middle_query_t *mid, const options_t &o) } } -output_pgsql_t::output_pgsql_t(const output_pgsql_t &other) -: output_t(other.m_mid, other.m_options), +output_pgsql_t::output_pgsql_t(output_pgsql_t const *other, + std::shared_ptr const &mid) +: output_t(mid, other->m_options), m_tagtransform(tagtransform_t::make_tagtransform(&m_options)), - m_enable_way_area(other.m_enable_way_area), - m_export_list(new export_list(*other.m_export_list)), - m_builder(m_options.projection, other.m_options.enable_multi), + m_enable_way_area(other->m_enable_way_area), + m_export_list(new export_list(*other->m_export_list)), + m_builder(m_options.projection, other->m_options.enable_multi), expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox, m_options.projection), //NOTE: we need to know which ways were used by relations so each thread //must have a copy of the original marked done ways, its read only so its ok - ways_done_tracker(other.ways_done_tracker), + ways_done_tracker(other->ways_done_tracker), buffer(1024, osmium::memory::Buffer::auto_grow::yes), rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes) { - for(std::vector >::const_iterator t = other.m_tables.begin(); t != other.m_tables.end(); ++t) { + for (auto const &t : other->m_tables) { //copy constructor will just connect to the already there table - m_tables.push_back(std::shared_ptr(new table_t(**t))); + m_tables.push_back(std::shared_ptr(new table_t(*t.get()))); } } diff --git a/output-pgsql.hpp b/output-pgsql.hpp index 39d67c7a5..1b08bf5b6 100644 --- a/output-pgsql.hpp +++ b/output-pgsql.hpp @@ -17,16 +17,20 @@ #include class output_pgsql_t : public output_t { + output_pgsql_t(output_pgsql_t const *other, + std::shared_ptr const &mid); + public: enum table_id { t_point = 0, t_line, t_poly, t_roads, t_MAX }; - output_pgsql_t(const middle_query_t* mid_, const options_t &options_); + output_pgsql_t(std::shared_ptr const &mid, + options_t const &options); virtual ~output_pgsql_t(); - output_pgsql_t(const output_pgsql_t& other); - std::shared_ptr clone(const middle_query_t* cloned_middle) const override; + std::shared_ptr + clone(std::shared_ptr const &mid) const override; int start() override; void stop(osmium::thread::Pool *pool) override; diff --git a/output.cpp b/output.cpp index c547068b6..d575ad450 100644 --- a/output.cpp +++ b/output.cpp @@ -25,9 +25,11 @@ void override_if(T &t, const std::string &key, const pt::ptree &conf) { } } -std::shared_ptr parse_multi_single(const pt::ptree &conf, - const middle_query_t *mid, - const options_t &options) { +std::shared_ptr +parse_multi_single(pt::ptree const &conf, + std::shared_ptr const &mid, + options_t const &options) +{ options_t new_opts = options; std::string name = conf.get("name"); @@ -81,26 +83,32 @@ std::shared_ptr parse_multi_single(const pt::ptree &conf, return std::make_shared(name, processor, columns, mid, new_opts); } -std::vector > parse_multi_config(const middle_query_t *mid, const options_t &options) { +std::vector> +parse_multi_config(std::shared_ptr const &mid, + options_t const &options) +{ std::vector > outputs; - if (!options.style.empty()) { - const std::string file_name(options.style); + if (options.style.empty()) { + throw std::runtime_error("Style file is required for `multi' backend, " + "but was not specified."); + } - try { - pt::ptree conf; - pt::read_json(file_name, conf); + const std::string file_name(options.style); - for (const pt::ptree::value_type &val: conf) { - outputs.push_back(parse_multi_single(val.second, mid, options)); - } + try { + pt::ptree conf; + pt::read_json(file_name, conf); - } catch (const std::exception &e) { - throw std::runtime_error((boost::format("Unable to parse multi config file `%1%': %2%") - % file_name % e.what()).str()); + for (const pt::ptree::value_type &val : conf) { + outputs.push_back(parse_multi_single(val.second, mid, options)); } - } else { - throw std::runtime_error("Style file is required for `multi' backend, but was not specified."); + + } catch (const std::exception &e) { + throw std::runtime_error( + (boost::format("Unable to parse multi config file `%1%': %2%") % + file_name % e.what()) + .str()); } return outputs; @@ -108,7 +116,10 @@ std::vector > parse_multi_config(const middle_query_t } // anonymous namespace -std::vector > output_t::create_outputs(const middle_query_t *mid, const options_t &options) { +std::vector> +output_t::create_outputs(std::shared_ptr const &mid, + options_t const &options) +{ std::vector > outputs; if (options.output_backend == "pgsql") { @@ -130,8 +141,9 @@ std::vector > output_t::create_outputs(const middle_qu return outputs; } -output_t::output_t(const middle_query_t *mid_, const options_t &options_) -: m_mid(mid_), m_options(options_) +output_t::output_t(std::shared_ptr const &mid, + options_t const &options) +: m_mid(mid), m_options(options) {} output_t::~output_t() = default; diff --git a/output.hpp b/output.hpp index 30525320f..ade00682b 100644 --- a/output.hpp +++ b/output.hpp @@ -12,7 +12,6 @@ #include -#include #include #include "options.hpp" @@ -31,14 +30,19 @@ struct pending_job_t { typedef std::stack pending_queue_t; -class output_t : public boost::noncopyable { +class output_t +{ public: - static std::vector > create_outputs(const middle_query_t *mid, const options_t &options); + static std::vector> + create_outputs(std::shared_ptr const &mid, + options_t const &options); - output_t(const middle_query_t *mid, const options_t &options_); + output_t(std::shared_ptr const &mid, + options_t const &options); virtual ~output_t(); - virtual std::shared_ptr clone(const middle_query_t* cloned_middle) const = 0; + virtual std::shared_ptr + clone(std::shared_ptr const &mid) const = 0; virtual int start() = 0; virtual void stop(osmium::thread::Pool *pool) = 0; @@ -70,8 +74,7 @@ class output_t : public boost::noncopyable { virtual void merge_expire_trees(output_t *other); protected: - - const middle_query_t* m_mid; + std::shared_ptr m_mid; const options_t m_options; }; diff --git a/tests/common.hpp b/tests/common.hpp index 638160f90..ae65c088c 100644 --- a/tests/common.hpp +++ b/tests/common.hpp @@ -16,6 +16,23 @@ namespace testing { parser.stream_file(filename, format); osmdata->stop(); } + + template + void run_osm2pgsql(options_t &options, char const *test_file, + char const *file_format) + { + //setup the middle + auto middle = std::make_shared(); + + //setup the backend (output) + auto outputs = output_t::create_outputs( + std::static_pointer_cast(middle), options); + + //let osmdata orchestrate between the middle and the outs + osmdata_t osmdata(std::static_pointer_cast(middle), outputs); + + parse(test_file, file_format, options, &osmdata); + } } #endif /* TEST_COMMON_HPP */ diff --git a/tests/middle-tests.hpp b/tests/middle-tests.hpp index 6c68ceeb0..b571f7fbf 100644 --- a/tests/middle-tests.hpp +++ b/tests/middle-tests.hpp @@ -1,6 +1,7 @@ #ifndef TESTS_MIDDLE_TEST_HPP #define TESTS_MIDDLE_TEST_HPP +#include #include #include "middle.hpp" @@ -35,22 +36,22 @@ class test_middle_helper public: test_middle_helper(options_t const &options) - : m_output(&m_mid, options), + : m_mid(std::make_shared()), m_output(m_mid, options), m_buffer(4096, osmium::memory::Buffer::auto_grow::yes), m_proj(reprojection::create_projection(PROJ_LATLONG)) { - m_mid.start(&options); + m_mid->start(&options); } ~test_middle_helper() { commit_and_stop(); } - void start(options_t const *options) { m_mid.start(options); } + void start(options_t const *options) { m_mid->start(options); } void commit_and_stop() { osmium::thread::Pool pool(1); - m_mid.commit(); - m_mid.stop(pool); + m_mid->commit(); + m_mid->stop(pool); } // tests that a single node can be set and retrieved. returns 0 on success. @@ -63,10 +64,10 @@ class test_middle_helper auto &way = m_buffer.get(way_with_nodes({node.id()})); // set the node - m_mid.nodes_set(node); + m_mid->nodes_set(node); // get it back - if (m_mid.nodes_get_list(&(way.nodes())) != way.nodes().size()) { + if (m_mid->nodes_get_list(&(way.nodes())) != way.nodes().size()) { std::cerr << "ERROR: Unable to get node list.\n"; return 1; } @@ -123,13 +124,13 @@ class test_middle_helper for (auto pos : expected_nodes) { auto const &node = m_buffer.get(pos); - m_mid.nodes_set(node); + m_mid->nodes_set(node); ids.push_back(node.id()); } auto &way = m_buffer.get(way_with_nodes(ids)); - if (m_mid.nodes_get_list(&(way.nodes())) != ids.size()) { + if (m_mid->nodes_get_list(&(way.nodes())) != ids.size()) { std::cerr << "ERROR: Unable to get node list.\n"; return 1; } @@ -161,7 +162,7 @@ class test_middle_helper nds.push_back(i); nodes.push_back(add_node(i, lat, lon)); auto const &node = m_buffer.get(nodes.back()); - m_mid.nodes_set(node); + m_mid->nodes_set(node); } // set the way @@ -170,11 +171,11 @@ class test_middle_helper auto pos = osmium::builder::add_way(m_buffer, _id(way_id), _nodes(nds)); auto const &way = m_buffer.get(pos); - m_mid.ways_set(way); + m_mid->ways_set(way); } // commit the setup data - m_mid.commit(); + m_mid->commit(); // get it back osmium::memory::Buffer relbuf(4096, @@ -190,7 +191,7 @@ class test_middle_helper auto buf_pos = m_buffer.committed(); rolelist_t roles; - size_t way_count = m_mid.rel_way_members_get(rel, &roles, m_buffer); + size_t way_count = m_mid->rel_way_members_get(rel, &roles, m_buffer); if (way_count != 1) { std::cerr << "ERROR: Unable to get way list.\n"; return 1; @@ -221,7 +222,7 @@ class test_middle_helper << ", but got back " << way.id() << " from middle.\n"; return 1; } - m_mid.nodes_get_list(&(way.nodes())); + m_mid->nodes_get_list(&(way.nodes())); for (size_t i = 0; i < nds.size(); ++i) { if (way.nodes()[i].location().lon() != lon) { std::cerr << "ERROR: Way node should have lon=" << lon @@ -241,18 +242,18 @@ class test_middle_helper // the way we just inserted should not be pending test_pending_processor tpp; - m_mid.iterate_ways(tpp); - if (m_mid.pending_count() != 0) { + m_mid->iterate_ways(tpp); + if (m_mid->pending_count() != 0) { std::cerr << "ERROR: Was expecting no pending ways, but got " - << m_mid.pending_count() << " from middle.\n"; + << m_mid->pending_count() << " from middle.\n"; return 1; } // some middles don't support changing the nodes - they // don't have diff update ability. here, we will just // skip the test for that. - if (dynamic_cast(&m_mid)) { - slim_middle_t *slim = dynamic_cast(&m_mid); + if (dynamic_cast(m_mid.get())) { + slim_middle_t *slim = dynamic_cast(m_mid.get()); // finally, try touching a node on a non-pending way. that should // make it become pending. we just checked that the way is not @@ -307,7 +308,7 @@ class test_middle_helper static constexpr double test_lat(osmid_t id) { return 1 + 1e-5 * id; } - MID m_mid; + std::shared_ptr m_mid; output_null_t m_output; // simple osmium buffer to store all the objects in diff --git a/tests/test-hstore-match-only.cpp b/tests/test-hstore-match-only.cpp index e67d59ce2..6fcc66d82 100644 --- a/tests/test-hstore-match-only.cpp +++ b/tests/test-hstore-match-only.cpp @@ -42,7 +42,6 @@ int main(int argc, char *argv[]) { } try { - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options; options.database_options = db->database_options; options.num_procs = 1; @@ -53,12 +52,8 @@ int main(int argc, char *argv[]) { options.slim = 1; options.append = false; - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/hstore-match-only.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/hstore-match-only.osm", "xml"); // tables should not contain any tag columns db->check_count(4, "select count(column_name) from information_schema.columns where table_name='osm2pgsql_test_point'"); diff --git a/tests/test-options-parse.cpp b/tests/test-options-parse.cpp index dbec7cccb..44dface63 100644 --- a/tests/test-options-parse.cpp +++ b/tests/test-options-parse.cpp @@ -84,8 +84,8 @@ void test_outputs() { const char* a1[] = {"osm2pgsql", "-O", "pgsql", "--style", "default.style", "tests/liechtenstein-2013-08-03.osm.pbf"}; options_t options = options_t(len(a1), const_cast(a1)); - auto mid = std::make_shared(); - std::vector > outs = output_t::create_outputs(mid.get(), options); + std::shared_ptr mid(new middle_ram_t()); + auto outs = output_t::create_outputs(mid, options); output_t* out = outs.front().get(); if(dynamic_cast(out) == nullptr) { @@ -94,7 +94,7 @@ void test_outputs() const char* a2[] = {"osm2pgsql", "-O", "gazetteer", "--style", "tests/gazetteer-test.style", "tests/liechtenstein-2013-08-03.osm.pbf"}; options = options_t(len(a2), const_cast(a2)); - outs = output_t::create_outputs(mid.get(), options); + outs = output_t::create_outputs(mid, options); out = outs.front().get(); if(dynamic_cast(out) == nullptr) { @@ -103,7 +103,7 @@ void test_outputs() const char* a3[] = {"osm2pgsql", "-O", "null", "--style", "default.style", "tests/liechtenstein-2013-08-03.osm.pbf"}; options = options_t(len(a3), const_cast(a3)); - outs = output_t::create_outputs(mid.get(), options); + outs = output_t::create_outputs(mid, options); out = outs.front().get(); if(dynamic_cast(out) == nullptr) { @@ -114,7 +114,7 @@ void test_outputs() options = options_t(len(a4), const_cast(a4)); try { - outs = output_t::create_outputs(mid.get(), options); + outs = output_t::create_outputs(mid, options); out = outs.front().get(); throw std::logic_error("Expected 'not recognised'"); } diff --git a/tests/test-options-projection.cpp b/tests/test-options-projection.cpp index 6aadff5f6..f6751bc83 100644 --- a/tests/test-options-projection.cpp +++ b/tests/test-options-projection.cpp @@ -43,12 +43,9 @@ static void check_tables(pg::tempdb *db, options_t &options, const std::string &expected) { options.database_options = db->database_options; - auto mid_ram = std::make_shared(); - auto out_test = std::make_shared(mid_ram.get(), options); - osmdata_t osmdata(mid_ram, out_test); - testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/liechtenstein-2013-08-03.osm.pbf", "pbf"); db->check_string(expected, "select find_srid('public', 'planet_osm_roads', 'way')"); } diff --git a/tests/test-output-multi-line-storage.cpp b/tests/test-output-multi-line-storage.cpp index 62835cd47..8bacadd85 100644 --- a/tests/test-output-multi-line-storage.cpp +++ b/tests/test-output-multi-line-storage.cpp @@ -44,17 +44,8 @@ int main(int argc, char *argv[]) { options.output_backend = "multi"; options.style = "tests/test_output_multi_line_trivial.style.json"; - //setup the middle - auto middle = std::make_shared(); - - //setup the backend (output) - std::vector > outputs = output_t::create_outputs(middle.get(), options); - - //let osmdata orchestrate between the middle and the outs - osmdata_t osmdata(middle, outputs); - - testing::parse("tests/test_output_multi_line_storage.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_multi_line_storage.osm", "xml"); db->check_count(1, "select count(*) from pg_catalog.pg_class where relname = 'test_line'"); db->check_count(3, "select count(*) from test_line"); diff --git a/tests/test-output-multi-line.cpp b/tests/test-output-multi-line.cpp index e500f4b6e..4616aba00 100644 --- a/tests/test-output-multi-line.cpp +++ b/tests/test-output-multi-line.cpp @@ -34,7 +34,6 @@ int main(int argc, char *argv[]) { } try { - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options; options.database_options = db->database_options; options.num_procs = 1; @@ -44,12 +43,21 @@ int main(int argc, char *argv[]) { geometry_processor::create("line", &options); export_list columns; - { taginfo info; info.name = "highway"; info.type = "text"; columns.add(osmium::item_type::way, info); } - + { + taginfo info; + info.name = "highway"; + info.type = "text"; + columns.add(osmium::item_type::way, info); + } + + auto mid_pgsql = std::make_shared(); // This actually uses the multi-backend with C transforms, not Lua transforms. This is unusual and doesn't reflect real practice - auto out_test = std::make_shared("foobar_highways", processor, columns, mid_pgsql.get(), options); + auto out_test = std::make_shared( + "foobar_highways", processor, columns, + std::static_pointer_cast(mid_pgsql), options); - osmdata_t osmdata(mid_pgsql, out_test); + osmdata_t osmdata(std::static_pointer_cast(mid_pgsql), + out_test); testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", options, &osmdata); diff --git a/tests/test-output-multi-point-multi-table.cpp b/tests/test-output-multi-point-multi-table.cpp index bc3e574cf..4c3ebef69 100644 --- a/tests/test-output-multi-point-multi-table.cpp +++ b/tests/test-output-multi-point-multi-table.cpp @@ -34,7 +34,6 @@ int main(int argc, char *argv[]) { } try { - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options; options.database_options = db->database_options; options.num_procs = 1; @@ -42,8 +41,14 @@ int main(int argc, char *argv[]) { options.slim = true; export_list columns; - { taginfo info; info.name = "amenity"; info.type = "text"; columns.add(osmium::item_type::node, info); } + { + taginfo info; + info.name = "amenity"; + info.type = "text"; + columns.add(osmium::item_type::node, info); + } + auto mid_pgsql = std::make_shared(); std::vector > outputs; // let's make lots of tables! @@ -53,12 +58,15 @@ int main(int argc, char *argv[]) { std::shared_ptr processor = geometry_processor::create("point", &options); - auto out_test = std::make_shared(name, processor, columns, mid_pgsql.get(), options); + auto out_test = std::make_shared( + name, processor, columns, + std::static_pointer_cast(mid_pgsql), options); outputs.push_back(out_test); } - osmdata_t osmdata(mid_pgsql, outputs); + osmdata_t osmdata(std::static_pointer_cast(mid_pgsql), + outputs); testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", options, &osmdata); diff --git a/tests/test-output-multi-point.cpp b/tests/test-output-multi-point.cpp index 3d33507fd..6668f2b1d 100644 --- a/tests/test-output-multi-point.cpp +++ b/tests/test-output-multi-point.cpp @@ -33,7 +33,6 @@ int main(int argc, char *argv[]) { } try { - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options; options.database_options = db->database_options; options.num_procs = 1; @@ -44,11 +43,20 @@ int main(int argc, char *argv[]) { geometry_processor::create("point", &options); export_list columns; - { taginfo info; info.name = "amenity"; info.type = "text"; columns.add(osmium::item_type::node, info); } - - auto out_test = std::make_shared("foobar_amenities", processor, columns, mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); + { + taginfo info; + info.name = "amenity"; + info.type = "text"; + columns.add(osmium::item_type::node, info); + } + + auto mid_pgsql = std::make_shared(); + auto out_test = std::make_shared( + "foobar_amenities", processor, columns, + std::static_pointer_cast(mid_pgsql), options); + + osmdata_t osmdata(std::static_pointer_cast(mid_pgsql), + out_test); testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", options, &osmdata); diff --git a/tests/test-output-multi-poly-trivial.cpp b/tests/test-output-multi-poly-trivial.cpp index 26d12ed16..a8f8667e3 100644 --- a/tests/test-output-multi-poly-trivial.cpp +++ b/tests/test-output-multi-poly-trivial.cpp @@ -22,20 +22,6 @@ #include "tests/common-pg.hpp" #include "tests/common.hpp" -void run_osm2pgsql(options_t &options) { - //setup the middle - auto middle = std::make_shared(); - - //setup the backend (output) - std::vector > outputs = output_t::create_outputs(middle.get(), options); - - //let osmdata orchestrate between the middle and the outs - osmdata_t osmdata(middle, outputs); - - testing::parse("tests/test_output_multi_poly_trivial.osm", "xml", - options, &osmdata); -} - void check_output_poly_trivial(bool enable_multi, std::shared_ptr db) { options_t options; options.database_options = db->database_options; @@ -48,7 +34,8 @@ void check_output_poly_trivial(bool enable_multi, std::shared_ptr db options.output_backend = "multi"; options.style = "tests/test_output_multi_poly_trivial.style.json"; - run_osm2pgsql(options); + testing::run_osm2pgsql( + options, "tests/test_output_multi_poly_trivial.osm", "xml"); // expect that the table exists db->check_count(1, "select count(*) from pg_catalog.pg_class where relname = 'test_poly'"); diff --git a/tests/test-output-multi-polygon.cpp b/tests/test-output-multi-polygon.cpp index fd7421fad..a918a70c8 100644 --- a/tests/test-output-multi-polygon.cpp +++ b/tests/test-output-multi-polygon.cpp @@ -34,7 +34,6 @@ int main(int argc, char *argv[]) { } try { - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options; options.database_options = db->database_options; options.num_procs = 1; @@ -44,11 +43,20 @@ int main(int argc, char *argv[]) { std::shared_ptr processor = geometry_processor::create("polygon", &options); export_list columns; - { taginfo info; info.name = "building"; info.type = "text"; columns.add(osmium::item_type::way, info); } - - auto out_test = std::make_shared("foobar_buildings", processor, columns, mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); + { + taginfo info; + info.name = "building"; + info.type = "text"; + columns.add(osmium::item_type::way, info); + } + + auto mid_pgsql = std::make_shared(); + auto out_test = std::make_shared( + "foobar_buildings", processor, columns, + std::static_pointer_cast(mid_pgsql), options); + + osmdata_t osmdata(std::static_pointer_cast(mid_pgsql), + out_test); testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", options, &osmdata); diff --git a/tests/test-output-multi-tags.cpp b/tests/test-output-multi-tags.cpp index a0f0da4a1..942aefe10 100644 --- a/tests/test-output-multi-tags.cpp +++ b/tests/test-output-multi-tags.cpp @@ -44,17 +44,8 @@ int main(int argc, char *argv[]) { options.output_backend = "multi"; options.style = "tests/test_output_multi_tags.json"; - //setup the middle - auto middle = std::make_shared(); - - //setup the backend (output) - std::vector > outputs = output_t::create_outputs(middle.get(), options); - - //let osmdata orchestrate between the middle and the outs - osmdata_t osmdata(middle, outputs); - - testing::parse("tests/test_output_multi_tags.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_multi_tags.osm", "xml"); // Check we got the right tables db->check_count(1, "select count(*) from pg_catalog.pg_class where relname = 'test_points_1'"); diff --git a/tests/test-output-pgsql-area.cpp b/tests/test-output-pgsql-area.cpp index 43bc8de8e..bf0b8d7e8 100644 --- a/tests/test-output-pgsql-area.cpp +++ b/tests/test-output-pgsql-area.cpp @@ -60,7 +60,6 @@ void test_area_base(bool latlon, bool reproj, double expect_area_poly, double ex exit(77); } - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options; options.database_options = db->database_options; options.num_procs = 1; @@ -73,11 +72,8 @@ void test_area_base(bool latlon, bool reproj, double expect_area_poly, double ex options.reproject_area = true; } - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - testing::parse("tests/test_output_pgsql_area.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_pgsql_area.osm", "xml"); db->check_count(2, "SELECT COUNT(*) FROM osm2pgsql_test_polygon"); db->check_number(expect_area_poly, "SELECT way_area FROM osm2pgsql_test_polygon WHERE name='poly'"); diff --git a/tests/test-output-pgsql-schema.cpp b/tests/test-output-pgsql-schema.cpp index f74494994..f7457523d 100644 --- a/tests/test-output-pgsql-schema.cpp +++ b/tests/test-output-pgsql-schema.cpp @@ -68,19 +68,14 @@ void test_other_output_schema() { std::string proc_name("test-output-pgsql-schema"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; options.prefix = "osm2pgsql_test"; options.style = "default.style"; - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/test_output_pgsql_z_order.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_pgsql_z_order.osm", "xml"); db->assert_has_table("public.osm2pgsql_test_point"); db->assert_has_table("public.osm2pgsql_test_line"); diff --git a/tests/test-output-pgsql-tablespace.cpp b/tests/test-output-pgsql-tablespace.cpp index 03c9300e5..dc2e73f9d 100644 --- a/tests/test-output-pgsql-tablespace.cpp +++ b/tests/test-output-pgsql-tablespace.cpp @@ -65,7 +65,6 @@ void test_regression_simple() { std::string proc_name("test-output-pgsql"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; @@ -76,12 +75,8 @@ void test_regression_simple() { options.tblsslim_index = "tablespacetest"; options.tblsslim_data = "tablespacetest"; - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/liechtenstein-2013-08-03.osm.pbf", "pbf"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); diff --git a/tests/test-output-pgsql-validgeom.cpp b/tests/test-output-pgsql-validgeom.cpp index 63f22ef3a..ac74eca72 100644 --- a/tests/test-output-pgsql-validgeom.cpp +++ b/tests/test-output-pgsql-validgeom.cpp @@ -64,19 +64,14 @@ void test_z_order() { std::string proc_name("test-output-pgsql-validgeom"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; options.prefix = "osm2pgsql_test"; options.style = "default.style"; - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/test_output_pgsql_validgeom.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_pgsql_validgeom.osm", "xml"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); diff --git a/tests/test-output-pgsql-z_order.cpp b/tests/test-output-pgsql-z_order.cpp index 1fc865fbd..fbd45cbd3 100644 --- a/tests/test-output-pgsql-z_order.cpp +++ b/tests/test-output-pgsql-z_order.cpp @@ -64,19 +64,14 @@ void test_z_order() { std::string proc_name("test-output-pgsql-z_order"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; options.prefix = "osm2pgsql_test"; options.style = "default.style"; - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/test_output_pgsql_z_order.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_pgsql_z_order.osm", "xml"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); diff --git a/tests/test-output-pgsql.cpp b/tests/test-output-pgsql.cpp index 20be03b6e..522c78ab2 100644 --- a/tests/test-output-pgsql.cpp +++ b/tests/test-output-pgsql.cpp @@ -66,7 +66,6 @@ void test_regression_simple() { std::string proc_name("test-output-pgsql"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; @@ -74,12 +73,8 @@ void test_regression_simple() { options.slim = true; options.style = "default.style"; - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/liechtenstein-2013-08-03.osm.pbf", "pbf"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); @@ -116,7 +111,6 @@ void test_latlong() { std::string proc_name("test-output-pgsql"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; @@ -126,12 +120,8 @@ void test_latlong() { options.projection.reset(reprojection::create_projection(PROJ_LATLONG)); - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/liechtenstein-2013-08-03.osm.pbf", "pbf"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); @@ -169,7 +159,6 @@ void test_area_way_simple() { std::string proc_name("test-output-pgsql"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; @@ -179,12 +168,8 @@ void test_area_way_simple() { options.flat_node_cache_enabled = true; options.flat_node_file = boost::optional(FLAT_NODES_FILE_NAME); - auto out_test = std::make_shared(mid_pgsql.get(), options); - - osmdata_t osmdata(mid_pgsql, out_test); - - testing::parse("tests/test_output_pgsql_way_area.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_pgsql_way_area.osm", "xml"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); @@ -210,7 +195,6 @@ void test_route_rel() { std::string proc_name("test-output-pgsql"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_ram(new middle_ram_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; @@ -218,12 +202,8 @@ void test_route_rel() { options.slim = false; options.style = "default.style"; - auto out_test = std::make_shared(mid_ram.get(), options); - - osmdata_t osmdata(mid_ram, out_test); - - testing::parse("tests/test_output_pgsql_route_rel.osm", "xml", - options, &osmdata); + testing::run_osm2pgsql( + options, "tests/test_output_pgsql_route_rel.osm", "xml"); db->assert_has_table("osm2pgsql_test_point"); db->assert_has_table("osm2pgsql_test_line"); @@ -251,7 +231,6 @@ void test_clone() { std::string proc_name("test-output-pgsql"), input_file("-"); char *argv[] = { &proc_name[0], &input_file[0], nullptr }; - std::shared_ptr mid_pgsql(new middle_pgsql_t()); options_t options = options_t(2, argv); options.database_options = db->database_options; options.num_procs = 1; @@ -259,13 +238,16 @@ void test_clone() { options.slim = true; options.style = "default.style"; - output_pgsql_t out_test(mid_pgsql.get(), options); + auto mid_pgsql = std::make_shared(); + output_pgsql_t out_test(std::static_pointer_cast(mid_pgsql), + options); //TODO: make the middle testable too //std::shared_ptr mid_clone = mid_pgsql->get_instance(); - std::shared_ptr out_clone = out_test.clone(mid_pgsql.get()); + std::shared_ptr out_clone = + out_test.clone(std::static_pointer_cast(mid_pgsql)); - osmdata_t osmdata(mid_pgsql, out_clone); + osmdata_t osmdata(std::static_pointer_cast(mid_pgsql), out_clone); testing::parse("tests/liechtenstein-2013-08-03.osm.pbf", "pbf", options, &osmdata); diff --git a/tests/test-parse-diff.cpp b/tests/test-parse-diff.cpp index 352ea2166..a38ce64ab 100644 --- a/tests/test-parse-diff.cpp +++ b/tests/test-parse-diff.cpp @@ -35,9 +35,11 @@ struct test_output_t : public dummy_output_t { virtual ~test_output_t() = default; - std::shared_ptr clone(const middle_query_t *cloned_middle) const override { + std::shared_ptr + clone(std::shared_ptr const &mid) const override + { test_output_t *clone = new test_output_t(m_options); - clone->m_mid = cloned_middle; + clone->m_mid = mid; return std::shared_ptr(clone); } diff --git a/tests/test-parse-extra-args.cpp b/tests/test-parse-extra-args.cpp index f856a7328..418822cc4 100644 --- a/tests/test-parse-extra-args.cpp +++ b/tests/test-parse-extra-args.cpp @@ -39,10 +39,10 @@ struct test_output_t : public output_null_t virtual ~test_output_t() {} std::shared_ptr - clone(const middle_query_t *cloned_middle) const override + clone(std::shared_ptr const &mid) const override { test_output_t *clone = new test_output_t(*this); - clone->m_mid = cloned_middle; + clone->m_mid = mid; return std::shared_ptr(clone); } diff --git a/tests/test-parse-xml2.cpp b/tests/test-parse-xml2.cpp index 943c51f93..c66285469 100644 --- a/tests/test-parse-xml2.cpp +++ b/tests/test-parse-xml2.cpp @@ -36,9 +36,11 @@ struct test_output_t : public output_null_t { virtual ~test_output_t() { } - std::shared_ptr clone(const middle_query_t *cloned_middle) const override { + std::shared_ptr + clone(std::shared_ptr const &mid) const override + { test_output_t *clone = new test_output_t(*this); - clone->m_mid = cloned_middle; + clone->m_mid = mid; return std::shared_ptr(clone); } From 8857d51d4db80e1e89a3199d2cf15b7583b2e0f6 Mon Sep 17 00:00:00 2001 From: Sarah Hoffmann Date: Sun, 13 Jan 2019 12:18:58 +0100 Subject: [PATCH 2/2] osmdata: remove explicit reference to middle Now that middle are bound to the lifetime of outputs, there is no need to keep an explict reference of middle around. --- osmdata.cpp | 43 ++++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 21 deletions(-) diff --git a/osmdata.cpp b/osmdata.cpp index c1e4b2125..61ccf9535 100644 --- a/osmdata.cpp +++ b/osmdata.cpp @@ -186,8 +186,7 @@ namespace { //since the fetching from middle should be faster than the processing in each backend. struct pending_threaded_processor : public middle_t::pending_processor { - typedef std::vector> output_vec_t; - typedef std::pair, output_vec_t> clone_t; + using output_vec_t = std::vector>; static void do_jobs(output_vec_t const& outputs, pending_queue_t& queue, size_t& ids_done, std::mutex& mutex, int append, bool ways) { while (true) { @@ -257,7 +256,7 @@ struct pending_threaded_processor : public middle_t::pending_processor { } //keep the clones for a specific thread to use - clones.push_back(clone_t(mid_clone, out_clones)); + clones.push_back(out_clones); } } @@ -282,11 +281,10 @@ struct pending_threaded_processor : public middle_t::pending_processor { //make the threads and start them std::vector> workers; - for (size_t i = 0; i < clones.size(); ++i) { - workers.push_back(std::async(std::launch::async, - do_jobs, std::cref(clones[i].second), - std::ref(queue), std::ref(ids_done), - std::ref(mutex), append, true)); + for (auto const &clone : clones) { + workers.push_back(std::async( + std::launch::async, do_jobs, std::cref(clone), std::ref(queue), + std::ref(ids_done), std::ref(mutex), append, true)); } workers.push_back(std::async(std::launch::async, print_stats, std::ref(queue), std::ref(mutex))); @@ -315,10 +313,12 @@ struct pending_threaded_processor : public middle_t::pending_processor { //collect all the new rels that became pending from each //output in each thread back to their respective main outputs - for (const auto& clone: clones) { + for (auto const &clone : clones) { //for each clone/original output - for(output_vec_t::const_iterator original_output = outs.begin(), clone_output = clone.second.begin(); - original_output != outs.end() && clone_output != clone.second.end(); ++original_output, ++clone_output) { + for (output_vec_t::const_iterator original_output = outs.begin(), + clone_output = clone.begin(); + original_output != outs.end() && clone_output != clone.end(); + ++original_output, ++clone_output) { //done copying ways for now clone_output->get()->commit(); //merge the pending from this threads copy of output back @@ -344,11 +344,10 @@ struct pending_threaded_processor : public middle_t::pending_processor { //make the threads and start them std::vector> workers; - for (size_t i = 0; i < clones.size(); ++i) { - workers.push_back(std::async(std::launch::async, - do_jobs, std::cref(clones[i].second), - std::ref(queue), std::ref(ids_done), - std::ref(mutex), append, false)); + for (auto const &clone : clones) { + workers.push_back(std::async( + std::launch::async, do_jobs, std::cref(clone), std::ref(queue), + std::ref(ids_done), std::ref(mutex), append, false)); } workers.push_back(std::async(std::launch::async, print_stats, std::ref(queue), std::ref(mutex))); @@ -376,10 +375,12 @@ struct pending_threaded_processor : public middle_t::pending_processor { ids_done = 0; //collect all expiry tree informations together into one - for (const auto& clone: clones) { + for (auto const &clone : clones) { //for each clone/original output - for(output_vec_t::const_iterator original_output = outs.begin(), clone_output = clone.second.begin(); - original_output != outs.end() && clone_output != clone.second.end(); ++original_output, ++clone_output) { + for (output_vec_t::const_iterator original_output = outs.begin(), + clone_output = clone.begin(); + original_output != outs.end() && clone_output != clone.end(); + ++original_output, ++clone_output) { //done copying rels for now clone_output->get()->commit(); //merge the expire tree from this threads copy of output back @@ -389,8 +390,8 @@ struct pending_threaded_processor : public middle_t::pending_processor { } private: - //middle and output copies - std::vector clones; + // output copies, one vector per thread + std::vector clones; output_vec_t outs; //would like to move ownership of outs to osmdata_t and middle passed to output_t instead of owned by it //how many jobs do we have in the queue to start with size_t ids_queued;