]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/boost/geometry/strategies/concepts/distance_concept.hpp
import new upstream nautilus stable release 14.2.8
[ceph.git] / ceph / src / boost / boost / geometry / strategies / concepts / distance_concept.hpp
CommitLineData
7c673cae
FG
1// Boost.Geometry (aka GGL, Generic Geometry Library)
2
3// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
4// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
5// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
6
92f5a8d4
TL
7// This file was modified by Oracle on 2014, 2018.
8// Modifications copyright (c) 2014, 2018, Oracle and/or its affiliates.
7c673cae
FG
9
10// Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
92f5a8d4 11// Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
7c673cae
FG
12
13// Parts of Boost.Geometry are redesigned from Geodan's Geographic Library
14// (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands.
15
16// Use, modification and distribution is subject to the Boost Software License,
17// Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
18// http://www.boost.org/LICENSE_1_0.txt)
19
20#ifndef BOOST_GEOMETRY_STRATEGIES_CONCEPTS_DISTANCE_CONCEPT_HPP
21#define BOOST_GEOMETRY_STRATEGIES_CONCEPTS_DISTANCE_CONCEPT_HPP
22
23#include <vector>
24#include <iterator>
25
26#include <boost/concept_check.hpp>
27#include <boost/core/ignore_unused.hpp>
28#include <boost/mpl/assert.hpp>
29#include <boost/type_traits/is_same.hpp>
30
31#include <boost/geometry/util/parameter_type_of.hpp>
32
33#include <boost/geometry/geometries/concepts/point_concept.hpp>
34#include <boost/geometry/geometries/segment.hpp>
35#include <boost/geometry/geometries/point.hpp>
36
92f5a8d4 37#include <boost/geometry/strategies/distance.hpp>
7c673cae
FG
38#include <boost/geometry/strategies/tags.hpp>
39
40
41namespace boost { namespace geometry { namespace concepts
42{
43
44
45/*!
46 \brief Checks strategy for point-point or point-box or box-box distance
47 \ingroup distance
48*/
49template <typename Strategy, typename Point1, typename Point2>
50struct PointDistanceStrategy
51{
52#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
53private :
54
55 struct checker
56 {
57 template <typename ApplyMethod>
58 static void apply(ApplyMethod)
59 {
60 // 1: inspect and define both arguments of apply
61 typedef typename parameter_type_of
62 <
63 ApplyMethod, 0
64 >::type ptype1;
65
66 typedef typename parameter_type_of
67 <
68 ApplyMethod, 1
69 >::type ptype2;
70
71 // 2) must define meta-function "return_type"
72 typedef typename strategy::distance::services::return_type
73 <
74 Strategy, ptype1, ptype2
75 >::type rtype;
76
77 // 3) must define meta-function "comparable_type"
78 typedef typename strategy::distance::services::comparable_type
79 <
80 Strategy
81 >::type ctype;
82
83 // 4) must define meta-function "tag"
84 typedef typename strategy::distance::services::tag
85 <
86 Strategy
87 >::type tag;
88
89 static const bool is_correct_strategy_tag =
90 boost::is_same<tag, strategy_tag_distance_point_point>::value
91 || boost::is_same<tag, strategy_tag_distance_point_box>::value
92 || boost::is_same<tag, strategy_tag_distance_box_box>::value;
93
94 BOOST_MPL_ASSERT_MSG
95 ((is_correct_strategy_tag),
96 INCORRECT_STRATEGY_TAG,
97 (types<tag>));
98
99 // 5) must implement apply with arguments
100 Strategy* str = 0;
101 ptype1 *p1 = 0;
102 ptype2 *p2 = 0;
103 rtype r = str->apply(*p1, *p2);
104
105 // 6) must define (meta)struct "get_comparable" with apply
106 ctype c = strategy::distance::services::get_comparable
107 <
108 Strategy
109 >::apply(*str);
110
111 // 7) must define (meta)struct "result_from_distance" with apply
112 r = strategy::distance::services::result_from_distance
113 <
114 Strategy,
115 ptype1, ptype2
116 >::apply(*str, 1.0);
117
118 boost::ignore_unused<tag>();
119 boost::ignore_unused(str, c, r);
120 }
121 };
122
123
124
125public :
126 BOOST_CONCEPT_USAGE(PointDistanceStrategy)
127 {
128 checker::apply(&Strategy::template apply<Point1, Point2>);
129 }
130#endif
131};
132
133
134/*!
135 \brief Checks strategy for point-segment distance
136 \ingroup strategy_concepts
137*/
138template <typename Strategy, typename Point, typename PointOfSegment>
139struct PointSegmentDistanceStrategy
140{
141#ifndef DOXYGEN_NO_CONCEPT_MEMBERS
142private :
143
144 struct checker
145 {
146 template <typename ApplyMethod>
147 static void apply(ApplyMethod)
148 {
149 // 1) inspect and define both arguments of apply
150 typedef typename parameter_type_of
151 <
152 ApplyMethod, 0
153 >::type ptype;
154
155 typedef typename parameter_type_of
156 <
157 ApplyMethod, 1
158 >::type sptype;
159
160 namespace services = strategy::distance::services;
161 // 2) must define meta-function "tag"
162 typedef typename services::tag<Strategy>::type tag;
163
164 BOOST_MPL_ASSERT_MSG
165 ((boost::is_same
166 <
167 tag, strategy_tag_distance_point_segment
168 >::value),
169 INCORRECT_STRATEGY_TAG,
170 (types<tag>));
171
172 // 3) must define meta-function "return_type"
173 typedef typename services::return_type
174 <
175 Strategy, ptype, sptype
176 >::type rtype;
177
178 // 4) must define meta-function "comparable_type"
179 typedef typename services::comparable_type<Strategy>::type ctype;
180
181 // 5) must implement apply with arguments
182 Strategy *str = 0;
183 ptype *p = 0;
184 sptype *sp1 = 0;
185 sptype *sp2 = 0;
186
187 rtype r = str->apply(*p, *sp1, *sp2);
188
189 // 6) must define (meta-)struct "get_comparable" with apply
190 ctype cstrategy = services::get_comparable<Strategy>::apply(*str);
191
192 // 7) must define (meta-)struct "result_from_distance" with apply
193 r = services::result_from_distance
194 <
195 Strategy, ptype, sptype
196 >::apply(*str, rtype(1.0));
197
198 boost::ignore_unused(str, r, cstrategy);
199 }
200 };
201
202public :
203 BOOST_CONCEPT_USAGE(PointSegmentDistanceStrategy)
204 {
205 checker::apply(&Strategy::template apply<Point, PointOfSegment>);
206 }
207#endif
208};
209
210
211}}} // namespace boost::geometry::concepts
212
213
214#endif // BOOST_GEOMETRY_STRATEGIES_CONCEPTS_DISTANCE_CONCEPT_HPP