diff --git a/bindings/python/mapnik_generator_grammars.cpp b/bindings/python/mapnik_generator_grammars.cpp index e621628ac..3f3deb637 100644 --- a/bindings/python/mapnik_generator_grammars.cpp +++ b/bindings/python/mapnik_generator_grammars.cpp @@ -29,8 +29,8 @@ using sink_type = std::back_insert_iterator; template struct mapnik::json::feature_generator_grammar; -template struct mapnik::json::geometry_generator_grammar; -template struct mapnik::json::multi_geometry_generator_grammar; +template struct mapnik::json::geometry_generator_grammar; +template struct mapnik::json::multi_geometry_generator_grammar; template struct mapnik::svg::svg_path_generator; template struct mapnik::wkt::wkt_generator; template struct mapnik::wkt::wkt_multi_generator; diff --git a/include/mapnik/json/feature_generator_grammar.hpp b/include/mapnik/json/feature_generator_grammar.hpp index 973c68243..a0239757d 100644 --- a/include/mapnik/json/feature_generator_grammar.hpp +++ b/include/mapnik/json/feature_generator_grammar.hpp @@ -156,7 +156,7 @@ struct feature_generator_grammar: feature_generator_grammar(); karma::rule feature; - multi_geometry_generator_grammar geometry; + multi_geometry_generator_grammar geometry; escaped_string escaped_string_; karma::rule properties; karma::rule pair; diff --git a/include/mapnik/json/geometry_generator_grammar.hpp b/include/mapnik/json/geometry_generator_grammar.hpp index 2d61e9f60..74d41415d 100644 --- a/include/mapnik/json/geometry_generator_grammar.hpp +++ b/include/mapnik/json/geometry_generator_grammar.hpp @@ -45,30 +45,34 @@ namespace karma = boost::spirit::karma; namespace detail { +template struct get_type { using result_type = int; - result_type operator() (geometry_type const& geom) const + result_type operator() (Geometry const& geom) const { return static_cast(geom.type()); } }; +template struct get_first { - using result_type = geometry_type::value_type const; - result_type operator() (geometry_type const& geom) const + using result_type = typename Geometry::value_type const; + result_type operator() (Geometry const& geom) const { - geometry_type::value_type coord; - std::get<0>(coord) = geom.vertex(0,&std::get<1>(coord),&std::get<2>(coord)); + typename Geometry::value_type coord; + geom.rewind(0); + std::get<0>(coord) = geom.vertex(&std::get<1>(coord),&std::get<2>(coord)); return coord; } }; +template struct multi_geometry_type { using result_type = std::tuple ; - result_type operator() (geometry_container const& cont) const + result_type operator() (GeometryContainer const& cont) const { unsigned type = 0u; bool collection = false; @@ -86,10 +90,11 @@ struct multi_geometry_type } }; +template struct not_empty { using result_type = bool; - result_type operator() (geometry_container const& cont) const + result_type operator() (GeometryContainer const& cont) const { for (auto const& geom : cont) { @@ -130,10 +135,12 @@ struct json_coordinate_policy : karma::real_policies } -template +template struct geometry_generator_grammar : - karma::grammar + karma::grammar { + using geometry_type = Geometry; + using coord_type = typename std::remove_pointer::type; geometry_generator_grammar(); karma::rule coordinates; karma::rule point; @@ -141,19 +148,20 @@ struct geometry_generator_grammar : karma::rule polygon; karma::rule coords; karma::rule, geometry_type const& ()> coords2; - karma::rule point_coord; - karma::rule polygon_coord; - boost::phoenix::function _type; - boost::phoenix::function _first; - karma::real_generator > coord_type; + karma::rule point_coord; + karma::rule polygon_coord; + boost::phoenix::function > _type; + boost::phoenix::function > _first; + karma::real_generator > coordinate; }; -template +template struct multi_geometry_generator_grammar : karma::grammar >, - geometry_container const& ()> + GeometryContainer const& ()> { + using geometry_type = typename std::remove_pointer::type; multi_geometry_generator_grammar(); karma::rule >, geometry_container const&()> start; @@ -164,10 +172,11 @@ struct multi_geometry_generator_grammar : karma::rule, geometry_type const&()> geometry2; karma::rule coordinates; - geometry_generator_grammar path; - boost::phoenix::function multi_type_; - boost::phoenix::function type_; - boost::phoenix::function not_empty_; + geometry_generator_grammar path; + // phoenix functions + boost::phoenix::function > multi_type_; + boost::phoenix::function > type_; + boost::phoenix::function > not_empty_; karma::symbols geometry_types; }; diff --git a/include/mapnik/json/geometry_generator_grammar_impl.hpp b/include/mapnik/json/geometry_generator_grammar_impl.hpp index 61be1b910..e1b16bc83 100644 --- a/include/mapnik/json/geometry_generator_grammar_impl.hpp +++ b/include/mapnik/json/geometry_generator_grammar_impl.hpp @@ -34,8 +34,8 @@ namespace mapnik { namespace json { namespace karma = boost::spirit::karma; -template -geometry_generator_grammar::geometry_generator_grammar() +template +geometry_generator_grammar::geometry_generator_grammar() : geometry_generator_grammar::base_type(coordinates) { boost::spirit::karma::uint_type uint_; @@ -69,7 +69,7 @@ geometry_generator_grammar::geometry_generator_grammar() point_coord = &uint_ << lit('[') - << coord_type << lit(',') << coord_type + << coordinate << lit(',') << coordinate << lit(']') ; @@ -78,7 +78,7 @@ geometry_generator_grammar::geometry_generator_grammar() .else_[_1 = '[' ]] | &uint_(mapnik::SEG_LINETO) - << lit(',')) << lit('[') << coord_type << lit(',') << coord_type << lit(']') + << lit(',')) << lit('[') << coordinate << lit(',') << coordinate << lit(']') ; coords2 %= *polygon_coord(_a) @@ -88,8 +88,8 @@ geometry_generator_grammar::geometry_generator_grammar() ; } -template -multi_geometry_generator_grammar::multi_geometry_generator_grammar() +template +multi_geometry_generator_grammar::multi_geometry_generator_grammar() : multi_geometry_generator_grammar::base_type(start) { boost::spirit::karma::uint_type uint_; diff --git a/include/mapnik/util/geometry_to_geojson.hpp b/include/mapnik/util/geometry_to_geojson.hpp index cbdce3d08..3500544df 100644 --- a/include/mapnik/util/geometry_to_geojson.hpp +++ b/include/mapnik/util/geometry_to_geojson.hpp @@ -32,7 +32,7 @@ namespace mapnik { namespace util { inline bool to_geojson(std::string & json, mapnik::geometry_type const& geom) { using sink_type = std::back_insert_iterator; - static const mapnik::json::geometry_generator_grammar grammar; + static const mapnik::json::geometry_generator_grammar grammar; sink_type sink(json); return boost::spirit::karma::generate(sink, grammar, geom); } @@ -40,7 +40,7 @@ inline bool to_geojson(std::string & json, mapnik::geometry_type const& geom) inline bool to_geojson(std::string & json, mapnik::geometry_container const& geom) { using sink_type = std::back_insert_iterator; - static const mapnik::json::multi_geometry_generator_grammar grammar; + static const mapnik::json::multi_geometry_generator_grammar grammar; sink_type sink(json); return boost::spirit::karma::generate(sink, grammar, geom); }