]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/geometry/algorithms/detail/intersection/interface.hpp
update sources to v12.2.3
[ceph.git] / ceph / src / boost / boost / geometry / algorithms / detail / intersection / interface.hpp
CommitLineData
b32b8144
FG
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands.
4
5// This file was modified by Oracle on 2014, 2017.
6// Modifications copyright (c) 2014-2017, Oracle and/or its affiliates.
7
8// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
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_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP
15#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP
16
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/algorithms/detail/overlay/intersection_insert.hpp>
23#include <boost/geometry/policies/robustness/get_rescale_policy.hpp>
24#include <boost/geometry/strategies/default_strategy.hpp>
25#include <boost/geometry/util/range.hpp>
26
27
28namespace boost { namespace geometry
29{
30
31
32#ifndef DOXYGEN_NO_DISPATCH
33namespace dispatch
34{
35
36// By default, all is forwarded to the intersection_insert-dispatcher
37template
38<
39 typename Geometry1, typename Geometry2,
40 typename Tag1 = typename geometry::tag<Geometry1>::type,
41 typename Tag2 = typename geometry::tag<Geometry2>::type,
42 bool Reverse = reverse_dispatch<Geometry1, Geometry2>::type::value
43>
44struct intersection
45{
46 template <typename RobustPolicy, typename GeometryOut, typename Strategy>
47 static inline bool apply(Geometry1 const& geometry1,
48 Geometry2 const& geometry2,
49 RobustPolicy const& robust_policy,
50 GeometryOut& geometry_out,
51 Strategy const& strategy)
52 {
53 typedef typename boost::range_value<GeometryOut>::type OneOut;
54
55 intersection_insert
56 <
57 Geometry1, Geometry2, OneOut,
58 overlay_intersection
59 >::apply(geometry1, geometry2, robust_policy,
60 range::back_inserter(geometry_out), strategy);
61
62 return true;
63 }
64
65};
66
67
68// If reversal is needed, perform it
69template
70<
71 typename Geometry1, typename Geometry2,
72 typename Tag1, typename Tag2
73>
74struct intersection
75<
76 Geometry1, Geometry2,
77 Tag1, Tag2,
78 true
79>
80 : intersection<Geometry2, Geometry1, Tag2, Tag1, false>
81{
82 template <typename RobustPolicy, typename GeometryOut, typename Strategy>
83 static inline bool apply(
84 Geometry1 const& g1,
85 Geometry2 const& g2,
86 RobustPolicy const& robust_policy,
87 GeometryOut& out,
88 Strategy const& strategy)
89 {
90 return intersection
91 <
92 Geometry2, Geometry1,
93 Tag2, Tag1,
94 false
95 >::apply(g2, g1, robust_policy, out, strategy);
96 }
97};
98
99
100} // namespace dispatch
101#endif // DOXYGEN_NO_DISPATCH
102
103
104namespace resolve_strategy {
105
106struct intersection
107{
108 template
109 <
110 typename Geometry1,
111 typename Geometry2,
112 typename RobustPolicy,
113 typename GeometryOut,
114 typename Strategy
115 >
116 static inline bool apply(Geometry1 const& geometry1,
117 Geometry2 const& geometry2,
118 RobustPolicy const& robust_policy,
119 GeometryOut & geometry_out,
120 Strategy const& strategy)
121 {
122 return dispatch::intersection
123 <
124 Geometry1,
125 Geometry2
126 >::apply(geometry1, geometry2, robust_policy, geometry_out,
127 strategy);
128 }
129
130 template
131 <
132 typename Geometry1,
133 typename Geometry2,
134 typename RobustPolicy,
135 typename GeometryOut
136 >
137 static inline bool apply(Geometry1 const& geometry1,
138 Geometry2 const& geometry2,
139 RobustPolicy const& robust_policy,
140 GeometryOut & geometry_out,
141 default_strategy)
142 {
143 typedef typename strategy::relate::services::default_strategy
144 <
145 Geometry1, Geometry2
146 >::type strategy_type;
147
148 return dispatch::intersection
149 <
150 Geometry1,
151 Geometry2
152 >::apply(geometry1, geometry2, robust_policy, geometry_out,
153 strategy_type());
154 }
155};
156
157} // resolve_strategy
158
159
160namespace resolve_variant
161{
162
163template <typename Geometry1, typename Geometry2>
164struct intersection
165{
166 template <typename GeometryOut, typename Strategy>
167 static inline bool apply(Geometry1 const& geometry1,
168 Geometry2 const& geometry2,
169 GeometryOut& geometry_out,
170 Strategy const& strategy)
171 {
172 concepts::check<Geometry1 const>();
173 concepts::check<Geometry2 const>();
174
175 typedef typename geometry::rescale_overlay_policy_type
176 <
177 Geometry1,
178 Geometry2
179 >::type rescale_policy_type;
180
181 rescale_policy_type robust_policy
182 = geometry::get_rescale_policy<rescale_policy_type>(geometry1,
183 geometry2);
184
185 return resolve_strategy::intersection::apply(geometry1,
186 geometry2,
187 robust_policy,
188 geometry_out,
189 strategy);
190 }
191};
192
193
194template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
195struct intersection<variant<BOOST_VARIANT_ENUM_PARAMS(T)>, Geometry2>
196{
197 template <typename GeometryOut, typename Strategy>
198 struct visitor: static_visitor<bool>
199 {
200 Geometry2 const& m_geometry2;
201 GeometryOut& m_geometry_out;
202 Strategy const& m_strategy;
203
204 visitor(Geometry2 const& geometry2,
205 GeometryOut& geometry_out,
206 Strategy const& strategy)
207 : m_geometry2(geometry2)
208 , m_geometry_out(geometry_out)
209 , m_strategy(strategy)
210 {}
211
212 template <typename Geometry1>
213 bool operator()(Geometry1 const& geometry1) const
214 {
215 return intersection
216 <
217 Geometry1,
218 Geometry2
219 >::apply(geometry1, m_geometry2, m_geometry_out, m_strategy);
220 }
221 };
222
223 template <typename GeometryOut, typename Strategy>
224 static inline bool
225 apply(variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
226 Geometry2 const& geometry2,
227 GeometryOut& geometry_out,
228 Strategy const& strategy)
229 {
230 return boost::apply_visitor(visitor<GeometryOut, Strategy>(geometry2,
231 geometry_out,
232 strategy),
233 geometry1);
234 }
235};
236
237
238template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
239struct intersection<Geometry1, variant<BOOST_VARIANT_ENUM_PARAMS(T)> >
240{
241 template <typename GeometryOut, typename Strategy>
242 struct visitor: static_visitor<bool>
243 {
244 Geometry1 const& m_geometry1;
245 GeometryOut& m_geometry_out;
246 Strategy const& m_strategy;
247
248 visitor(Geometry1 const& geometry1,
249 GeometryOut& geometry_out,
250 Strategy const& strategy)
251 : m_geometry1(geometry1)
252 , m_geometry_out(geometry_out)
253 , m_strategy(strategy)
254 {}
255
256 template <typename Geometry2>
257 bool operator()(Geometry2 const& geometry2) const
258 {
259 return intersection
260 <
261 Geometry1,
262 Geometry2
263 >::apply(m_geometry1, geometry2, m_geometry_out, m_strategy);
264 }
265 };
266
267 template <typename GeometryOut, typename Strategy>
268 static inline bool
269 apply(Geometry1 const& geometry1,
270 variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2,
271 GeometryOut& geometry_out,
272 Strategy const& strategy)
273 {
274 return boost::apply_visitor(visitor<GeometryOut, Strategy>(geometry1,
275 geometry_out,
276 strategy),
277 geometry2);
278 }
279};
280
281
282template <BOOST_VARIANT_ENUM_PARAMS(typename T1), BOOST_VARIANT_ENUM_PARAMS(typename T2)>
283struct intersection<variant<BOOST_VARIANT_ENUM_PARAMS(T1)>, variant<BOOST_VARIANT_ENUM_PARAMS(T2)> >
284{
285 template <typename GeometryOut, typename Strategy>
286 struct visitor: static_visitor<bool>
287 {
288 GeometryOut& m_geometry_out;
289 Strategy const& m_strategy;
290
291 visitor(GeometryOut& geometry_out, Strategy const& strategy)
292 : m_geometry_out(geometry_out)
293 , m_strategy(strategy)
294 {}
295
296 template <typename Geometry1, typename Geometry2>
297 bool operator()(Geometry1 const& geometry1,
298 Geometry2 const& geometry2) const
299 {
300 return intersection
301 <
302 Geometry1,
303 Geometry2
304 >::apply(geometry1, geometry2, m_geometry_out, m_strategy);
305 }
306 };
307
308 template <typename GeometryOut, typename Strategy>
309 static inline bool
310 apply(variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
311 variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
312 GeometryOut& geometry_out,
313 Strategy const& strategy)
314 {
315 return boost::apply_visitor(visitor<GeometryOut, Strategy>(geometry_out,
316 strategy),
317 geometry1, geometry2);
318 }
319};
320
321} // namespace resolve_variant
322
323
324/*!
325\brief \brief_calc2{intersection}
326\ingroup intersection
327\details \details_calc2{intersection, spatial set theoretic intersection}.
328\tparam Geometry1 \tparam_geometry
329\tparam Geometry2 \tparam_geometry
330\tparam GeometryOut Collection of geometries (e.g. std::vector, std::deque, boost::geometry::multi*) of which
331 the value_type fulfills a \p_l_or_c concept, or it is the output geometry (e.g. for a box)
332\tparam Strategy \tparam_strategy{Intersection}
333\param geometry1 \param_geometry
334\param geometry2 \param_geometry
335\param geometry_out The output geometry, either a multi_point, multi_polygon,
336 multi_linestring, or a box (for intersection of two boxes)
337\param strategy \param_strategy{intersection}
338
339\qbk{distinguish,with strategy}
340\qbk{[include reference/algorithms/intersection.qbk]}
341*/
342template
343<
344 typename Geometry1,
345 typename Geometry2,
346 typename GeometryOut,
347 typename Strategy
348>
349inline bool intersection(Geometry1 const& geometry1,
350 Geometry2 const& geometry2,
351 GeometryOut& geometry_out,
352 Strategy const& strategy)
353{
354 return resolve_variant::intersection
355 <
356 Geometry1,
357 Geometry2
358 >::apply(geometry1, geometry2, geometry_out, strategy);
359}
360
361
362/*!
363\brief \brief_calc2{intersection}
364\ingroup intersection
365\details \details_calc2{intersection, spatial set theoretic intersection}.
366\tparam Geometry1 \tparam_geometry
367\tparam Geometry2 \tparam_geometry
368\tparam GeometryOut Collection of geometries (e.g. std::vector, std::deque, boost::geometry::multi*) of which
369 the value_type fulfills a \p_l_or_c concept, or it is the output geometry (e.g. for a box)
370\param geometry1 \param_geometry
371\param geometry2 \param_geometry
372\param geometry_out The output geometry, either a multi_point, multi_polygon,
373 multi_linestring, or a box (for intersection of two boxes)
374
375\qbk{[include reference/algorithms/intersection.qbk]}
376*/
377template
378<
379 typename Geometry1,
380 typename Geometry2,
381 typename GeometryOut
382>
383inline bool intersection(Geometry1 const& geometry1,
384 Geometry2 const& geometry2,
385 GeometryOut& geometry_out)
386{
387 return resolve_variant::intersection
388 <
389 Geometry1,
390 Geometry2
391 >::apply(geometry1, geometry2, geometry_out, default_strategy());
392}
393
394
395}} // namespace boost::geometry
396
397
398#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_INTERSECTION_INTERFACE_HPP