]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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 |