1 | // Boost.Geometry (aka GGL, Generic Geometry Library) |
2 | |
3 | // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. |
4 | // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. |
5 | // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. |
6 | |
7 | // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library |
8 | // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. |
9 | |
10 | // Use, modification and distribution is subject to the Boost Software License, |
11 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
12 | // http://www.boost.org/LICENSE_1_0.txt) |
13 | |
14 | #ifndef BOOST_GEOMETRY_CORE_INTERIOR_RINGS_HPP |
15 | #define BOOST_GEOMETRY_CORE_INTERIOR_RINGS_HPP |
16 | |
17 | #include <cstddef> |
18 | |
19 | #include <boost/mpl/assert.hpp> |
20 | #include <boost/range/value_type.hpp> |
21 | #include <boost/type_traits/remove_const.hpp> |
22 | |
23 | #include <boost/geometry/core/tag.hpp> |
24 | #include <boost/geometry/core/tags.hpp> |
25 | #include <boost/geometry/core/interior_type.hpp> |
26 | |
27 | namespace boost { namespace geometry |
28 | { |
29 | |
30 | namespace traits |
31 | { |
32 | |
33 | |
34 | /*! |
35 | \brief Traits class defining access to interior_rings of a polygon |
36 | \details defines access (const and non const) to interior ring |
37 | \ingroup traits |
38 | \par Geometries: |
39 | - polygon |
40 | \par Specializations should provide: |
41 | - static inline INTERIOR& get(POLY&) |
42 | - static inline const INTERIOR& get(POLY const&) |
43 | \tparam Geometry geometry |
44 | */ |
45 | template <typename Geometry> |
46 | struct interior_rings |
47 | { |
48 | BOOST_MPL_ASSERT_MSG |
49 | ( |
50 | false, NOT_IMPLEMENTED_FOR_THIS_GEOMETRY_TYPE |
51 | , (types<Geometry>) |
52 | ); |
53 | }; |
54 | |
55 | |
56 | } // namespace traits |
57 | |
58 | |
59 | |
60 | |
61 | #ifndef DOXYGEN_NO_DISPATCH |
62 | namespace core_dispatch |
63 | { |
64 | |
65 | template |
66 | < |
67 | typename GeometryTag, |
68 | typename Geometry |
69 | > |
70 | struct interior_rings {}; |
71 | |
72 | |
73 | template <typename Polygon> |
74 | struct interior_rings<polygon_tag, Polygon> |
75 | { |
76 | static inline |
77 | typename geometry::interior_return_type<Polygon>::type |
78 | apply(Polygon& polygon) |
79 | { |
80 | return traits::interior_rings |
81 | < |
82 | typename boost::remove_const<Polygon>::type |
83 | >::get(polygon); |
84 | } |
85 | }; |
86 | |
87 | |
88 | template <typename MultiPolygon> |
89 | struct interior_type<multi_polygon_tag, MultiPolygon> |
90 | { |
91 | typedef typename core_dispatch::interior_type |
92 | < |
93 | polygon_tag, |
94 | typename boost::range_value<MultiPolygon>::type |
95 | >::type type; |
96 | }; |
97 | |
98 | |
99 | } // namespace core_dispatch |
100 | #endif |
101 | |
102 | |
103 | |
104 | /*! |
105 | \brief Function to get the interior rings of a polygon (non const version) |
106 | \ingroup interior_rings |
107 | \note OGC compliance: instead of InteriorRingN |
108 | \tparam Polygon polygon type |
109 | \param polygon the polygon to get the interior rings from |
110 | \return the interior rings (possibly a reference) |
111 | */ |
112 | |
113 | template <typename Polygon> |
114 | inline typename interior_return_type<Polygon>::type interior_rings(Polygon& polygon) |
115 | { |
116 | return core_dispatch::interior_rings |
117 | < |
118 | typename tag<Polygon>::type, |
119 | Polygon |
120 | >::apply(polygon); |
121 | } |
122 | |
123 | |
124 | /*! |
125 | \brief Function to get the interior rings of a polygon (const version) |
126 | \ingroup interior_rings |
127 | \note OGC compliance: instead of InteriorRingN |
128 | \tparam Polygon polygon type |
129 | \param polygon the polygon to get the interior rings from |
130 | \return the interior rings (possibly a const reference) |
131 | |
132 | \qbk{distinguish,const version} |
133 | */ |
134 | template <typename Polygon> |
135 | inline typename interior_return_type<Polygon const>::type interior_rings( |
136 | Polygon const& polygon) |
137 | { |
138 | return core_dispatch::interior_rings |
139 | < |
140 | typename tag<Polygon>::type, |
141 | Polygon const |
142 | >::apply(polygon); |
143 | } |
144 | |
145 | |
146 | |
147 | }} // namespace boost::geometry |
148 | |
149 | |
150 | #endif // BOOST_GEOMETRY_CORE_INTERIOR_RINGS_HPP |
151 | |