Chris@102: // Boost.Geometry (aka GGL, Generic Geometry Library) Chris@102: Chris@102: // Copyright (c) 2014, Oracle and/or its affiliates. Chris@102: Chris@102: // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle Chris@102: Chris@102: // Licensed under the Boost Software License version 1.0. Chris@102: // http://www.boost.org/users/license.html Chris@102: Chris@102: #ifndef BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP Chris@102: #define BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: #include Chris@102: #include Chris@102: Chris@102: Chris@102: namespace boost { namespace geometry Chris@102: { Chris@102: Chris@102: Chris@102: #ifndef DOXYGEN_NO_DISPATCH Chris@102: namespace dispatch Chris@102: { Chris@102: Chris@102: Chris@102: // specializations for points_begin Chris@102: Chris@102: Chris@102: template Chris@102: struct points_begin Chris@102: { Chris@102: static inline typename detail::point_iterator::iterator_type Chris@102: < Chris@102: Linestring Chris@102: >::type Chris@102: apply(Linestring& linestring) Chris@102: { Chris@102: return boost::begin(linestring); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_begin Chris@102: { Chris@102: static inline typename detail::point_iterator::iterator_type::type Chris@102: apply(Ring& ring) Chris@102: { Chris@102: return boost::begin(ring); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_begin Chris@102: { Chris@102: typedef typename detail::point_iterator::iterator_type Chris@102: < Chris@102: Polygon Chris@102: >::type return_type; Chris@102: Chris@102: static inline return_type apply(Polygon& polygon) Chris@102: { Chris@102: typedef typename return_type::second_iterator_type flatten_iterator; Chris@102: Chris@102: return return_type Chris@102: (boost::begin(geometry::exterior_ring(polygon)), Chris@102: boost::end(geometry::exterior_ring(polygon)), Chris@102: flatten_iterator(boost::begin(geometry::interior_rings(polygon)), Chris@102: boost::end(geometry::interior_rings(polygon)) Chris@102: ), Chris@102: flatten_iterator(boost::begin(geometry::interior_rings(polygon)), Chris@102: boost::end(geometry::interior_rings(polygon)) Chris@102: ) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_begin Chris@102: { Chris@102: static inline typename detail::point_iterator::iterator_type Chris@102: < Chris@102: MultiPoint Chris@102: >::type Chris@102: apply(MultiPoint& multipoint) Chris@102: { Chris@102: return boost::begin(multipoint); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_begin Chris@102: { Chris@102: typedef typename detail::point_iterator::iterator_type Chris@102: < Chris@102: MultiLinestring Chris@102: >::type return_type; Chris@102: Chris@102: static inline return_type apply(MultiLinestring& multilinestring) Chris@102: { Chris@102: return return_type(boost::begin(multilinestring), Chris@102: boost::end(multilinestring)); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_begin Chris@102: { Chris@102: typedef typename detail::point_iterator::iterator_type Chris@102: < Chris@102: MultiPolygon Chris@102: >::type return_type; Chris@102: Chris@102: static inline return_type apply(MultiPolygon& multipolygon) Chris@102: { Chris@102: return return_type(boost::begin(multipolygon), Chris@102: boost::end(multipolygon)); Chris@102: } Chris@102: }; Chris@102: Chris@102: } // namespace dispatch Chris@102: #endif // DOXYGEN_NO_DISPATCH Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: Chris@102: #ifndef DOXYGEN_NO_DISPATCH Chris@102: namespace dispatch Chris@102: { Chris@102: Chris@102: Chris@102: // specializations for points_end Chris@102: Chris@102: Chris@102: template Chris@102: struct points_end Chris@102: { Chris@102: static inline typename detail::point_iterator::iterator_type Chris@102: < Chris@102: Linestring Chris@102: >::type Chris@102: apply(Linestring& linestring) Chris@102: { Chris@102: return boost::end(linestring); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_end Chris@102: { Chris@102: static inline typename detail::point_iterator::iterator_type::type Chris@102: apply(Ring& ring) Chris@102: { Chris@102: return boost::end(ring); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_end Chris@102: { Chris@102: typedef typename detail::point_iterator::iterator_type Chris@102: < Chris@102: Polygon Chris@102: >::type return_type; Chris@102: Chris@102: static inline return_type apply(Polygon& polygon) Chris@102: { Chris@102: typedef typename return_type::second_iterator_type flatten_iterator; Chris@102: Chris@102: return return_type Chris@102: (boost::end(geometry::exterior_ring(polygon)), Chris@102: flatten_iterator(boost::begin(geometry::interior_rings(polygon)), Chris@102: boost::end(geometry::interior_rings(polygon)) Chris@102: ), Chris@102: flatten_iterator( boost::end(geometry::interior_rings(polygon)) ) Chris@102: ); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_end Chris@102: { Chris@102: static inline typename detail::point_iterator::iterator_type Chris@102: < Chris@102: MultiPoint Chris@102: >::type Chris@102: apply(MultiPoint& multipoint) Chris@102: { Chris@102: return boost::end(multipoint); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_end Chris@102: { Chris@102: typedef typename detail::point_iterator::iterator_type Chris@102: < Chris@102: MultiLinestring Chris@102: >::type return_type; Chris@102: Chris@102: static inline return_type apply(MultiLinestring& multilinestring) Chris@102: { Chris@102: return return_type(boost::end(multilinestring)); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: template Chris@102: struct points_end Chris@102: { Chris@102: typedef typename detail::point_iterator::iterator_type Chris@102: < Chris@102: MultiPolygon Chris@102: >::type return_type; Chris@102: Chris@102: static inline return_type apply(MultiPolygon& multipolygon) Chris@102: { Chris@102: return return_type(boost::end(multipolygon)); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: } // namespace dispatch Chris@102: #endif // DOXYGEN_NO_DISPATCH Chris@102: Chris@102: Chris@102: // MK:: need to add doc here Chris@102: template Chris@102: class point_iterator Chris@102: : public boost::iterator_adaptor Chris@102: < Chris@102: point_iterator, Chris@102: typename detail::point_iterator::iterator_type::type Chris@102: > Chris@102: { Chris@102: private: Chris@102: template friend class point_iterator; Chris@102: template friend inline point_iterator points_begin(G&); Chris@102: template friend inline point_iterator points_end(G&); Chris@102: Chris@102: inline point_iterator(typename point_iterator::base_type const& base_it) Chris@102: : point_iterator::iterator_adaptor_(base_it) {} Chris@102: Chris@102: public: Chris@102: inline point_iterator() {} Chris@102: Chris@102: template Chris@102: inline point_iterator(point_iterator const& other) Chris@102: : point_iterator::iterator_adaptor_(other.base()) Chris@102: { Chris@102: static const bool is_conv Chris@102: = boost::is_convertible< Chris@102: typename detail::point_iterator::iterator_type Chris@102: < Chris@102: OtherGeometry Chris@102: >::type, Chris@102: typename detail::point_iterator::iterator_type Chris@102: < Chris@102: Geometry Chris@102: >::type Chris@102: >::value; Chris@102: Chris@102: BOOST_MPL_ASSERT_MSG((is_conv), Chris@102: NOT_CONVERTIBLE, Chris@102: (point_iterator)); Chris@102: } Chris@102: }; Chris@102: Chris@102: Chris@102: // MK:: need to add doc here Chris@102: template Chris@102: inline point_iterator Chris@102: points_begin(Geometry& geometry) Chris@102: { Chris@102: return dispatch::points_begin::apply(geometry); Chris@102: } Chris@102: Chris@102: Chris@102: // MK:: need to add doc here Chris@102: template Chris@102: inline point_iterator Chris@102: points_end(Geometry& geometry) Chris@102: { Chris@102: return dispatch::points_end::apply(geometry); Chris@102: } Chris@102: Chris@102: Chris@102: }} // namespace boost::geometry Chris@102: Chris@102: #endif // BOOST_GEOMETRY_ITERATORS_POINT_ITERATOR_HPP