diff --git a/include/boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp b/include/boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp new file mode 100644 index 000000000..b2239fb8d --- /dev/null +++ b/include/boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp @@ -0,0 +1,66 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP +#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP + +#include +#include +#include + +#include +#include +#include + + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace point_iterator +{ + + +template +< + typename Geometry, + typename Tag = typename tag::type +> +struct inner_range_type +{ + typedef typename boost::mpl::if_c + < + !boost::is_const::type::value, + typename boost::range_value::type, + typename boost::range_value::type const + >::type type; +}; + + +template +struct inner_range_type +{ + typedef typename boost::mpl::if_c + < + !boost::is_const::type::value, + typename geometry::ring_type::type, + typename geometry::ring_type::type const + >::type type; +}; + + +}} // namespace detail::point_iterator +#endif // DOXYGEN_NO_DETAIL + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_INNER_RANGE_TYPE_HPP diff --git a/include/boost/geometry/iterators/detail/point_iterator/iterator_type.hpp b/include/boost/geometry/iterators/detail/point_iterator/iterator_type.hpp new file mode 100644 index 000000000..a7805b127 --- /dev/null +++ b/include/boost/geometry/iterators/detail/point_iterator/iterator_type.hpp @@ -0,0 +1,136 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP +#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP + +#include + +#include +#include + +#include + +#include +#include + +#include +#include + +#include + + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace point_iterator +{ + + +template ::type> +struct iterator_type + : not_implemented +{}; + + + + +template +struct iterator_type +{ + typedef typename boost::range_iterator::type type; +}; + + +template +struct iterator_type +{ + typedef typename boost::range_iterator::type type; +}; + + +template +class iterator_type +{ +private: + typedef typename inner_range_type::type inner_range; + +public: + typedef concatenate_iterator + < + typename boost::range_iterator::type, + flatten_iterator + < + typename boost::range_iterator + < + typename geometry::interior_type::type + >::type, + typename iterator_type::type, + typename value_type::type, + dispatch::points_begin, + dispatch::points_end + >, + typename value_type::type + > type; +}; + + +template +struct iterator_type +{ + typedef typename boost::range_iterator::type type; +}; + + +template +class iterator_type +{ +private: + typedef typename inner_range_type::type inner_range; + +public: + typedef flatten_iterator + < + typename boost::range_iterator::type, + typename iterator_type::type, + typename value_type::type, + dispatch::points_begin, + dispatch::points_end + > type; +}; + + +template +class iterator_type +{ +private: + typedef typename inner_range_type::type inner_range; + +public: + typedef flatten_iterator + < + typename boost::range_iterator::type, + typename iterator_type::type, + typename value_type::type, + dispatch::points_begin, + dispatch::points_end + > type; +}; + + +}} // namespace detail::point_iterator +#endif // DOXYGEN_NO_DETAIL + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP diff --git a/include/boost/geometry/iterators/detail/point_iterator/value_type.hpp b/include/boost/geometry/iterators/detail/point_iterator/value_type.hpp new file mode 100644 index 000000000..7cdf36639 --- /dev/null +++ b/include/boost/geometry/iterators/detail/point_iterator/value_type.hpp @@ -0,0 +1,47 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) + +// Copyright (c) 2014, Oracle and/or its affiliates. + +// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle + +// Licensed under the Boost Software License version 1.0. +// http://www.boost.org/users/license.html + +#ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP +#define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP + +#include +#include + +#include + + +namespace boost { namespace geometry +{ + + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace point_iterator +{ + + +template +struct value_type +{ + typedef typename boost::mpl::if_c + < + !boost::is_const::type::value, + typename geometry::point_type::type, + typename geometry::point_type::type const + >::type type; +}; + + +}} // namespace detail::point_iterator +#endif // DOXYGEN_NO_DETAIL + + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_VALUE_TYPE_HPP diff --git a/include/boost/geometry/iterators/dispatch/point_iterator_type.hpp b/include/boost/geometry/iterators/dispatch/point_iterator_type.hpp deleted file mode 100644 index 02c40acae..000000000 --- a/include/boost/geometry/iterators/dispatch/point_iterator_type.hpp +++ /dev/null @@ -1,37 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2014, Oracle and/or its affiliates. - -// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle - -// Licensed under the Boost Software License version 1.0. -// http://www.boost.org/users/license.html - -#ifndef BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_TYPE_HPP -#define BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_TYPE_HPP - -#include -#include - -namespace boost { namespace geometry -{ - - -#ifndef DOXYGEN_NO_DISPATCH -namespace dispatch -{ - -template ::type> -struct point_iterator_type - : not_implemented -{}; - - - -} // namespace dispatch -#endif // DOXYGEN_NO_DISPATCH - - -}} // namespace boost::geometry - -#endif // BOOST_GEOMETRY_ITERATORS_DISPATCH_POINT_ITERATOR_TYPE_HPP diff --git a/include/boost/geometry/iterators/point_iterator.hpp b/include/boost/geometry/iterators/point_iterator.hpp index bfe0065d4..075339aa5 100644 --- a/include/boost/geometry/iterators/point_iterator.hpp +++ b/include/boost/geometry/iterators/point_iterator.hpp @@ -20,7 +20,7 @@ #include #include -#include +#include namespace boost { namespace geometry @@ -38,7 +38,10 @@ namespace dispatch template struct points_begin { - static inline typename point_iterator_type::type + static inline typename detail::point_iterator::iterator_type + < + Linestring + >::type apply(Linestring& linestring) { return boost::begin(linestring); @@ -49,7 +52,7 @@ struct points_begin template struct points_begin { - static inline typename point_iterator_type::type + static inline typename detail::point_iterator::iterator_type::type apply(Ring& ring) { return boost::begin(ring); @@ -60,7 +63,10 @@ struct points_begin template struct points_begin { - typedef typename point_iterator_type::type return_type; + typedef typename detail::point_iterator::iterator_type + < + Polygon + >::type return_type; static inline return_type apply(Polygon& polygon) { @@ -83,7 +89,10 @@ struct points_begin template struct points_begin { - static inline typename point_iterator_type::type + static inline typename detail::point_iterator::iterator_type + < + MultiPoint + >::type apply(MultiPoint& multipoint) { return boost::begin(multipoint); @@ -94,13 +103,15 @@ struct points_begin template struct points_begin { - static inline typename point_iterator_type::type - apply(MultiLinestring& multilinestring) + typedef typename detail::point_iterator::iterator_type + < + MultiLinestring + >::type return_type; + + static inline return_type apply(MultiLinestring& multilinestring) { - return typename point_iterator_type - < - MultiLinestring - >::type(boost::begin(multilinestring), boost::end(multilinestring)); + return return_type(boost::begin(multilinestring), + boost::end(multilinestring)); } }; @@ -108,13 +119,15 @@ struct points_begin template struct points_begin { - static inline typename point_iterator_type::type - apply(MultiPolygon& multipolygon) + typedef typename detail::point_iterator::iterator_type + < + MultiPolygon + >::type return_type; + + static inline return_type apply(MultiPolygon& multipolygon) { - return typename point_iterator_type - < - MultiPolygon - >::type(boost::begin(multipolygon), boost::end(multipolygon)); + return return_type(boost::begin(multipolygon), + boost::end(multipolygon)); } }; @@ -136,7 +149,10 @@ namespace dispatch template struct points_end { - static inline typename point_iterator_type::type + static inline typename detail::point_iterator::iterator_type + < + Linestring + >::type apply(Linestring& linestring) { return boost::end(linestring); @@ -147,7 +163,7 @@ struct points_end template struct points_end { - static inline typename point_iterator_type::type + static inline typename detail::point_iterator::iterator_type::type apply(Ring& ring) { return boost::end(ring); @@ -158,7 +174,10 @@ struct points_end template struct points_end { - typedef typename point_iterator_type::type return_type; + typedef typename detail::point_iterator::iterator_type + < + Polygon + >::type return_type; static inline return_type apply(Polygon& polygon) { @@ -178,7 +197,10 @@ struct points_end template struct points_end { - static inline typename point_iterator_type::type + static inline typename detail::point_iterator::iterator_type + < + MultiPoint + >::type apply(MultiPoint& multipoint) { return boost::end(multipoint); @@ -189,13 +211,14 @@ struct points_end template struct points_end { - static inline typename point_iterator_type::type - apply(MultiLinestring& multilinestring) + typedef typename detail::point_iterator::iterator_type + < + MultiLinestring + >::type return_type; + + static inline return_type apply(MultiLinestring& multilinestring) { - return typename point_iterator_type - < - MultiLinestring - >::type(boost::end(multilinestring)); + return return_type(boost::end(multilinestring)); } }; @@ -203,13 +226,14 @@ struct points_end template struct points_end { - static inline typename point_iterator_type::type - apply(MultiPolygon& multipolygon) + typedef typename detail::point_iterator::iterator_type + < + MultiPolygon + >::type return_type; + + static inline return_type apply(MultiPolygon& multipolygon) { - return typename point_iterator_type - < - MultiPolygon - >::type(boost::end(multipolygon)); + return return_type(boost::end(multipolygon)); } }; @@ -221,17 +245,17 @@ struct points_end // MK:: need to add doc here template class point_iterator - : public dispatch::point_iterator_type::type + : public detail::point_iterator::iterator_type::type { private: - typedef typename dispatch::point_iterator_type::type base; + typedef typename detail::point_iterator::iterator_type::type base; - base* base_ptr() + inline base* base_ptr() { return this; } - base const* base_ptr() const + inline base const* base_ptr() const { return this; } @@ -240,19 +264,25 @@ private: template friend inline point_iterator points_begin(G&); template friend inline point_iterator points_end(G&); - point_iterator(base const& base_it) : base(base_it) {} + inline point_iterator(base const& base_it) : base(base_it) {} public: - point_iterator() {} + inline point_iterator() {} template - point_iterator(point_iterator const& other) + inline point_iterator(point_iterator const& other) : base(*other.base_ptr()) { static const bool is_conv = boost::is_convertible< - typename dispatch::point_iterator_type::type, - typename dispatch::point_iterator_type::type + typename detail::point_iterator::iterator_type + < + OtherGeometry + >::type, + typename detail::point_iterator::iterator_type + < + Geometry + >::type >::value; BOOST_MPL_ASSERT_MSG((is_conv), diff --git a/include/boost/geometry/iterators/point_iterator_type.hpp b/include/boost/geometry/iterators/point_iterator_type.hpp deleted file mode 100644 index 28a7d4e81..000000000 --- a/include/boost/geometry/iterators/point_iterator_type.hpp +++ /dev/null @@ -1,208 +0,0 @@ -// Boost.Geometry (aka GGL, Generic Geometry Library) - -// Copyright (c) 2014, Oracle and/or its affiliates. - -// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle - -// Licensed under the Boost Software License version 1.0. -// http://www.boost.org/users/license.html - -#ifndef BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_TYPE_HPP -#define BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_TYPE_HPP - -#include -#include - -#include -#include -#include - -#include -#include -#include -#include - -#include -#include - - -namespace boost { namespace geometry -{ - - - -#ifndef DOXYGEN_NO_DETAIL -namespace detail_dispatch -{ - - -template -struct point_iterator_value_type -{ - typedef typename boost::mpl::if_c - < - !boost::is_const::type::value, - typename geometry::point_type::type, - typename geometry::point_type::type const - >::type type; -}; - - - - -template -< - typename Geometry, - typename Tag = typename tag::type -> -struct point_iterator_inner_range_type -{ - typedef typename boost::mpl::if_c - < - !boost::is_const::type::value, - typename boost::range_value::type, - typename boost::range_value::type const - >::type type; -}; - - -template -struct point_iterator_inner_range_type -{ - typedef typename boost::mpl::if_c - < - !boost::is_const::type::value, - typename geometry::ring_type::type, - typename geometry::ring_type::type const - >::type type; -}; - - - -} // namespace detail_dispatch -#endif // DOXYGEN_NO_DETAIL - - - - - -#ifndef DOXYGEN_NO_DISPATCH -namespace dispatch -{ - - -template -struct point_iterator_type -{ - typedef typename boost::range_iterator::type type; -}; - - -template -struct point_iterator_type -{ - typedef typename boost::range_iterator::type type; -}; - - -template -class point_iterator_type -{ -private: - typedef typename detail_dispatch::point_iterator_inner_range_type - < - Polygon - >::type inner_range; - -public: - typedef concatenate_iterator - < - typename boost::range_iterator::type, - flatten_iterator - < - typename boost::range_iterator - < - typename geometry::interior_type::type - >::type, - typename dispatch::point_iterator_type - < - inner_range - >::type, - typename detail_dispatch::point_iterator_value_type - < - Polygon - >::type, - dispatch::points_begin, - dispatch::points_end - >, - typename detail_dispatch::point_iterator_value_type::type - > type; -}; - - -template -struct point_iterator_type -{ - typedef typename boost::range_iterator::type type; -}; - - -template -class point_iterator_type -{ -private: - typedef typename detail_dispatch::point_iterator_inner_range_type - < - MultiLinestring - >::type inner_range; - -public: - typedef flatten_iterator - < - typename boost::range_iterator::type, - typename dispatch::point_iterator_type::type, - typename detail_dispatch::point_iterator_value_type - < - MultiLinestring - >::type, - dispatch::points_begin, - dispatch::points_end - > type; -}; - - -template -class point_iterator_type -{ -private: - typedef typename detail_dispatch::point_iterator_inner_range_type - < - MultiPolygon - >::type inner_range; - -public: - typedef flatten_iterator - < - typename boost::range_iterator::type, - typename dispatch::point_iterator_type::type, - typename detail_dispatch::point_iterator_value_type - < - MultiPolygon - >::type, - dispatch::points_begin, - dispatch::points_end - > type; -}; - - - - - -} // namespace dispatch -#endif // DOXYGEN_NO_DISPATCH - - -}} // namespace boost::geometry - - -#endif // BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_TYPE_HPP