1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands.
4// Copyright (c) 2008-2015 Bruno Lalande, Paris, France.
5// Copyright (c) 2009-2015 Mateusz Loskot, London, UK.
6
7// This file was modified by Oracle on 2015.
8// Modifications copyright (c) 2015, Oracle and/or its affiliates.
9
10// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
11
12// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
13// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
14
15// Use, modification and distribution is subject to the Boost Software License,
16// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
17// http://www.boost.org/LICENSE_1_0.txt)
18
19
20#ifndef BOOST_GEOMETRY_CORE_RING_TYPE_HPP
21#define BOOST_GEOMETRY_CORE_RING_TYPE_HPP
22
23
24#include <boost/mpl/assert.hpp>
25#include <boost/mpl/if.hpp>
26#include <boost/range/value_type.hpp>
27#include <boost/type_traits/is_const.hpp>
28#include <boost/type_traits/remove_const.hpp>
29#include <boost/type_traits/remove_reference.hpp>
30
31#include <boost/geometry/core/tag.hpp>
32#include <boost/geometry/core/tags.hpp>
33
34
35namespace boost { namespace geometry
36{
37
38namespace traits
39{
40
41
42/*!
43\brief Traits class to indicate ring-type of a polygon's exterior ring/interior rings
44\ingroup traits
45\par Geometries:
46 - polygon
47\par Specializations should provide:
48 - typedef XXX type ( e.g. ring<P> )
49\tparam Geometry geometry
50*/
51template <typename Geometry>
52struct ring_const_type
53{
54 BOOST_MPL_ASSERT_MSG
55 (
56 false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
57 , (types<Geometry>)
58 );
59};
60
61template <typename Geometry>
62struct ring_mutable_type
63{
64 BOOST_MPL_ASSERT_MSG
65 (
66 false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE
67 , (types<Geometry>)
68 );
69};
70
71
72} // namespace traits
73
74
75#ifndef DOXYGEN_NO_DISPATCH
76namespace core_dispatch
77{
78
79template <typename GeometryTag, typename Geometry>
80struct ring_return_type
81{};
82
83
84template <typename LineString>
85struct ring_return_type<linestring_tag, LineString>
86{
87 typedef LineString& type;
88};
89
90
91template <typename Ring>
92struct ring_return_type<ring_tag, Ring>
93{
94 typedef Ring& type;
95};
96
97
98template <typename Polygon>
99struct ring_return_type<polygon_tag, Polygon>
100{
101 typedef typename boost::remove_const<Polygon>::type nc_polygon_type;
102
103 typedef typename boost::mpl::if_
104 <
105 boost::is_const<Polygon>,
106 typename traits::ring_const_type<nc_polygon_type>::type,
107 typename traits::ring_mutable_type<nc_polygon_type>::type
108 >::type type;
109};
110
111
112template <typename MultiLinestring>
113struct ring_return_type<multi_linestring_tag, MultiLinestring>
114{
115 typedef typename ring_return_type
116 <
117 linestring_tag,
118 typename boost::mpl::if_
119 <
120 boost::is_const<MultiLinestring>,
121 typename boost::range_value<MultiLinestring>::type const,
122 typename boost::range_value<MultiLinestring>::type
123 >::type
124 >::type type;
125};
126
127
128template <typename MultiPolygon>
129struct ring_return_type<multi_polygon_tag, MultiPolygon>
130{
131 typedef typename ring_return_type
132 <
133 polygon_tag,
134 typename boost::mpl::if_
135 <
136 boost::is_const<MultiPolygon>,
137 typename boost::range_value<MultiPolygon>::type const,
138 typename boost::range_value<MultiPolygon>::type
139 >::type
140 >::type type;
141};
142
143
144template <typename GeometryTag, typename Geometry>
145struct ring_type
146{};
147
148
149template <typename Ring>
150struct ring_type<ring_tag, Ring>
151{
152 typedef Ring type;
153};
154
155
156template <typename Polygon>
157struct ring_type<polygon_tag, Polygon>
158{
159 typedef typename boost::remove_reference
160 <
161 typename ring_return_type<polygon_tag, Polygon>::type
162 >::type type;
163};
164
165
166template <typename MultiLinestring>
167struct ring_type<multi_linestring_tag, MultiLinestring>
168{
169 typedef typename boost::remove_reference
170 <
171 typename ring_return_type<multi_linestring_tag, MultiLinestring>::type
172 >::type type;
173};
174
175
176template <typename MultiPolygon>
177struct ring_type<multi_polygon_tag, MultiPolygon>
178{
179 typedef typename boost::remove_reference
180 <
181 typename ring_return_type<multi_polygon_tag, MultiPolygon>::type
182 >::type type;
183};
184
185
186} // namespace core_dispatch
187#endif
188
189
190/*!
191\brief \brief_meta{type, ring_type, \meta_geometry_type}
192\details A polygon contains one exterior ring
193 and zero or more interior rings (holes).
194 This metafunction retrieves the type of the rings.
195 Exterior ring and each of the interior rings all have the same ring_type.
196\tparam Geometry A type fullfilling the Ring, Polygon or MultiPolygon concept.
197\ingroup core
198
199\qbk{[include reference/core/ring_type.qbk]}
200*/
201template <typename Geometry>
202struct ring_type
203{
204 typedef typename core_dispatch::ring_type
205 <
206 typename tag<Geometry>::type,
207 Geometry
208 >::type type;
209};
210
211
212template <typename Geometry>
213struct ring_return_type
214{
215 typedef typename core_dispatch::ring_return_type
216 <
217 typename tag<Geometry>::type,
218 Geometry
219 >::type type;
220};
221
222
223}} // namespace boost::geometry
224
225
226#endif // BOOST_GEOMETRY_CORE_RING_TYPE_HPP
227

source code of boost/boost/geometry/core/ring_type.hpp