diff --git a/include/boost/geometry/extensions/algorithms/dissolve.hpp b/include/boost/geometry/extensions/algorithms/dissolve.hpp index 7e15e107d..e7441f01d 100644 --- a/include/boost/geometry/extensions/algorithms/dissolve.hpp +++ b/include/boost/geometry/extensions/algorithms/dissolve.hpp @@ -110,50 +110,19 @@ public : } }; -struct dissolve_overlay_visitor -{ -public : - void print(char const* /*header*/) - { - } - - template - void print(char const* /*header*/, Turns const& /*turns*/, int /*turn_index*/) - { - } - - template - void print(char const* /*header*/, Turns const& /*turns*/, int /*turn_index*/, int /*op_index*/) - { - } - - template - void visit_turns(int , Turns const& ) {} - - template - void visit_clusters(Clusters const& , Turns const& ) {} - - template - void visit_traverse(Turns const& /*turns*/, Turn const& /*turn*/, Operation const& /*op*/, const char* /*header*/) - { - } - - template - void visit_traverse_reject(Turns const& , Turn const& , Operation const& , - detail::overlay::traverse_error_type ) - {} -}; - - - template struct dissolve_ring_or_polygon { - template + template + < + typename RescalePolicy, typename OutputIterator, + typename Strategy, typename Visitor + > static inline OutputIterator apply(Geometry const& geometry, RescalePolicy const& rescale_policy, OutputIterator out, - Strategy const& strategy) + Strategy const& strategy, + Visitor& visitor) { typedef typename point_type::type point_type; @@ -186,7 +155,6 @@ struct dissolve_ring_or_polygon > cluster_type; cluster_type clusters; - dissolve_overlay_visitor visitor; // Enrich/traverse the polygons twice: once for union... typename Strategy::side_strategy_type const @@ -344,13 +312,15 @@ inline OutputIterator dissolve_inserter(Geometry const& geometry, rescale_policy_type robust_policy = geometry::get_rescale_policy(geometry); + detail::overlay::overlay_null_visitor visitor; + return dispatch::dissolve < typename tag::type, typename tag::type, Geometry, GeometryOut - >::apply(geometry, robust_policy, out, strategy); + >::apply(geometry, robust_policy, out, strategy, visitor); } /*! @@ -397,6 +367,8 @@ inline void dissolve(Geometry const& geometry, Collection& output_collection, St concepts::check(); + detail::overlay::overlay_null_visitor visitor; + dispatch::dissolve < typename tag::type, @@ -405,7 +377,7 @@ inline void dissolve(Geometry const& geometry, Collection& output_collection, St geometry_out >::apply(geometry, detail::no_rescale_policy(), std::back_inserter(output_collection), - strategy); + strategy, visitor); } template diff --git a/include/boost/geometry/extensions/multi/algorithms/dissolve.hpp b/include/boost/geometry/extensions/multi/algorithms/dissolve.hpp index 2abb05e0e..bedc995ff 100644 --- a/include/boost/geometry/extensions/multi/algorithms/dissolve.hpp +++ b/include/boost/geometry/extensions/multi/algorithms/dissolve.hpp @@ -38,9 +38,14 @@ namespace detail { namespace dissolve template struct dissolve_multi { - template - static inline OutputIterator apply(Multi const& multi, RescalePolicy const& rescale_policy, - OutputIterator out, Strategy const& strategy) + template + < + typename RescalePolicy, typename OutputIterator, + typename Strategy, typename Visitor + > + static inline OutputIterator apply(Multi const& multi, + RescalePolicy const& rescale_policy, OutputIterator out, + Strategy const& strategy, Visitor& visitor) { typedef typename boost::range_value::type polygon_type; typedef typename boost::range_iterator::type iterator_type; @@ -55,7 +60,8 @@ struct dissolve_multi < polygon_type, GeometryOut - >::apply(*it, rescale_policy, std::back_inserter(step1), strategy); + >::apply(*it, rescale_policy, std::back_inserter(step1), + strategy, visitor); } // Step 2: remove mutual overlap