move export_list into c transform

Avoid having to hand in the export list on every filter call.
This commit is contained in:
Sarah Hoffmann
2019-02-08 23:24:39 +01:00
parent b55f768851
commit bee043b65a
11 changed files with 86 additions and 77 deletions

View File

@ -13,13 +13,12 @@
output_multi_t::output_multi_t(std::string const &name, output_multi_t::output_multi_t(std::string const &name,
std::shared_ptr<geometry_processor> processor_, std::shared_ptr<geometry_processor> processor_,
export_list const &export_list_, export_list const &export_list,
std::shared_ptr<middle_query_t> const &mid, std::shared_ptr<middle_query_t> const &mid,
options_t const &options) options_t const &options)
: output_t(mid, options), : output_t(mid, options),
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)), m_tagtransform(tagtransform_t::make_tagtransform(&m_options, export_list)),
m_export_list(new export_list(export_list_)), m_processor(processor_), m_processor(processor_), m_proj(m_options.projection),
m_proj(m_options.projection),
// TODO: we could in fact have something that is interested in nodes and // TODO: we could in fact have something that is interested in nodes and
// ways.. // ways..
m_osm_type(m_processor->interests(geometry_processor::interest_node) m_osm_type(m_processor->interests(geometry_processor::interest_node)
@ -27,7 +26,7 @@ output_multi_t::output_multi_t(std::string const &name,
: osmium::item_type::way), : osmium::item_type::way),
m_table(new table_t( m_table(new table_t(
m_options.database_options.conninfo(), name, m_processor->column_type(), m_options.database_options.conninfo(), name, m_processor->column_type(),
m_export_list->normal_columns(m_osm_type), m_options.hstore_columns, export_list.normal_columns(m_osm_type), m_options.hstore_columns,
m_processor->srid(), m_options.append, m_options.slim, m_options.droptemp, m_processor->srid(), m_options.append, m_options.slim, m_options.droptemp,
m_options.hstore_mode, m_options.enable_hstore_index, m_options.hstore_mode, m_options.enable_hstore_index,
m_options.tblsmain_data, m_options.tblsmain_index)), m_options.tblsmain_data, m_options.tblsmain_index)),
@ -36,15 +35,14 @@ output_multi_t::output_multi_t(std::string const &name,
m_options.projection), m_options.projection),
buffer(1024, osmium::memory::Buffer::auto_grow::yes), buffer(1024, osmium::memory::Buffer::auto_grow::yes),
m_builder(m_options.projection, m_options.enable_multi), m_builder(m_options.projection, m_options.enable_multi),
m_way_area(m_export_list->has_column(m_osm_type, "way_area")) m_way_area(export_list.has_column(m_osm_type, "way_area"))
{ {
} }
output_multi_t::output_multi_t(output_multi_t const *other, output_multi_t::output_multi_t(output_multi_t const *other,
std::shared_ptr<middle_query_t> const &mid) std::shared_ptr<middle_query_t> const &mid)
: output_t(mid, other->m_options), : output_t(mid, other->m_options),
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)), m_tagtransform(other->m_tagtransform->clone()),
m_export_list(new export_list(*other->m_export_list)),
m_processor(other->m_processor), m_proj(other->m_proj), 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_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 // NOTE: we need to know which ways were used by relations so each thread
@ -284,8 +282,7 @@ int output_multi_t::process_node(osmium::Node const &node)
{ {
// check if we are keeping this node // check if we are keeping this node
taglist_t outtags; taglist_t outtags;
auto filter = m_tagtransform->filter_tags(node, 0, 0, *m_export_list.get(), auto filter = m_tagtransform->filter_tags(node, 0, 0, outtags, true);
outtags, true);
if (!filter) { if (!filter) {
// grab its geom // grab its geom
auto geom = m_processor->process_node(node.location(), &m_builder); auto geom = m_processor->process_node(node.location(), &m_builder);
@ -312,8 +309,8 @@ int output_multi_t::reprocess_way(osmium::Way *way, bool exists)
//check if we are keeping this way //check if we are keeping this way
taglist_t outtags; taglist_t outtags;
unsigned int filter = m_tagtransform->filter_tags( unsigned int filter =
*way, 0, 0, *m_export_list.get(), outtags, true); m_tagtransform->filter_tags(*way, 0, 0, outtags, true);
if (!filter) { if (!filter) {
m_mid->nodes_get_list(&(way->nodes())); m_mid->nodes_get_list(&(way->nodes()));
auto geom = m_processor->process_way(*way, &m_builder); auto geom = m_processor->process_way(*way, &m_builder);
@ -327,7 +324,7 @@ int output_multi_t::reprocess_way(osmium::Way *way, bool exists)
int output_multi_t::process_way(osmium::Way *way) { int output_multi_t::process_way(osmium::Way *way) {
//check if we are keeping this way //check if we are keeping this way
taglist_t outtags; taglist_t outtags;
auto filter = m_tagtransform->filter_tags(*way, 0, 0, *m_export_list.get(), outtags, true); auto filter = m_tagtransform->filter_tags(*way, 0, 0, outtags, true);
if (!filter) { if (!filter) {
//get the geom from the middle //get the geom from the middle
if (m_mid->nodes_get_list(&(way->nodes())) < 1) if (m_mid->nodes_get_list(&(way->nodes())) < 1)
@ -358,8 +355,7 @@ int output_multi_t::process_relation(osmium::Relation const &rel, bool exists)
//does this relation have anything interesting to us //does this relation have anything interesting to us
taglist_t rel_outtags; taglist_t rel_outtags;
auto filter = m_tagtransform->filter_tags(rel, 0, 0, *m_export_list.get(), auto filter = m_tagtransform->filter_tags(rel, 0, 0, rel_outtags, true);
rel_outtags, true);
if (!filter) { if (!filter) {
//TODO: move this into geometry processor, figure a way to come back for tag transform //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 //grab ways/nodes of the members in the relation, bail if none were used
@ -377,8 +373,7 @@ int output_multi_t::process_relation(osmium::Relation const &rel, bool exists)
taglist_t outtags; taglist_t outtags;
filter = m_tagtransform->filter_rel_member_tags( filter = m_tagtransform->filter_rel_member_tags(
rel_outtags, m_relation_helper.data, m_relation_helper.roles, rel_outtags, m_relation_helper.data, m_relation_helper.roles,
&make_boundary, &make_polygon, &roads, *m_export_list.get(), &make_boundary, &make_polygon, &roads, outtags, true);
outtags, true);
if (!filter) if (!filter)
{ {
m_relation_helper.add_way_locations(m_mid.get()); m_relation_helper.add_way_locations(m_mid.get());

View File

@ -31,7 +31,7 @@ class output_multi_t : public output_t
public: public:
output_multi_t(std::string const &name, output_multi_t(std::string const &name,
std::shared_ptr<geometry_processor> processor_, std::shared_ptr<geometry_processor> processor_,
export_list const &export_list_, export_list const &export_list,
std::shared_ptr<middle_query_t> const &mid, std::shared_ptr<middle_query_t> const &mid,
options_t const &options); options_t const &options);
virtual ~output_multi_t(); virtual ~output_multi_t();
@ -78,7 +78,6 @@ protected:
taglist_t &tags); taglist_t &tags);
std::unique_ptr<tagtransform_t> m_tagtransform; std::unique_ptr<tagtransform_t> m_tagtransform;
std::unique_ptr<export_list> m_export_list;
std::shared_ptr<geometry_processor> m_processor; std::shared_ptr<geometry_processor> m_processor;
std::shared_ptr<reprojection> m_proj; std::shared_ptr<reprojection> m_proj;
osmium::item_type const m_osm_type; osmium::item_type const m_osm_type;

View File

@ -163,8 +163,7 @@ int output_pgsql_t::pending_way(osmid_t id, int exists) {
int polygon; int polygon;
int roads; int roads;
auto &way = buffer.get<osmium::Way>(0); auto &way = buffer.get<osmium::Way>(0);
if (!m_tagtransform->filter_tags(way, &polygon, &roads, if (!m_tagtransform->filter_tags(way, &polygon, &roads, outtags)) {
*m_export_list.get(), outtags)) {
auto nnodes = m_mid->nodes_get_list(&(way.nodes())); auto nnodes = m_mid->nodes_get_list(&(way.nodes()));
if (nnodes > 1) { if (nnodes > 1) {
pgsql_out_way(way, &outtags, polygon, roads); pgsql_out_way(way, &outtags, polygon, roads);
@ -255,8 +254,7 @@ void output_pgsql_t::stop(osmium::thread::Pool *pool)
int output_pgsql_t::node_add(osmium::Node const &node) int output_pgsql_t::node_add(osmium::Node const &node)
{ {
taglist_t outtags; taglist_t outtags;
if (m_tagtransform->filter_tags(node, nullptr, nullptr, if (m_tagtransform->filter_tags(node, nullptr, nullptr, outtags))
*m_export_list.get(), outtags))
return 1; return 1;
auto wkb = m_builder.get_wkb_node(node.location()); auto wkb = m_builder.get_wkb_node(node.location());
@ -273,8 +271,7 @@ int output_pgsql_t::way_add(osmium::Way *way)
taglist_t outtags; taglist_t outtags;
/* Check whether the way is: (1) Exportable, (2) Maybe a polygon */ /* Check whether the way is: (1) Exportable, (2) Maybe a polygon */
auto filter = m_tagtransform->filter_tags(*way, &polygon, &roads, auto filter = m_tagtransform->filter_tags(*way, &polygon, &roads, outtags);
*m_export_list.get(), outtags);
if (!filter) { if (!filter) {
/* Get actual node data and generate output */ /* Get actual node data and generate output */
@ -291,8 +288,7 @@ int output_pgsql_t::way_add(osmium::Way *way)
int output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel) int output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
{ {
taglist_t prefiltered_tags; taglist_t prefiltered_tags;
if (m_tagtransform->filter_tags(rel, nullptr, nullptr, *m_export_list.get(), if (m_tagtransform->filter_tags(rel, nullptr, nullptr, prefiltered_tags)) {
prefiltered_tags)) {
return 1; return 1;
} }
@ -318,9 +314,9 @@ int output_pgsql_t::pgsql_process_relation(osmium::Relation const &rel)
// If it's a route relation make_boundary and make_polygon will be false // If it's a route relation make_boundary and make_polygon will be false
// otherwise one or the other will be true. // otherwise one or the other will be true.
if (m_tagtransform->filter_rel_member_tags( if (m_tagtransform->filter_rel_member_tags(prefiltered_tags, buffer, xrole,
prefiltered_tags, buffer, xrole, &make_boundary, &make_polygon, &make_boundary, &make_polygon,
&roads, *m_export_list.get(), outtags)) { &roads, outtags)) {
return 0; return 0;
} }
@ -514,26 +510,18 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
buffer(32768, osmium::memory::Buffer::auto_grow::yes), buffer(32768, osmium::memory::Buffer::auto_grow::yes),
rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes) rels_buffer(1024, osmium::memory::Buffer::auto_grow::yes)
{ {
m_export_list.reset(new export_list()); export_list exlist;
m_enable_way_area = read_style_file( m_options.style, m_export_list.get() ); m_enable_way_area = read_style_file(m_options.style, &exlist);
try { m_tagtransform = tagtransform_t::make_tagtransform(&m_options, exlist);
m_tagtransform = tagtransform_t::make_tagtransform(&m_options);
}
catch(const std::runtime_error& e) {
fprintf(stderr, "%s\n", e.what());
fprintf(stderr, "Error: Failed to initialise tag processing.\n");
util::exit_nicely();
}
//for each table //for each table
for (int i = 0; i < t_MAX; i++) { for (int i = 0; i < t_MAX; i++) {
//figure out the columns this table needs //figure out the columns this table needs
columns_t columns = m_export_list->normal_columns((i == t_point) columns_t columns = exlist.normal_columns(
? osmium::item_type::node (i == t_point) ? osmium::item_type::node : osmium::item_type::way);
: osmium::item_type::way);
//figure out what name we are using for this and what type //figure out what name we are using for this and what type
std::string name = m_options.prefix; std::string name = m_options.prefix;
@ -576,9 +564,8 @@ output_pgsql_t::output_pgsql_t(std::shared_ptr<middle_query_t> const &mid,
output_pgsql_t::output_pgsql_t(output_pgsql_t const *other, output_pgsql_t::output_pgsql_t(output_pgsql_t const *other,
std::shared_ptr<middle_query_t> const &mid) std::shared_ptr<middle_query_t> const &mid)
: output_t(mid, other->m_options), : output_t(mid, other->m_options),
m_tagtransform(tagtransform_t::make_tagtransform(&m_options)), m_tagtransform(other->m_tagtransform->clone()),
m_enable_way_area(other->m_enable_way_area), 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_builder(m_options.projection, other->m_options.enable_multi),
expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox, expire(m_options.expire_tiles_zoom, m_options.expire_tiles_max_bbox,
m_options.projection), m_options.projection),

View File

@ -73,8 +73,6 @@ protected:
std::array<std::unique_ptr<table_t>, t_MAX> m_tables; std::array<std::unique_ptr<table_t>, t_MAX> m_tables;
std::unique_ptr<export_list> m_export_list;
geom::osmium_builder_t m_builder; geom::osmium_builder_t m_builder;
expire_tiles expire; expire_tiles expire;

View File

@ -79,11 +79,18 @@ void add_z_order(taglist_t &tags, int *roads)
} // anonymous namespace } // anonymous namespace
c_tagtransform_t::c_tagtransform_t(options_t const *options) c_tagtransform_t::c_tagtransform_t(options_t const *options,
: m_options(options) export_list const &exlist)
: m_options(options), m_export_list(exlist)
{ {
} }
std::unique_ptr<tagtransform_t> c_tagtransform_t::clone() const
{
return std::unique_ptr<tagtransform_t>(
new c_tagtransform_t(m_options, m_export_list));
}
bool c_tagtransform_t::check_key(std::vector<taginfo> const &infos, bool c_tagtransform_t::check_key(std::vector<taginfo> const &infos,
char const *k, bool *filter, int *flags, char const *k, bool *filter, int *flags,
bool strict) bool strict)
@ -134,8 +141,7 @@ bool c_tagtransform_t::check_key(std::vector<taginfo> const &infos,
} }
bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon, bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
int *roads, export_list const &exlist, int *roads, taglist_t &out_tags, bool strict)
taglist_t &out_tags, bool strict)
{ {
//assume we dont like this set of tags //assume we dont like this set of tags
bool filter = true; bool filter = true;
@ -147,7 +153,7 @@ bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
if (o.type() == osmium::item_type::relation) { if (o.type() == osmium::item_type::relation) {
export_type = osmium::item_type::way; export_type = osmium::item_type::way;
} }
const std::vector<taginfo> &infos = exlist.get(export_type); const std::vector<taginfo> &infos = m_export_list.get(export_type);
/* We used to only go far enough to determine if it's a polygon or not, /* We used to only go far enough to determine if it's a polygon or not,
but now we go through and filter stuff we don't need but now we go through and filter stuff we don't need
@ -205,8 +211,8 @@ bool c_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
bool c_tagtransform_t::filter_rel_member_tags( bool c_tagtransform_t::filter_rel_member_tags(
taglist_t const &rel_tags, osmium::memory::Buffer const &, taglist_t const &rel_tags, osmium::memory::Buffer const &,
rolelist_t const &, int *make_boundary, int *make_polygon, int *roads, rolelist_t const &, int *make_boundary, int *make_polygon,
export_list const &, taglist_t &out_tags, bool allow_typeless) int *roads, taglist_t &out_tags, bool allow_typeless)
{ {
//if it has a relation figure out what kind it is //if it has a relation figure out what kind it is
const std::string *type = rel_tags.get("type"); const std::string *type = rel_tags.get("type");

View File

@ -7,18 +7,18 @@
class c_tagtransform_t : public tagtransform_t class c_tagtransform_t : public tagtransform_t
{ {
public: public:
c_tagtransform_t(options_t const *options); c_tagtransform_t(options_t const *options, export_list const &exlist);
std::unique_ptr<tagtransform_t> clone() const override;
bool filter_tags(osmium::OSMObject const &o, int *polygon, int *roads, bool filter_tags(osmium::OSMObject const &o, int *polygon, int *roads,
export_list const &exlist, taglist_t &out_tags, taglist_t &out_tags, bool strict = false) override;
bool strict = false) override;
bool filter_rel_member_tags(taglist_t const &rel_tags, bool filter_rel_member_tags(taglist_t const &rel_tags,
osmium::memory::Buffer const &members, osmium::memory::Buffer const &members,
rolelist_t const &member_roles, rolelist_t const &member_roles,
int *make_boundary, int *make_polygon, int *make_boundary, int *make_polygon,
int *roads, export_list const &exlist, int *roads, taglist_t &out_tags,
taglist_t &out_tags,
bool allow_typeless = false) override; bool allow_typeless = false) override;
private: private:
@ -26,6 +26,7 @@ private:
bool *filter, int *flags, bool strict); bool *filter, int *flags, bool strict);
options_t const *m_options; options_t const *m_options;
export_list m_export_list;
}; };
#endif // TAGTRANSFORM_C_H #endif // TAGTRANSFORM_C_H

View File

@ -9,17 +9,24 @@ extern "C" {
#include "tagtransform-lua.hpp" #include "tagtransform-lua.hpp"
lua_tagtransform_t::lua_tagtransform_t(options_t const *options) lua_tagtransform_t::lua_tagtransform_t(options_t const *options)
: L(luaL_newstate()), m_node_func(options->tag_transform_node_func.get_value_or( : m_node_func(
"filter_tags_node")), options->tag_transform_node_func.get_value_or("filter_tags_node")),
m_way_func(options->tag_transform_way_func.get_value_or("filter_tags_way")), m_way_func(options->tag_transform_way_func.get_value_or("filter_tags_way")),
m_rel_func( m_rel_func(
options->tag_transform_rel_func.get_value_or("filter_basic_tags_rel")), options->tag_transform_rel_func.get_value_or("filter_basic_tags_rel")),
m_rel_mem_func(options->tag_transform_rel_mem_func.get_value_or( m_rel_mem_func(options->tag_transform_rel_mem_func.get_value_or(
"filter_tags_relation_member")), "filter_tags_relation_member")),
m_lua_file(options->tag_transform_script.get()),
m_extra_attributes(options->extra_attributes) m_extra_attributes(options->extra_attributes)
{ {
open_style();
}
void lua_tagtransform_t::open_style()
{
L = luaL_newstate();
luaL_openlibs(L); luaL_openlibs(L);
if (luaL_dofile(L, options->tag_transform_script->c_str())) { if (luaL_dofile(L, m_lua_file.c_str())) {
throw std::runtime_error( throw std::runtime_error(
(boost::format("Lua tag transform style error: %1%") % (boost::format("Lua tag transform style error: %1%") %
lua_tostring(L, -1)) lua_tostring(L, -1))
@ -34,6 +41,14 @@ lua_tagtransform_t::lua_tagtransform_t(options_t const *options)
lua_tagtransform_t::~lua_tagtransform_t() { lua_close(L); } lua_tagtransform_t::~lua_tagtransform_t() { lua_close(L); }
std::unique_ptr<tagtransform_t> lua_tagtransform_t::clone() const
{
auto c = std::unique_ptr<lua_tagtransform_t>(new lua_tagtransform_t(*this));
c->open_style();
return std::unique_ptr<tagtransform_t>(c.release());
}
void lua_tagtransform_t::check_lua_function_exists(const std::string &func_name) void lua_tagtransform_t::check_lua_function_exists(const std::string &func_name)
{ {
lua_getglobal(L, func_name.c_str()); lua_getglobal(L, func_name.c_str());
@ -48,8 +63,7 @@ void lua_tagtransform_t::check_lua_function_exists(const std::string &func_name)
} }
bool lua_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon, bool lua_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
int *roads, export_list const &, int *roads, taglist_t &out_tags, bool)
taglist_t &out_tags, bool)
{ {
switch (o.type()) { switch (o.type()) {
case osmium::item_type::node: case osmium::item_type::node:
@ -141,7 +155,7 @@ bool lua_tagtransform_t::filter_tags(osmium::OSMObject const &o, int *polygon,
bool lua_tagtransform_t::filter_rel_member_tags( bool lua_tagtransform_t::filter_rel_member_tags(
taglist_t const &rel_tags, osmium::memory::Buffer const &members, taglist_t const &rel_tags, osmium::memory::Buffer const &members,
rolelist_t const &member_roles, int *make_boundary, int *make_polygon, rolelist_t const &member_roles, int *make_boundary, int *make_polygon,
int *roads, export_list const &, taglist_t &out_tags, bool) int *roads, taglist_t &out_tags, bool)
{ {
size_t num_members = member_roles.size(); size_t num_members = member_roles.size();
lua_getglobal(L, m_rel_mem_func.c_str()); lua_getglobal(L, m_rel_mem_func.c_str());

View File

@ -11,27 +11,31 @@ extern "C" {
class lua_tagtransform_t : public tagtransform_t class lua_tagtransform_t : public tagtransform_t
{ {
lua_tagtransform_t(lua_tagtransform_t const &other) = default;
public: public:
lua_tagtransform_t(options_t const *options); lua_tagtransform_t(options_t const *options);
~lua_tagtransform_t(); ~lua_tagtransform_t();
std::unique_ptr<tagtransform_t> clone() const override;
bool filter_tags(osmium::OSMObject const &o, int *polygon, int *roads, bool filter_tags(osmium::OSMObject const &o, int *polygon, int *roads,
export_list const &exlist, taglist_t &out_tags, taglist_t &out_tags, bool strict = false) override;
bool strict = false) override;
bool filter_rel_member_tags(taglist_t const &rel_tags, bool filter_rel_member_tags(taglist_t const &rel_tags,
osmium::memory::Buffer const &members, osmium::memory::Buffer const &members,
rolelist_t const &member_roles, rolelist_t const &member_roles,
int *make_boundary, int *make_polygon, int *make_boundary, int *make_polygon,
int *roads, export_list const &exlist, int *roads, taglist_t &out_tags,
taglist_t &out_tags,
bool allow_typeless = false) override; bool allow_typeless = false) override;
private: private:
void open_style();
void check_lua_function_exists(std::string const &func_name); void check_lua_function_exists(std::string const &func_name);
lua_State *L; lua_State *L;
std::string m_node_func, m_way_func, m_rel_func, m_rel_mem_func; std::string m_node_func, m_way_func, m_rel_func, m_rel_mem_func;
std::string m_lua_file;
bool m_extra_attributes; bool m_extra_attributes;
}; };

View File

@ -8,7 +8,8 @@
#endif #endif
std::unique_ptr<tagtransform_t> std::unique_ptr<tagtransform_t>
tagtransform_t::make_tagtransform(options_t const *options) tagtransform_t::make_tagtransform(options_t const *options,
export_list const &exlist)
{ {
if (options->tag_transform_script) { if (options->tag_transform_script) {
#ifdef HAVE_LUA #ifdef HAVE_LUA
@ -24,7 +25,8 @@ tagtransform_t::make_tagtransform(options_t const *options)
} }
fprintf(stderr, "Using built-in tag processing pipeline\n"); fprintf(stderr, "Using built-in tag processing pipeline\n");
return std::unique_ptr<tagtransform_t>(new c_tagtransform_t(options)); return std::unique_ptr<tagtransform_t>(
new c_tagtransform_t(options, exlist));
} }
tagtransform_t::~tagtransform_t() = default; tagtransform_t::~tagtransform_t() = default;

View File

@ -14,20 +14,21 @@ class tagtransform_t
{ {
public: public:
static std::unique_ptr<tagtransform_t> static std::unique_ptr<tagtransform_t>
make_tagtransform(options_t const *options); make_tagtransform(options_t const *options, export_list const &exlist);
virtual ~tagtransform_t() = 0; virtual ~tagtransform_t() = 0;
virtual std::unique_ptr<tagtransform_t> clone() const = 0;
virtual bool filter_tags(osmium::OSMObject const &o, int *polygon, virtual bool filter_tags(osmium::OSMObject const &o, int *polygon,
int *roads, export_list const &exlist, int *roads, taglist_t &out_tags,
taglist_t &out_tags, bool strict = false) = 0; bool strict = false) = 0;
virtual bool filter_rel_member_tags(taglist_t const &rel_tags, virtual bool filter_rel_member_tags(taglist_t const &rel_tags,
osmium::memory::Buffer const &members, osmium::memory::Buffer const &members,
rolelist_t const &member_roles, rolelist_t const &member_roles,
int *make_boundary, int *make_polygon, int *make_boundary, int *make_polygon,
int *roads, export_list const &exlist, int *roads, taglist_t &out_tags,
taglist_t &out_tags,
bool allow_typeless = false) = 0; bool allow_typeless = false) = 0;
}; };

View File

@ -4,6 +4,7 @@
#include "output-pgsql.hpp" #include "output-pgsql.hpp"
#include "output-gazetteer.hpp" #include "output-gazetteer.hpp"
#include "output-null.hpp" #include "output-null.hpp"
#include "taginfo_impl.hpp"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
@ -135,8 +136,9 @@ void test_lua_styles()
options_t options = options_t(len(a1), const_cast<char **>(a1)); options_t options = options_t(len(a1), const_cast<char **>(a1));
try { try {
export_list exlist;
std::unique_ptr<tagtransform_t> tagtransform = std::unique_ptr<tagtransform_t> tagtransform =
tagtransform_t::make_tagtransform(&options); tagtransform_t::make_tagtransform(&options, exlist);
throw std::logic_error("Expected 'No such file or directory'"); throw std::logic_error("Expected 'No such file or directory'");
} catch (const std::runtime_error &e) { } catch (const std::runtime_error &e) {
if (!alg::icontains(e.what(), "No such file or directory")) if (!alg::icontains(e.what(), "No such file or directory"))