1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2014, Oracle and/or its affiliates. 4 5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 6 7 // Licensed under the Boost Software License version 1.0. 8 // http://www.boost.org/users/license.html 9 10 #ifndef BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP 11 #define BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP 12 13 #include <boost/range.hpp> 14 15 #include <boost/geometry/core/tag.hpp> 16 #include <boost/geometry/core/tags.hpp> 17 18 #include <boost/geometry/algorithms/not_implemented.hpp> 19 20 #include <boost/geometry/iterators/flatten_iterator.hpp> 21 #include <boost/geometry/iterators/concatenate_iterator.hpp> 22 23 #include <boost/geometry/iterators/detail/point_iterator/inner_range_type.hpp> 24 #include <boost/geometry/iterators/detail/point_iterator/value_type.hpp> 25 26 #include <boost/geometry/iterators/dispatch/point_iterator.hpp> 27 28 29 namespace boost { namespace geometry 30 { 31 32 33 #ifndef DOXYGEN_NO_DETAIL 34 namespace detail { namespace point_iterator 35 { 36 37 38 template <typename Geometry, typename Tag = typename tag<Geometry>::type> 39 struct iterator_type 40 : not_implemented<Geometry> 41 {}; 42 43 44 45 46 template <typename Linestring> 47 struct iterator_type<Linestring, linestring_tag> 48 { 49 typedef typename boost::range_iterator<Linestring>::type type; 50 }; 51 52 53 template <typename Ring> 54 struct iterator_type<Ring, ring_tag> 55 { 56 typedef typename boost::range_iterator<Ring>::type type; 57 }; 58 59 60 template <typename Polygon> 61 class iterator_type<Polygon, polygon_tag> 62 { 63 private: 64 typedef typename inner_range_type<Polygon>::type inner_range; 65 66 public: 67 typedef concatenate_iterator 68 < 69 typename boost::range_iterator<inner_range>::type, 70 flatten_iterator 71 < 72 typename boost::range_iterator 73 < 74 typename geometry::interior_type<Polygon>::type 75 >::type, 76 typename iterator_type<inner_range>::type, 77 typename value_type<Polygon>::type, 78 dispatch::points_begin<inner_range>, 79 dispatch::points_end<inner_range> 80 >, 81 typename value_type<Polygon>::type 82 > type; 83 }; 84 85 86 template <typename MultiPoint> 87 struct iterator_type<MultiPoint, multi_point_tag> 88 { 89 typedef typename boost::range_iterator<MultiPoint>::type type; 90 }; 91 92 93 template <typename MultiLinestring> 94 class iterator_type<MultiLinestring, multi_linestring_tag> 95 { 96 private: 97 typedef typename inner_range_type<MultiLinestring>::type inner_range; 98 99 public: 100 typedef flatten_iterator 101 < 102 typename boost::range_iterator<MultiLinestring>::type, 103 typename iterator_type<inner_range>::type, 104 typename value_type<MultiLinestring>::type, 105 dispatch::points_begin<inner_range>, 106 dispatch::points_end<inner_range> 107 > type; 108 }; 109 110 111 template <typename MultiPolygon> 112 class iterator_type<MultiPolygon, multi_polygon_tag> 113 { 114 private: 115 typedef typename inner_range_type<MultiPolygon>::type inner_range; 116 117 public: 118 typedef flatten_iterator 119 < 120 typename boost::range_iterator<MultiPolygon>::type, 121 typename iterator_type<inner_range>::type, 122 typename value_type<MultiPolygon>::type, 123 dispatch::points_begin<inner_range>, 124 dispatch::points_end<inner_range> 125 > type; 126 }; 127 128 129 }} // namespace detail::point_iterator 130 #endif // DOXYGEN_NO_DETAIL 131 132 133 }} // namespace boost::geometry 134 135 136 #endif // BOOST_GEOMETRY_ITERATORS_DETAIL_POINT_ITERATOR_ITERATOR_TYPE_HPP 137