From 8e30a89522b95c331b1803099ad9433be7544f0a Mon Sep 17 00:00:00 2001 From: artemp Date: Wed, 10 Jun 2015 11:10:17 +0100 Subject: [PATCH] remove wkt_generator_grammar_int to minimise code duplication remove redundant template parameter - we can deduce coord_type from Geometry add coord generator traits to control generator instantiation at compile time --- include/mapnik/util/geometry_to_wkt.hpp | 4 +- include/mapnik/wkt/wkt_generator_grammar.hpp | 82 +++++++---------- .../mapnik/wkt/wkt_generator_grammar_impl.hpp | 89 +------------------ src/wkt/mapnik_wkt_generator_grammar.cpp | 4 +- 4 files changed, 40 insertions(+), 139 deletions(-) diff --git a/include/mapnik/util/geometry_to_wkt.hpp b/include/mapnik/util/geometry_to_wkt.hpp index 0e65d7c1b..70b122f63 100644 --- a/include/mapnik/util/geometry_to_wkt.hpp +++ b/include/mapnik/util/geometry_to_wkt.hpp @@ -35,7 +35,7 @@ namespace mapnik { namespace util { inline bool to_wkt(std::string & wkt, mapnik::geometry::geometry const& geom) { using sink_type = std::back_insert_iterator; - static const mapnik::wkt::wkt_generator_grammar, double > generator; + static const mapnik::wkt::wkt_generator_grammar> generator; sink_type sink(wkt); return boost::spirit::karma::generate(sink, generator, geom); } @@ -43,7 +43,7 @@ inline bool to_wkt(std::string & wkt, mapnik::geometry::geometry const& inline bool to_wkt(std::string & wkt, mapnik::geometry::geometry const& geom) { using sink_type = std::back_insert_iterator; - static const mapnik::wkt::wkt_generator_grammar_int, std::int64_t > generator; + static const mapnik::wkt::wkt_generator_grammar> generator; sink_type sink(wkt); return boost::spirit::karma::generate(sink, generator, geom); } diff --git a/include/mapnik/wkt/wkt_generator_grammar.hpp b/include/mapnik/wkt/wkt_generator_grammar.hpp index fc8e7003a..1a0b558c8 100644 --- a/include/mapnik/wkt/wkt_generator_grammar.hpp +++ b/include/mapnik/wkt/wkt_generator_grammar.hpp @@ -86,66 +86,52 @@ struct wkt_coordinate_policy : karma::real_policies } }; +template +struct coordinate_generator; + +template <> +struct coordinate_generator +{ + using generator = karma::real_generator >; +}; + +template <> +struct coordinate_generator +{ + using generator = karma::int_generator; +}; + } -template +template struct wkt_generator_grammar : karma::grammar { + using coord_type = typename Geometry::value_type; wkt_generator_grammar(); // rules karma::rule geometry; karma::rule, Geometry const&() > geometry_dispatch; - karma::rule const&()> point; - karma::rule const&()> point_coord; - karma::rule const&()> linestring; - karma::rule const&()> linestring_coord; - karma::rule const&()> polygon; - karma::rule const&()> polygon_coord; - karma::rule const&()> exterior_ring_coord; - karma::rule > const&()> interior_ring_coord; - karma::rule const& ()> multi_point; - karma::rule const& ()> multi_point_coord; - karma::rule const& ()> multi_linestring; - karma::rule const& ()> multi_linestring_coord; - karma::rule const& ()> multi_polygon; - karma::rule const& ()> multi_polygon_coord; - karma::rule const& ()> geometry_collection; - karma::rule const& ()> geometries; + karma::rule const&()> point; + karma::rule const&()> point_coord; + karma::rule const&()> linestring; + karma::rule const&()> linestring_coord; + karma::rule const&()> polygon; + karma::rule const&()> polygon_coord; + karma::rule const&()> exterior_ring_coord; + karma::rule > const&()> interior_ring_coord; + karma::rule const& ()> multi_point; + karma::rule const& ()> multi_point_coord; + karma::rule const& ()> multi_linestring; + karma::rule const& ()> multi_linestring_coord; + karma::rule const& ()> multi_polygon; + karma::rule const& ()> multi_polygon_coord; + karma::rule const& ()> geometry_collection; + karma::rule const& ()> geometries; boost::phoenix::function > geometry_type; karma::symbols empty; // - karma::real_generator > coordinate; -}; - -template -struct wkt_generator_grammar_int : - karma::grammar -{ - wkt_generator_grammar_int(); - // rules - karma::rule geometry; - karma::rule, Geometry const&() > geometry_dispatch; - karma::rule const&()> point; - karma::rule const&()> point_coord; - karma::rule const&()> linestring; - karma::rule const&()> linestring_coord; - karma::rule const&()> polygon; - karma::rule const&()> polygon_coord; - karma::rule const&()> exterior_ring_coord; - karma::rule > const&()> interior_ring_coord; - karma::rule const& ()> multi_point; - karma::rule const& ()> multi_point_coord; - karma::rule const& ()> multi_linestring; - karma::rule const& ()> multi_linestring_coord; - karma::rule const& ()> multi_polygon; - karma::rule const& ()> multi_polygon_coord; - karma::rule const& ()> geometry_collection; - karma::rule const& ()> geometries; - boost::phoenix::function > geometry_type; - karma::symbols empty; - // - karma::int_generator coordinate; + typename detail::coordinate_generator::generator coordinate; }; }} diff --git a/include/mapnik/wkt/wkt_generator_grammar_impl.hpp b/include/mapnik/wkt/wkt_generator_grammar_impl.hpp index 64624b29e..7205db6d8 100644 --- a/include/mapnik/wkt/wkt_generator_grammar_impl.hpp +++ b/include/mapnik/wkt/wkt_generator_grammar_impl.hpp @@ -28,8 +28,8 @@ namespace mapnik { namespace wkt { -template -wkt_generator_grammar::wkt_generator_grammar() +template +wkt_generator_grammar::wkt_generator_grammar() : wkt_generator_grammar::base_type(geometry) { boost::spirit::karma::_val_type _val; @@ -113,89 +113,4 @@ wkt_generator_grammar::wkt_generator_grammar() } -template -wkt_generator_grammar_int::wkt_generator_grammar_int() - : wkt_generator_grammar_int::base_type(geometry) -{ - boost::spirit::karma::_val_type _val; - boost::spirit::karma::_1_type _1; - boost::spirit::karma::_a_type _a; - boost::spirit::karma::lit_type lit; - boost::spirit::karma::uint_type uint_; - boost::spirit::karma::eps_type eps; - - empty.add - (geometry::geometry_types::Point, "POINT EMPTY") - (geometry::geometry_types::LineString, "LINESTRING EMPTY") - (geometry::geometry_types::Polygon, "POLYGON EMPTY") - (geometry::geometry_types::MultiPoint, "MULTIPOINT EMPTY") - (geometry::geometry_types::MultiLineString, "MULTILINESTRING EMPTY") - (geometry::geometry_types::MultiPolygon, "MULTIPOLYGON EMPTY") - (geometry::geometry_types::GeometryCollection, "GEOMETRYCOLLECTION EMPTY") - ; - - geometry = geometry_dispatch.alias() - ; - - geometry_dispatch = eps[_a = geometry_type(_val)] << - (&uint_(geometry::geometry_types::Point)[_1 = _a] - << point) - | - (&uint_(geometry::geometry_types::LineString)[_1 = _a] - << (linestring | empty[_1 = _a])) - | - (&uint_(geometry::geometry_types::Polygon)[_1 = _a] - << (polygon | empty[_1 = _a])) - | - (&uint_(geometry::geometry_types::MultiPoint)[_1 = _a] - << ( multi_point | empty[_1 = _a])) - | - (&uint_(geometry::geometry_types::MultiLineString)[_1 = _a] - << (multi_linestring | empty[_1 = _a])) - | - (&uint_(geometry::geometry_types::MultiPolygon)[_1 = _a] - << (multi_polygon | empty[_1 = _a])) - | - (&uint_(geometry::geometry_types::GeometryCollection)[_1 = _a] - << (geometry_collection | empty[_1 = _a])) - | - (&uint_(geometry::geometry_types::Unknown)[_1 = _a] - << lit("POINT EMPTY")) // special case for geometry_empty as mapnik::geometry::point can't be empty - ; - - point = lit("POINT(") << point_coord << lit(")") - ; - linestring = lit("LINESTRING(") << linestring_coord << lit(")") - ; - polygon = lit("POLYGON(") << polygon_coord << lit(")") - ; - multi_point = lit("MULTIPOINT(") << multi_point_coord << lit(")") - ; - multi_linestring = lit("MULTILINESTRING(") << multi_linestring_coord << lit(")") - ; - multi_polygon = lit("MULTIPOLYGON(") << multi_polygon_coord << lit(")") - ; - geometry_collection = lit("GEOMETRYCOLLECTION(") << geometries << lit(")") - ; - point_coord = coordinate << lit(' ') << coordinate - ; - linestring_coord = point_coord % lit(',') - ; - polygon_coord = lit('(') << exterior_ring_coord << lit(')') << interior_ring_coord - ; - exterior_ring_coord = linestring_coord.alias() - ; - interior_ring_coord = *(lit(",(") << exterior_ring_coord << lit(')')) - ; - multi_point_coord = linestring_coord.alias() - ; - multi_linestring_coord = (lit('(') << linestring_coord << lit(')')) % lit(',') - ; - multi_polygon_coord = (lit('(') << polygon_coord << lit(')')) % lit(',') - ; - geometries = geometry % lit(',') - ; - -} - }} diff --git a/src/wkt/mapnik_wkt_generator_grammar.cpp b/src/wkt/mapnik_wkt_generator_grammar.cpp index 780c08a85..a94358dca 100644 --- a/src/wkt/mapnik_wkt_generator_grammar.cpp +++ b/src/wkt/mapnik_wkt_generator_grammar.cpp @@ -27,7 +27,7 @@ namespace mapnik { namespace wkt { using sink_type = std::back_insert_iterator; -template struct wkt_generator_grammar, double >; -template struct wkt_generator_grammar_int, std::int64_t >; +template struct wkt_generator_grammar>; +template struct wkt_generator_grammar>; }}