From 2dce3e0c561c30fe4751c1d72fda9e45fd253fdb Mon Sep 17 00:00:00 2001 From: Bruno Lalande Date: Tue, 9 Oct 2012 23:03:18 +0000 Subject: [PATCH] Moved Functor template param from class to function level in dispatch::for_each. [SVN r80919] --- .../boost/geometry/algorithms/for_each.hpp | 92 ++++++++----------- .../geometry/multi/algorithms/for_each.hpp | 34 ++----- 2 files changed, 46 insertions(+), 80 deletions(-) diff --git a/include/boost/geometry/algorithms/for_each.hpp b/include/boost/geometry/algorithms/for_each.hpp index 14f5cdf54..a13348b4a 100644 --- a/include/boost/geometry/algorithms/for_each.hpp +++ b/include/boost/geometry/algorithms/for_each.hpp @@ -40,9 +40,9 @@ namespace detail { namespace for_each { -template struct fe_point_per_point { + template static inline Functor apply(Point& point, Functor f) { f(point); @@ -51,9 +51,9 @@ struct fe_point_per_point }; -template struct fe_point_per_segment { + template static inline Functor apply(Point& , Functor f) { // TODO: if non-const, we should extract the points from the segment @@ -63,9 +63,9 @@ struct fe_point_per_segment }; -template struct fe_range_per_point { + template static inline Functor apply(Range& range, Functor f) { return (std::for_each(boost::begin(range), boost::end(range), f)); @@ -73,9 +73,9 @@ struct fe_range_per_point }; -template struct fe_range_per_segment { + template static inline Functor apply(Range& range, Functor f) { typedef typename add_const_if_c @@ -98,24 +98,18 @@ struct fe_range_per_segment }; -template struct fe_polygon_per_point { + template static inline Functor apply(Polygon& poly, Functor f) { - typedef fe_range_per_point - < - typename ring_type::type, - Functor - > per_ring; - - f = per_ring::apply(exterior_ring(poly), f); + f = fe_range_per_point::apply(exterior_ring(poly), f); typename interior_return_type::type rings = interior_rings(poly); for (BOOST_AUTO_TPL(it, boost::begin(rings)); it != boost::end(rings); ++it) { - f = per_ring::apply(*it, f); + f = fe_range_per_point::apply(*it, f); } return f; @@ -124,24 +118,18 @@ struct fe_polygon_per_point }; -template struct fe_polygon_per_segment { + template static inline Functor apply(Polygon& poly, Functor f) { - typedef fe_range_per_segment - < - typename ring_type::type, - Functor - > per_ring; - - f = per_ring::apply(exterior_ring(poly), f); + f = fe_range_per_segment::apply(exterior_ring(poly), f); typename interior_return_type::type rings = interior_rings(poly); for (BOOST_AUTO_TPL(it, boost::begin(rings)); it != boost::end(rings); ++it) { - f = per_ring::apply(*it, f); + f = fe_range_per_segment::apply(*it, f); } return f; @@ -161,65 +149,63 @@ namespace dispatch template < typename Tag, - typename Geometry, - typename Functor + typename Geometry > struct for_each_point {}; -template -struct for_each_point - : detail::for_each::fe_point_per_point +template +struct for_each_point + : detail::for_each::fe_point_per_point {}; -template -struct for_each_point - : detail::for_each::fe_range_per_point +template +struct for_each_point + : detail::for_each::fe_range_per_point {}; -template -struct for_each_point - : detail::for_each::fe_range_per_point +template +struct for_each_point + : detail::for_each::fe_range_per_point {}; -template -struct for_each_point - : detail::for_each::fe_polygon_per_point +template +struct for_each_point + : detail::for_each::fe_polygon_per_point {}; template < typename Tag, - typename Geometry, - typename Functor + typename Geometry > struct for_each_segment {}; -template -struct for_each_segment - : detail::for_each::fe_point_per_segment +template +struct for_each_segment + : detail::for_each::fe_point_per_segment {}; -template -struct for_each_segment - : detail::for_each::fe_range_per_segment +template +struct for_each_segment + : detail::for_each::fe_range_per_segment {}; -template -struct for_each_segment - : detail::for_each::fe_range_per_segment +template +struct for_each_segment + : detail::for_each::fe_range_per_segment {}; -template -struct for_each_segment - : detail::for_each::fe_polygon_per_segment +template +struct for_each_segment + : detail::for_each::fe_polygon_per_segment {}; @@ -249,8 +235,7 @@ inline Functor for_each_point(Geometry& geometry, Functor f) return dispatch::for_each_point < typename tag_cast::type, multi_tag>::type, - Geometry, - Functor + Geometry >::apply(geometry, f); } @@ -276,8 +261,7 @@ inline Functor for_each_segment(Geometry& geometry, Functor f) return dispatch::for_each_segment < typename tag_cast::type, multi_tag>::type, - Geometry, - Functor + Geometry >::apply(geometry, f); } diff --git a/include/boost/geometry/multi/algorithms/for_each.hpp b/include/boost/geometry/multi/algorithms/for_each.hpp index 932c490b5..cd542ffdf 100644 --- a/include/boost/geometry/multi/algorithms/for_each.hpp +++ b/include/boost/geometry/multi/algorithms/for_each.hpp @@ -36,14 +36,10 @@ namespace detail { namespace for_each // Implementation of multi, for both point and segment, // just calling the single version. -template -< - typename MultiGeometry, - typename Functor, - typename Policy -> +template struct for_each_multi { + template static inline Functor apply(MultiGeometry& multi, Functor f) { for(BOOST_AUTO_TPL(it, boost::begin(multi)); it != boost::end(multi); ++it) @@ -63,16 +59,10 @@ struct for_each_multi namespace dispatch { -template -< - typename MultiGeometry, - typename Functor -> -struct for_each_point +template +struct for_each_point : detail::for_each::for_each_multi < - MultiGeometry, - Functor, // Specify the dispatch of the single-version as policy for_each_point < @@ -84,23 +74,16 @@ struct for_each_point < is_const::value, typename boost::range_value::type - >::type, - Functor + >::type > > {}; -template -< - typename MultiGeometry, - typename Functor -> -struct for_each_segment +template +struct for_each_segment : detail::for_each::for_each_multi < - MultiGeometry, - Functor, // Specify the dispatch of the single-version as policy for_each_segment < @@ -112,8 +95,7 @@ struct for_each_segment < is_const::value, typename boost::range_value::type - >::type, - Functor + >::type > > {};