]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/geometry/include/boost/geometry/algorithms/covered_by.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / geometry / include / boost / geometry / algorithms / covered_by.hpp
CommitLineData
7c673cae
FG
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// This file was modified by Oracle on 2013, 2014.
8// Modifications copyright (c) 2013, 2014 Oracle and/or its affiliates.
9
10// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
11// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
12
13// Use, modification and distribution is subject to the Boost Software License,
14// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
15// http://www.boost.org/LICENSE_1_0.txt)
16
17// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
18
19#ifndef BOOST_GEOMETRY_ALGORITHMS_COVERED_BY_HPP
20#define BOOST_GEOMETRY_ALGORITHMS_COVERED_BY_HPP
21
22
23#include <cstddef>
24
25#include <boost/variant/apply_visitor.hpp>
26#include <boost/variant/static_visitor.hpp>
27#include <boost/variant/variant_fwd.hpp>
28
29#include <boost/geometry/algorithms/not_implemented.hpp>
30#include <boost/geometry/algorithms/within.hpp>
31
32#include <boost/geometry/strategies/cartesian/point_in_box.hpp>
33#include <boost/geometry/strategies/cartesian/box_in_box.hpp>
34#include <boost/geometry/strategies/default_strategy.hpp>
35
36namespace boost { namespace geometry
37{
38
39#ifndef DOXYGEN_NO_DETAIL
40namespace detail { namespace covered_by {
41
42struct use_point_in_geometry
43{
44 template <typename Geometry1, typename Geometry2, typename Strategy>
45 static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& strategy)
46 {
47 return detail::within::point_in_geometry(geometry1, geometry2, strategy) >= 0;
48 }
49};
50
51struct use_relate
52{
53 template <typename Geometry1, typename Geometry2, typename Strategy>
54 static inline bool apply(Geometry1 const& geometry1, Geometry2 const& geometry2, Strategy const& /*strategy*/)
55 {
56 return Strategy::apply(geometry1, geometry2);
57 }
58};
59
60}} // namespace detail::covered_by
61#endif // DOXYGEN_NO_DETAIL
62
63#ifndef DOXYGEN_NO_DISPATCH
64namespace dispatch
65{
66
67template
68<
69 typename Geometry1,
70 typename Geometry2,
71 typename Tag1 = typename tag<Geometry1>::type,
72 typename Tag2 = typename tag<Geometry2>::type
73>
74struct covered_by
75 : not_implemented<Tag1, Tag2>
76{};
77
78
79template <typename Point, typename Box>
80struct covered_by<Point, Box, point_tag, box_tag>
81{
82 template <typename Strategy>
83 static inline bool apply(Point const& point, Box const& box, Strategy const& strategy)
84 {
85 ::boost::ignore_unused_variable_warning(strategy);
86 return strategy.apply(point, box);
87 }
88};
89
90template <typename Box1, typename Box2>
91struct covered_by<Box1, Box2, box_tag, box_tag>
92{
93 template <typename Strategy>
94 static inline bool apply(Box1 const& box1, Box2 const& box2, Strategy const& strategy)
95 {
96 assert_dimension_equal<Box1, Box2>();
97 ::boost::ignore_unused_variable_warning(strategy);
98 return strategy.apply(box1, box2);
99 }
100};
101
102
103// P/P
104
105template <typename Point1, typename Point2>
106struct covered_by<Point1, Point2, point_tag, point_tag>
107 : public detail::covered_by::use_point_in_geometry
108{};
109
110template <typename Point, typename MultiPoint>
111struct covered_by<Point, MultiPoint, point_tag, multi_point_tag>
112 : public detail::covered_by::use_point_in_geometry
113{};
114
115// P/L
116
117template <typename Point, typename Segment>
118struct covered_by<Point, Segment, point_tag, segment_tag>
119 : public detail::covered_by::use_point_in_geometry
120{};
121
122template <typename Point, typename Linestring>
123struct covered_by<Point, Linestring, point_tag, linestring_tag>
124 : public detail::covered_by::use_point_in_geometry
125{};
126
127template <typename Point, typename MultiLinestring>
128struct covered_by<Point, MultiLinestring, point_tag, multi_linestring_tag>
129 : public detail::covered_by::use_point_in_geometry
130{};
131
132// P/A
133
134template <typename Point, typename Ring>
135struct covered_by<Point, Ring, point_tag, ring_tag>
136 : public detail::covered_by::use_point_in_geometry
137{};
138
139template <typename Point, typename Polygon>
140struct covered_by<Point, Polygon, point_tag, polygon_tag>
141 : public detail::covered_by::use_point_in_geometry
142{};
143
144template <typename Point, typename MultiPolygon>
145struct covered_by<Point, MultiPolygon, point_tag, multi_polygon_tag>
146 : public detail::covered_by::use_point_in_geometry
147{};
148
149// L/L
150
151template <typename Linestring1, typename Linestring2>
152struct covered_by<Linestring1, Linestring2, linestring_tag, linestring_tag>
153 : public detail::covered_by::use_relate
154{};
155
156template <typename Linestring, typename MultiLinestring>
157struct covered_by<Linestring, MultiLinestring, linestring_tag, multi_linestring_tag>
158 : public detail::covered_by::use_relate
159{};
160
161template <typename MultiLinestring, typename Linestring>
162struct covered_by<MultiLinestring, Linestring, multi_linestring_tag, linestring_tag>
163 : public detail::covered_by::use_relate
164{};
165
166template <typename MultiLinestring1, typename MultiLinestring2>
167struct covered_by<MultiLinestring1, MultiLinestring2, multi_linestring_tag, multi_linestring_tag>
168 : public detail::covered_by::use_relate
169{};
170
171// L/A
172
173template <typename Linestring, typename Ring>
174struct covered_by<Linestring, Ring, linestring_tag, ring_tag>
175 : public detail::covered_by::use_relate
176{};
177
178template <typename MultiLinestring, typename Ring>
179struct covered_by<MultiLinestring, Ring, multi_linestring_tag, ring_tag>
180 : public detail::covered_by::use_relate
181{};
182
183template <typename Linestring, typename Polygon>
184struct covered_by<Linestring, Polygon, linestring_tag, polygon_tag>
185 : public detail::covered_by::use_relate
186{};
187
188template <typename MultiLinestring, typename Polygon>
189struct covered_by<MultiLinestring, Polygon, multi_linestring_tag, polygon_tag>
190 : public detail::covered_by::use_relate
191{};
192
193template <typename Linestring, typename MultiPolygon>
194struct covered_by<Linestring, MultiPolygon, linestring_tag, multi_polygon_tag>
195 : public detail::covered_by::use_relate
196{};
197
198template <typename MultiLinestring, typename MultiPolygon>
199struct covered_by<MultiLinestring, MultiPolygon, multi_linestring_tag, multi_polygon_tag>
200 : public detail::covered_by::use_relate
201{};
202
203// A/A
204
205template <typename Ring1, typename Ring2>
206struct covered_by<Ring1, Ring2, ring_tag, ring_tag>
207 : public detail::covered_by::use_relate
208{};
209
210template <typename Ring, typename Polygon>
211struct covered_by<Ring, Polygon, ring_tag, polygon_tag>
212 : public detail::covered_by::use_relate
213{};
214
215template <typename Polygon, typename Ring>
216struct covered_by<Polygon, Ring, polygon_tag, ring_tag>
217 : public detail::covered_by::use_relate
218{};
219
220template <typename Polygon1, typename Polygon2>
221struct covered_by<Polygon1, Polygon2, polygon_tag, polygon_tag>
222 : public detail::covered_by::use_relate
223{};
224
225template <typename Ring, typename MultiPolygon>
226struct covered_by<Ring, MultiPolygon, ring_tag, multi_polygon_tag>
227 : public detail::covered_by::use_relate
228{};
229
230template <typename MultiPolygon, typename Ring>
231struct covered_by<MultiPolygon, Ring, multi_polygon_tag, ring_tag>
232 : public detail::covered_by::use_relate
233{};
234
235template <typename Polygon, typename MultiPolygon>
236struct covered_by<Polygon, MultiPolygon, polygon_tag, multi_polygon_tag>
237 : public detail::covered_by::use_relate
238{};
239
240template <typename MultiPolygon, typename Polygon>
241struct covered_by<MultiPolygon, Polygon, multi_polygon_tag, polygon_tag>
242 : public detail::covered_by::use_relate
243{};
244
245template <typename MultiPolygon1, typename MultiPolygon2>
246struct covered_by<MultiPolygon1, MultiPolygon2, multi_polygon_tag, multi_polygon_tag>
247 : public detail::covered_by::use_relate
248{};
249
250} // namespace dispatch
251#endif // DOXYGEN_NO_DISPATCH
252
253
254namespace resolve_strategy {
255
256struct covered_by
257{
258 template <typename Geometry1, typename Geometry2, typename Strategy>
259 static inline bool apply(Geometry1 const& geometry1,
260 Geometry2 const& geometry2,
261 Strategy const& strategy)
262 {
263 concepts::within::check
264 <
265 typename tag<Geometry1>::type,
266 typename tag<Geometry2>::type,
267 typename tag_cast<typename tag<Geometry2>::type, areal_tag>::type,
268 Strategy
269 >();
270 concepts::check<Geometry1 const>();
271 concepts::check<Geometry2 const>();
272 assert_dimension_equal<Geometry1, Geometry2>();
273
274 return dispatch::covered_by<Geometry1, Geometry2>::apply(geometry1,
275 geometry2,
276 strategy);
277 }
278
279 template <typename Geometry1, typename Geometry2>
280 static inline bool apply(Geometry1 const& geometry1,
281 Geometry2 const& geometry2,
282 default_strategy)
283 {
284 typedef typename point_type<Geometry1>::type point_type1;
285 typedef typename point_type<Geometry2>::type point_type2;
286
287 typedef typename strategy::covered_by::services::default_strategy
288 <
289 typename tag<Geometry1>::type,
290 typename tag<Geometry2>::type,
291 typename tag<Geometry1>::type,
292 typename tag_cast<typename tag<Geometry2>::type, areal_tag>::type,
293 typename tag_cast
294 <
295 typename cs_tag<point_type1>::type, spherical_tag
296 >::type,
297 typename tag_cast
298 <
299 typename cs_tag<point_type2>::type, spherical_tag
300 >::type,
301 Geometry1,
302 Geometry2
303 >::type strategy_type;
304
305 return covered_by::apply(geometry1, geometry2, strategy_type());
306 }
307};
308
309} // namespace resolve_strategy
310
311
312namespace resolve_variant {
313
314template <typename Geometry1, typename Geometry2>
315struct covered_by
316{
317 template <typename Strategy>
318 static inline bool apply(Geometry1 const& geometry1,
319 Geometry2 const& geometry2,
320 Strategy const& strategy)
321 {
322 return resolve_strategy::covered_by
323 ::apply(geometry1, geometry2, strategy);
324 }
325};
326
327template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
328struct covered_by<boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
329{
330 template <typename Strategy>
331 struct visitor: boost::static_visitor<bool>
332 {
333 Geometry2 const& m_geometry2;
334 Strategy const& m_strategy;
335
336 visitor(Geometry2 const& geometry2, Strategy const& strategy)
337 : m_geometry2(geometry2), m_strategy(strategy) {}
338
339 template <typename Geometry1>
340 bool operator()(Geometry1 const& geometry1) const
341 {
342 return covered_by<Geometry1, Geometry2>
343 ::apply(geometry1, m_geometry2, m_strategy);
344 }
345 };
346
347 template <typename Strategy>
348 static inline bool
349 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
350 Geometry2 const& geometry2,
351 Strategy const& strategy)
352 {
353 return boost::apply_visitor(visitor<Strategy>(geometry2, strategy), geometry1);
354 }
355};
356
357template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
358struct covered_by<Geometry1, boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
359{
360 template <typename Strategy>
361 struct visitor: boost::static_visitor<bool>
362 {
363 Geometry1 const& m_geometry1;
364 Strategy const& m_strategy;
365
366 visitor(Geometry1 const& geometry1, Strategy const& strategy)
367 : m_geometry1(geometry1), m_strategy(strategy) {}
368
369 template <typename Geometry2>
370 bool operator()(Geometry2 const& geometry2) const
371 {
372 return covered_by<Geometry1, Geometry2>
373 ::apply(m_geometry1, geometry2, m_strategy);
374 }
375 };
376
377 template <typename Strategy>
378 static inline bool
379 apply(Geometry1 const& geometry1,
380 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2,
381 Strategy const& strategy)
382 {
383 return boost::apply_visitor(visitor<Strategy>(geometry1, strategy), geometry2);
384 }
385};
386
387template <
388 BOOST_VARIANT_ENUM_PARAMS(typename T1),
389 BOOST_VARIANT_ENUM_PARAMS(typename T2)
390>
391struct covered_by<
392 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
393 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
394>
395{
396 template <typename Strategy>
397 struct visitor: boost::static_visitor<bool>
398 {
399 Strategy const& m_strategy;
400
401 visitor(Strategy const& strategy): m_strategy(strategy) {}
402
403 template <typename Geometry1, typename Geometry2>
404 bool operator()(Geometry1 const& geometry1,
405 Geometry2 const& geometry2) const
406 {
407 return covered_by<Geometry1, Geometry2>
408 ::apply(geometry1, geometry2, m_strategy);
409 }
410 };
411
412 template <typename Strategy>
413 static inline bool
414 apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
415 boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
416 Strategy const& strategy)
417 {
418 return boost::apply_visitor(visitor<Strategy>(strategy), geometry1, geometry2);
419 }
420};
421
422} // namespace resolve_variant
423
424
425/*!
426\brief \brief_check12{is inside or on border}
427\ingroup covered_by
428\details \details_check12{covered_by, is inside or on border}.
429\tparam Geometry1 \tparam_geometry
430\tparam Geometry2 \tparam_geometry
431\param geometry1 \param_geometry which might be inside or on the border of the second geometry
432\param geometry2 \param_geometry which might cover the first geometry
433\return true if geometry1 is inside of or on the border of geometry2,
434 else false
435\note The default strategy is used for covered_by detection
436
437\qbk{[include reference/algorithms/covered_by.qbk]}
438
439 */
440template<typename Geometry1, typename Geometry2>
441inline bool covered_by(Geometry1 const& geometry1, Geometry2 const& geometry2)
442{
443 return resolve_variant::covered_by<Geometry1, Geometry2>
444 ::apply(geometry1, geometry2, default_strategy());
445}
446
447/*!
448\brief \brief_check12{is inside or on border} \brief_strategy
449\ingroup covered_by
450\details \details_check12{covered_by, is inside or on border}, \brief_strategy. \details_strategy_reasons
451\tparam Geometry1 \tparam_geometry
452\tparam Geometry2 \tparam_geometry
453\param geometry1 \param_geometry which might be inside or on the border of the second geometry
454\param geometry2 \param_geometry which might cover the first geometry
455\param strategy strategy to be used
456\return true if geometry1 is inside of or on the border of geometry2,
457 else false
458
459\qbk{distinguish,with strategy}
460\qbk{[include reference/algorithms/covered_by.qbk]}
461
462*/
463template<typename Geometry1, typename Geometry2, typename Strategy>
464inline bool covered_by(Geometry1 const& geometry1, Geometry2 const& geometry2,
465 Strategy const& strategy)
466{
467 return resolve_variant::covered_by<Geometry1, Geometry2>
468 ::apply(geometry1, geometry2, strategy);
469}
470
471}} // namespace boost::geometry
472
473#endif // BOOST_GEOMETRY_ALGORITHMS_COVERED_BY_HPP