diff options
Diffstat (limited to 'boost/geometry/algorithms/detail/for_each_range.hpp')
-rw-r--r-- | boost/geometry/algorithms/detail/for_each_range.hpp | 116 |
1 files changed, 84 insertions, 32 deletions
diff --git a/boost/geometry/algorithms/detail/for_each_range.hpp b/boost/geometry/algorithms/detail/for_each_range.hpp index 7cb01fa9b4..e8c92160f1 100644 --- a/boost/geometry/algorithms/detail/for_each_range.hpp +++ b/boost/geometry/algorithms/detail/for_each_range.hpp @@ -17,9 +17,13 @@ #include <boost/mpl/assert.hpp> #include <boost/concept/requires.hpp> +#include <boost/range.hpp> +#include <boost/type_traits/is_const.hpp> +#include <boost/type_traits/remove_const.hpp> #include <boost/geometry/core/tag.hpp> #include <boost/geometry/core/tag_cast.hpp> +#include <boost/geometry/core/tags.hpp> #include <boost/geometry/util/add_const_if_c.hpp> #include <boost/geometry/views/box_view.hpp> @@ -34,24 +38,20 @@ namespace detail { namespace for_each { -template <typename Range, typename Actor, bool IsConst> +template <typename Range, typename Actor> struct fe_range_range { - static inline void apply( - typename add_const_if_c<IsConst, Range>::type& range, - Actor& actor) + static inline void apply(Range & range, Actor & actor) { actor.apply(range); } }; -template <typename Polygon, typename Actor, bool IsConst> +template <typename Polygon, typename Actor> struct fe_range_polygon { - static inline void apply( - typename add_const_if_c<IsConst, Polygon>::type& polygon, - Actor& actor) + static inline void apply(Polygon & polygon, Actor & actor) { actor.apply(exterior_ring(polygon)); @@ -60,17 +60,27 @@ struct fe_range_polygon } }; -template <typename Box, typename Actor, bool IsConst> +template <typename Box, typename Actor> struct fe_range_box { - static inline void apply( - typename add_const_if_c<IsConst, Box>::type& box, - Actor& actor) + static inline void apply(Box & box, Actor & actor) { - actor.apply(box_view<Box>(box)); + actor.apply(box_view<typename boost::remove_const<Box>::type>(box)); } }; +template <typename Multi, typename Actor, typename SinglePolicy> +struct fe_range_multi +{ + static inline void apply(Multi & multi, Actor & actor) + { + for ( typename boost::range_iterator<Multi>::type + it = boost::begin(multi); it != boost::end(multi); ++it) + { + SinglePolicy::apply(*it, actor); + } + } +}; }} // namespace detail::for_each #endif // DOXYGEN_NO_DETAIL @@ -83,10 +93,9 @@ namespace dispatch template < - typename Tag, typename Geometry, typename Actor, - bool IsConst + typename Tag = typename tag<Geometry>::type > struct for_each_range { @@ -98,26 +107,71 @@ struct for_each_range }; -template <typename Linestring, typename Actor, bool IsConst> -struct for_each_range<linestring_tag, Linestring, Actor, IsConst> - : detail::for_each::fe_range_range<Linestring, Actor, IsConst> +template <typename Linestring, typename Actor> +struct for_each_range<Linestring, Actor, linestring_tag> + : detail::for_each::fe_range_range<Linestring, Actor> +{}; + + +template <typename Ring, typename Actor> +struct for_each_range<Ring, Actor, ring_tag> + : detail::for_each::fe_range_range<Ring, Actor> +{}; + + +template <typename Polygon, typename Actor> +struct for_each_range<Polygon, Actor, polygon_tag> + : detail::for_each::fe_range_polygon<Polygon, Actor> +{}; + + +template <typename Box, typename Actor> +struct for_each_range<Box, Actor, box_tag> + : detail::for_each::fe_range_box<Box, Actor> {}; -template <typename Ring, typename Actor, bool IsConst> -struct for_each_range<ring_tag, Ring, Actor, IsConst> - : detail::for_each::fe_range_range<Ring, Actor, IsConst> +template <typename MultiPoint, typename Actor> +struct for_each_range<MultiPoint, Actor, multi_point_tag> + : detail::for_each::fe_range_range<MultiPoint, Actor> {}; -template <typename Polygon, typename Actor, bool IsConst> -struct for_each_range<polygon_tag, Polygon, Actor, IsConst> - : detail::for_each::fe_range_polygon<Polygon, Actor, IsConst> +template <typename Geometry, typename Actor> +struct for_each_range<Geometry, Actor, multi_linestring_tag> + : detail::for_each::fe_range_multi + < + Geometry, + Actor, + detail::for_each::fe_range_range + < + typename add_const_if_c + < + boost::is_const<Geometry>::value, + typename boost::range_value<Geometry>::type + >::type, + Actor + > + > {}; -template <typename Box, typename Actor, bool IsConst> -struct for_each_range<box_tag, Box, Actor, IsConst> - : detail::for_each::fe_range_box<Box, Actor, IsConst> + +template <typename Geometry, typename Actor> +struct for_each_range<Geometry, Actor, multi_polygon_tag> + : detail::for_each::fe_range_multi + < + Geometry, + Actor, + detail::for_each::fe_range_polygon + < + typename add_const_if_c + < + boost::is_const<Geometry>::value, + typename boost::range_value<Geometry>::type + >::type, + Actor + > + > {}; @@ -128,14 +182,12 @@ namespace detail { template <typename Geometry, typename Actor> -inline void for_each_range(Geometry const& geometry, Actor& actor) +inline void for_each_range(Geometry const& geometry, Actor & actor) { dispatch::for_each_range < - typename tag<Geometry>::type, - Geometry, - Actor, - true + Geometry const, + Actor >::apply(geometry, actor); } |