From 4919e00e2d904b3512eaaeaaf83b14be3e84534c Mon Sep 17 00:00:00 2001 From: Bruno Lalande Date: Tue, 24 Dec 2013 22:15:15 +0000 Subject: [PATCH] Made simplify variant-aware --- .../boost/geometry/algorithms/simplify.hpp | 60 ++++++++++++++++++- test/algorithms/test_simplify.hpp | 57 +++++++++++------- 2 files changed, 95 insertions(+), 22 deletions(-) diff --git a/include/boost/geometry/algorithms/simplify.hpp b/include/boost/geometry/algorithms/simplify.hpp index 0dc2bd0c6..ad6463f01 100644 --- a/include/boost/geometry/algorithms/simplify.hpp +++ b/include/boost/geometry/algorithms/simplify.hpp @@ -37,6 +37,10 @@ #include #include +#include +#include +#include + namespace boost { namespace geometry { @@ -316,6 +320,60 @@ struct simplify_insert } // namespace resolve_strategy +namespace resolve_variant { + +template +struct simplify +{ + template + static inline void apply(Geometry const& geometry, + Geometry& out, + Distance const& max_distance, + Strategy const& strategy) + { + resolve_strategy::simplify::apply(geometry, out, max_distance, strategy); + } +}; + +template +struct simplify > +{ + template + struct visitor: boost::static_visitor + { + Distance const& m_max_distance; + Strategy const& m_strategy; + + visitor(Distance const& max_distance, Strategy const& strategy) + : m_max_distance(max_distance) + , m_strategy(strategy) + {} + + template + void operator()(Geometry const& geometry, Geometry& out) const + { + simplify::apply(geometry, out, m_max_distance, m_strategy); + } + }; + + template + static inline void + apply(boost::variant const& geometry, + boost::variant& out, + Distance const& max_distance, + Strategy const& strategy) + { + boost::apply_visitor( + visitor(max_distance, strategy), + geometry, + out + ); + } +}; + +} // namespace resolve_variant + + /*! \brief Simplify a geometry using a specified strategy \ingroup simplify @@ -341,7 +399,7 @@ inline void simplify(Geometry const& geometry, Geometry& out, geometry::clear(out); - resolve_strategy::simplify::apply(geometry, out, max_distance, strategy); + resolve_variant::simplify::apply(geometry, out, max_distance, strategy); } diff --git a/test/algorithms/test_simplify.hpp b/test/algorithms/test_simplify.hpp index 0eda9b3b4..b3c64ba56 100644 --- a/test/algorithms/test_simplify.hpp +++ b/test/algorithms/test_simplify.hpp @@ -17,8 +17,8 @@ #include #include #include - #include +#include template struct test_inserter @@ -46,24 +46,43 @@ struct test_inserter template -void test_geometry(std::string const& wkt, std::string const& expected, double distance) +void check_geometry(Geometry const& geometry, + std::string const& expected, + double distance) { - Geometry geometry, simplified; - - // Generate polygon using only integer coordinates and obvious results - // Polygon is a hexagon, having one extra point (2,1) on a line which should be filtered out. - bg::read_wkt(wkt, geometry); + Geometry simplified; bg::simplify(geometry, simplified, distance); - { - std::ostringstream out; - out << std::setprecision(12) << bg::wkt(simplified); + std::ostringstream out; + out << std::setprecision(12) << bg::wkt(simplified); + BOOST_CHECK_EQUAL(out.str(), expected); +} - BOOST_CHECK_MESSAGE(out.str() == expected, - "simplify: " << bg::wkt(geometry) - << " expected " << expected - << " got " << out.str()); - } +template +void check_geometry(Geometry const& geometry, + std::string const& expected, + double distance, + Strategy const& strategy) +{ + Geometry simplified; + bg::simplify(geometry, simplified, distance, strategy); + + std::ostringstream out; + out << std::setprecision(12) << bg::wkt(simplified); + BOOST_CHECK_EQUAL(out.str(), expected); +} + +template +void test_geometry(std::string const& wkt, std::string const& expected, double distance) +{ + // Generate polygon using only integer coordinates and obvious results + // Polygon is a hexagon, having one extra point (2,1) on a line which should be filtered out. + Geometry geometry; + bg::read_wkt(wkt, geometry); + boost::variant v(geometry); + + check_geometry(geometry, expected, distance); + check_geometry(v, expected, distance); // Check using user-specified strategy typedef typename bg::point_type::type point_type; @@ -76,13 +95,9 @@ void test_geometry(std::string const& wkt, std::string const& expected, double d > simplify_strategy_type; BOOST_CONCEPT_ASSERT( (bg::concept::SimplifyStrategy) ); - bg::simplify(geometry, simplified, distance, simplify_strategy_type()); - { - std::ostringstream out; - out << std::setprecision(12) << bg::wkt(simplified); - BOOST_CHECK_EQUAL(out.str(), expected); - } + check_geometry(geometry, expected, distance, simplify_strategy_type()); + check_geometry(v, expected, distance, simplify_strategy_type()); // Check inserter (if applicable) test_inserter