]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/geometry/algorithms/is_empty.hpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / boost / geometry / algorithms / is_empty.hpp
CommitLineData
7c673cae
FG
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
20effc67 3// Copyright (c) 2015-2020, Oracle and/or its affiliates.
7c673cae
FG
4
5// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
20effc67 6// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
7c673cae
FG
7
8// Licensed under the Boost Software License version 1.0.
9// http://www.boost.org/users/license.html
10
11#ifndef BOOST_GEOMETRY_ALGORITHMS_IS_EMPTY_HPP
12#define BOOST_GEOMETRY_ALGORITHMS_IS_EMPTY_HPP
13
20effc67
TL
14#include <boost/range/begin.hpp>
15#include <boost/range/empty.hpp>
16#include <boost/range/end.hpp>
7c673cae
FG
17
18#include <boost/variant/apply_visitor.hpp>
19#include <boost/variant/static_visitor.hpp>
20#include <boost/variant/variant_fwd.hpp>
21
22#include <boost/geometry/core/exterior_ring.hpp>
23#include <boost/geometry/core/interior_rings.hpp>
24#include <boost/geometry/core/tag.hpp>
25#include <boost/geometry/core/tags.hpp>
26
27#include <boost/geometry/algorithms/not_implemented.hpp>
28
29#include <boost/geometry/algorithms/detail/check_iterator_range.hpp>
30
31#include <boost/geometry/geometries/concepts/check.hpp>
32
33
34namespace boost { namespace geometry
35{
36
37
38#ifndef DOXYGEN_NO_DETAIL
39namespace detail { namespace is_empty
40{
41
42struct always_not_empty
43{
44 template <typename Geometry>
45 static inline bool apply(Geometry const&)
46 {
47 return false;
48 }
49};
50
51struct range_is_empty
52{
53 template <typename Range>
54 static inline bool apply(Range const& range)
55 {
56 return boost::empty(range);
57 }
58};
59
60class polygon_is_empty
61{
62 template <typename InteriorRings>
63 static inline bool check_interior_rings(InteriorRings const& interior_rings)
64 {
65 return check_iterator_range
66 <
67 range_is_empty, true // allow empty range
68 >::apply(boost::begin(interior_rings), boost::end(interior_rings));
69 }
70
71public:
72 template <typename Polygon>
73 static inline bool apply(Polygon const& polygon)
74 {
75 return boost::empty(exterior_ring(polygon))
76 && check_interior_rings(interior_rings(polygon));
77 }
78};
79
80template <typename Policy = range_is_empty>
81struct multi_is_empty
82{
83 template <typename MultiGeometry>
84 static inline bool apply(MultiGeometry const& multigeometry)
85 {
86 return check_iterator_range
87 <
88 Policy, true // allow empty range
89 >::apply(boost::begin(multigeometry), boost::end(multigeometry));
90 }
91
92};
93
94}} // namespace detail::is_empty
95#endif // DOXYGEN_NO_DETAIL
96
97
98#ifndef DOXYGEN_NO_DISPATCH
99namespace dispatch
100{
101
102template <typename Geometry, typename Tag = typename tag<Geometry>::type>
103struct is_empty : not_implemented<Tag>
104{};
105
106template <typename Geometry>
107struct is_empty<Geometry, point_tag>
108 : detail::is_empty::always_not_empty
109{};
110
111template <typename Geometry>
112struct is_empty<Geometry, box_tag>
113 : detail::is_empty::always_not_empty
114{};
115
116template <typename Geometry>
117struct is_empty<Geometry, segment_tag>
118 : detail::is_empty::always_not_empty
119{};
120
121template <typename Geometry>
122struct is_empty<Geometry, linestring_tag>
123 : detail::is_empty::range_is_empty
124{};
125
126template <typename Geometry>
127struct is_empty<Geometry, ring_tag>
128 : detail::is_empty::range_is_empty
129{};
130
131template <typename Geometry>
132struct is_empty<Geometry, polygon_tag>
133 : detail::is_empty::polygon_is_empty
134{};
135
136template <typename Geometry>
137struct is_empty<Geometry, multi_point_tag>
138 : detail::is_empty::range_is_empty
139{};
140
141template <typename Geometry>
142struct is_empty<Geometry, multi_linestring_tag>
143 : detail::is_empty::multi_is_empty<>
144{};
145
146template <typename Geometry>
147struct is_empty<Geometry, multi_polygon_tag>
148 : detail::is_empty::multi_is_empty<detail::is_empty::polygon_is_empty>
149{};
150
151} // namespace dispatch
152#endif // DOXYGEN_NO_DISPATCH
153
154
155namespace resolve_variant
156{
157
158template <typename Geometry>
159struct is_empty
160{
161 static inline bool apply(Geometry const& geometry)
162 {
163 concepts::check<Geometry const>();
164
165 return dispatch::is_empty<Geometry>::apply(geometry);
166 }
167};
168
169template <BOOST_VARIANT_ENUM_PARAMS(typename T)>
170struct is_empty<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
171{
172 struct visitor : boost::static_visitor<bool>
173 {
174 template <typename Geometry>
175 inline bool operator()(Geometry const& geometry) const
176 {
177 return is_empty<Geometry>::apply(geometry);
178 }
179 };
180
181 static bool
182 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry)
183 {
184 return boost::apply_visitor(visitor(), geometry);
185 }
186};
187
188} // namespace resolve_variant
189
190
191/*!
192\brief \brief_check{is the empty set}
193\ingroup is_empty
194\tparam Geometry \tparam_geometry
195\param geometry \param_geometry
196\return \return_check{is the empty set}
197
198\qbk{[include reference/algorithms/is_empty.qbk]}
199*/
200template <typename Geometry>
201inline bool is_empty(Geometry const& geometry)
202{
203 return resolve_variant::is_empty<Geometry>::apply(geometry);
204}
205
206
207}} // namespace boost::geometry
208
209
210#endif // BOOST_GEOMETRY_ALGORITHMS_IS_EMPTY_HPP