Skip to content

Commit ee3ef77

Browse files
authored
Merge pull request #1114 from awulkiew/feature/cdist_dg
[comparable_distance] Add support for dynamic geometries
2 parents 488dd54 + e09baa4 commit ee3ef77

File tree

1 file changed

+81
-195
lines changed
  • include/boost/geometry/algorithms/detail/comparable_distance

1 file changed

+81
-195
lines changed

include/boost/geometry/algorithms/detail/comparable_distance/interface.hpp

Lines changed: 81 additions & 195 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
// Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands.
44
// Copyright (c) 2008-2014 Bruno Lalande, Paris, France.
55
// Copyright (c) 2009-2014 Mateusz Loskot, London, UK.
6+
// Copyright (c) 2023 Adam Wulkiewicz, Lodz, Poland.
67

78
// This file was modified by Oracle on 2014-2021.
89
// Modifications copyright (c) 2014-2021, Oracle and/or its affiliates.
@@ -50,11 +51,9 @@ template
5051
struct comparable_distance
5152
{
5253
template <typename Geometry1, typename Geometry2>
53-
static inline
54-
typename comparable_distance_result<Geometry1, Geometry2, Strategies>::type
55-
apply(Geometry1 const& geometry1,
56-
Geometry2 const& geometry2,
57-
Strategies const& strategies)
54+
static inline auto apply(Geometry1 const& geometry1,
55+
Geometry2 const& geometry2,
56+
Strategies const& strategies)
5857
{
5958
return dispatch::distance
6059
<
@@ -70,20 +69,16 @@ template <typename Strategy>
7069
struct comparable_distance<Strategy, false>
7170
{
7271
template <typename Geometry1, typename Geometry2>
73-
static inline
74-
typename comparable_distance_result<Geometry1, Geometry2, Strategy>::type
75-
apply(Geometry1 const& geometry1,
76-
Geometry2 const& geometry2,
77-
Strategy const& strategy)
72+
static inline auto apply(Geometry1 const& geometry1,
73+
Geometry2 const& geometry2,
74+
Strategy const& strategy)
7875
{
7976
using strategies::distance::services::strategy_converter;
8077

81-
typedef decltype(strategy_converter<Strategy>::get(strategy))
82-
strategies_type;
83-
typedef strategies::distance::detail::comparable
78+
using comparable_strategies_type = strategies::distance::detail::comparable
8479
<
85-
strategies_type
86-
> comparable_strategies_type;
80+
decltype(strategy_converter<Strategy>::get(strategy))
81+
>;
8782

8883
return dispatch::distance
8984
<
@@ -100,21 +95,17 @@ template <>
10095
struct comparable_distance<default_strategy, false>
10196
{
10297
template <typename Geometry1, typename Geometry2>
103-
static inline typename comparable_distance_result
104-
<
105-
Geometry1, Geometry2, default_strategy
106-
>::type
107-
apply(Geometry1 const& geometry1,
108-
Geometry2 const& geometry2,
109-
default_strategy)
98+
static inline auto apply(Geometry1 const& geometry1,
99+
Geometry2 const& geometry2,
100+
default_strategy)
110101
{
111-
typedef strategies::distance::detail::comparable
102+
using comparable_strategy_type = strategies::distance::detail::comparable
112103
<
113104
typename strategies::distance::services::default_strategy
114105
<
115106
Geometry1, Geometry2
116107
>::type
117-
> comparable_strategy_type;
108+
>;
118109

119110
return dispatch::distance
120111
<
@@ -126,19 +117,22 @@ struct comparable_distance<default_strategy, false>
126117
} // namespace resolve_strategy
127118

128119

129-
namespace resolve_variant
120+
namespace resolve_dynamic
130121
{
131122

132123

133-
template <typename Geometry1, typename Geometry2>
124+
template
125+
<
126+
typename Geometry1, typename Geometry2,
127+
typename Tag1 = typename geometry::tag<Geometry1>::type,
128+
typename Tag2 = typename geometry::tag<Geometry2>::type
129+
>
134130
struct comparable_distance
135131
{
136132
template <typename Strategy>
137-
static inline
138-
typename comparable_distance_result<Geometry1, Geometry2, Strategy>::type
139-
apply(Geometry1 const& geometry1,
140-
Geometry2 const& geometry2,
141-
Strategy const& strategy)
133+
static inline auto apply(Geometry1 const& geometry1,
134+
Geometry2 const& geometry2,
135+
Strategy const& strategy)
142136
{
143137
return resolve_strategy::comparable_distance
144138
<
@@ -148,190 +142,85 @@ struct comparable_distance
148142
};
149143

150144

151-
template <BOOST_VARIANT_ENUM_PARAMS(typename T), typename Geometry2>
152-
struct comparable_distance
153-
<
154-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
155-
Geometry2
156-
>
145+
template <typename DynamicGeometry1, typename Geometry2, typename Tag2>
146+
struct comparable_distance<DynamicGeometry1, Geometry2, dynamic_geometry_tag, Tag2>
157147
{
158148
template <typename Strategy>
159-
struct visitor: static_visitor
160-
<
161-
typename comparable_distance_result
162-
<
163-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
164-
Geometry2,
165-
Strategy
166-
>::type
167-
>
149+
static inline auto apply(DynamicGeometry1 const& geometry1,
150+
Geometry2 const& geometry2,
151+
Strategy const& strategy)
168152
{
169-
Geometry2 const& m_geometry2;
170-
Strategy const& m_strategy;
171-
172-
visitor(Geometry2 const& geometry2,
173-
Strategy const& strategy)
174-
: m_geometry2(geometry2),
175-
m_strategy(strategy)
176-
{}
177-
178-
template <typename Geometry1>
179-
typename comparable_distance_result
153+
using result_t = typename geometry::comparable_distance_result
180154
<
181-
Geometry1, Geometry2, Strategy
182-
>::type
183-
operator()(Geometry1 const& geometry1) const
155+
DynamicGeometry1, Geometry2, Strategy
156+
>::type;
157+
result_t result = 0;
158+
traits::visit<DynamicGeometry1>::apply([&](auto const& g1)
184159
{
185-
return comparable_distance
186-
<
187-
Geometry1,
188-
Geometry2
189-
>::template apply
190-
<
191-
Strategy
192-
>(geometry1, m_geometry2, m_strategy);
193-
}
194-
};
195-
196-
template <typename Strategy>
197-
static inline typename comparable_distance_result
198-
<
199-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
200-
Geometry2,
201-
Strategy
202-
>::type
203-
apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry1,
204-
Geometry2 const& geometry2,
205-
Strategy const& strategy)
206-
{
207-
return boost::apply_visitor(visitor<Strategy>(geometry2, strategy), geometry1);
160+
result = resolve_strategy::comparable_distance
161+
<
162+
Strategy
163+
>::apply(g1, geometry2, strategy);
164+
}, geometry1);
165+
return result;
208166
}
209167
};
210168

211169

212-
template <typename Geometry1, BOOST_VARIANT_ENUM_PARAMS(typename T)>
213-
struct comparable_distance
214-
<
215-
Geometry1,
216-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>
217-
>
170+
template <typename Geometry1, typename DynamicGeometry2, typename Tag1>
171+
struct comparable_distance<Geometry1, DynamicGeometry2, Tag1, dynamic_geometry_tag>
218172
{
219173
template <typename Strategy>
220-
struct visitor: static_visitor
221-
<
222-
typename comparable_distance_result
223-
<
224-
Geometry1,
225-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
226-
Strategy
227-
>::type
228-
>
174+
static inline auto apply(Geometry1 const& geometry1,
175+
DynamicGeometry2 const& geometry2,
176+
Strategy const& strategy)
229177
{
230-
Geometry1 const& m_geometry1;
231-
Strategy const& m_strategy;
232-
233-
visitor(Geometry1 const& geometry1,
234-
Strategy const& strategy)
235-
: m_geometry1(geometry1),
236-
m_strategy(strategy)
237-
{}
238-
239-
template <typename Geometry2>
240-
typename comparable_distance_result
178+
using result_t = typename geometry::comparable_distance_result
241179
<
242-
Geometry1, Geometry2, Strategy
243-
>::type
244-
operator()(Geometry2 const& geometry2) const
180+
Geometry1, DynamicGeometry2, Strategy
181+
>::type;
182+
result_t result = 0;
183+
traits::visit<DynamicGeometry2>::apply([&](auto const& g2)
245184
{
246-
return comparable_distance
247-
<
248-
Geometry1,
249-
Geometry2
250-
>::template apply
251-
<
252-
Strategy
253-
>(m_geometry1, geometry2, m_strategy);
254-
}
255-
};
256-
257-
template <typename Strategy>
258-
static inline typename comparable_distance_result
259-
<
260-
Geometry1,
261-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)>,
262-
Strategy
263-
>::type
264-
apply(Geometry1 const& geometry1,
265-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T)> const& geometry2,
266-
Strategy const& strategy)
267-
{
268-
return boost::apply_visitor(visitor<Strategy>(geometry1, strategy), geometry2);
185+
result = resolve_strategy::comparable_distance
186+
<
187+
Strategy
188+
>::apply(geometry1, g2, strategy);
189+
}, geometry2);
190+
return result;
269191
}
270192
};
271193

272194

273-
template
274-
<
275-
BOOST_VARIANT_ENUM_PARAMS(typename T1),
276-
BOOST_VARIANT_ENUM_PARAMS(typename T2)
277-
>
195+
template <typename DynamicGeometry1, typename DynamicGeometry2>
278196
struct comparable_distance
279197
<
280-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
281-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>
198+
DynamicGeometry1, DynamicGeometry2,
199+
dynamic_geometry_tag, dynamic_geometry_tag
282200
>
283201
{
284202
template <typename Strategy>
285-
struct visitor: static_visitor
286-
<
287-
typename comparable_distance_result
288-
<
289-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
290-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
291-
Strategy
292-
>::type
293-
>
203+
static inline auto apply(DynamicGeometry1 const& geometry1,
204+
DynamicGeometry2 const& geometry2,
205+
Strategy const& strategy)
294206
{
295-
Strategy const& m_strategy;
296-
297-
visitor(Strategy const& strategy)
298-
: m_strategy(strategy)
299-
{}
300-
301-
template <typename Geometry1, typename Geometry2>
302-
typename comparable_distance_result
207+
using result_t = typename geometry::comparable_distance_result
303208
<
304-
Geometry1, Geometry2, Strategy
305-
>::type
306-
operator()(Geometry1 const& geometry1, Geometry2 const& geometry2) const
209+
DynamicGeometry1, DynamicGeometry2, Strategy
210+
>::type;
211+
result_t result = 0;
212+
traits::visit<DynamicGeometry1, DynamicGeometry2>::apply([&](auto const& g1, auto const& g2)
307213
{
308-
return comparable_distance
309-
<
310-
Geometry1,
311-
Geometry2
312-
>::template apply
313-
<
314-
Strategy
315-
>(geometry1, geometry2, m_strategy);
316-
}
317-
};
318-
319-
template <typename Strategy>
320-
static inline typename comparable_distance_result
321-
<
322-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)>,
323-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)>,
324-
Strategy
325-
>::type
326-
apply(boost::variant<BOOST_VARIANT_ENUM_PARAMS(T1)> const& geometry1,
327-
boost::variant<BOOST_VARIANT_ENUM_PARAMS(T2)> const& geometry2,
328-
Strategy const& strategy)
329-
{
330-
return boost::apply_visitor(visitor<Strategy>(strategy), geometry1, geometry2);
214+
result = resolve_strategy::comparable_distance
215+
<
216+
Strategy
217+
>::apply(g1, g2, strategy);
218+
}, geometry1, geometry2);
219+
return result;
331220
}
332221
};
333222

334-
} // namespace resolve_variant
223+
} // namespace resolve_dynamic
335224

336225

337226

@@ -354,14 +243,14 @@ struct comparable_distance
354243
\qbk{distinguish,with strategy}
355244
*/
356245
template <typename Geometry1, typename Geometry2, typename Strategy>
357-
inline typename comparable_distance_result<Geometry1, Geometry2, Strategy>::type
358-
comparable_distance(Geometry1 const& geometry1, Geometry2 const& geometry2,
359-
Strategy const& strategy)
246+
inline auto comparable_distance(Geometry1 const& geometry1,
247+
Geometry2 const& geometry2,
248+
Strategy const& strategy)
360249
{
361250
concepts::check<Geometry1 const>();
362251
concepts::check<Geometry2 const>();
363252

364-
return resolve_variant::comparable_distance
253+
return resolve_dynamic::comparable_distance
365254
<
366255
Geometry1,
367256
Geometry2
@@ -387,12 +276,9 @@ comparable_distance(Geometry1 const& geometry1, Geometry2 const& geometry2,
387276
\qbk{[include reference/algorithms/comparable_distance.qbk]}
388277
*/
389278
template <typename Geometry1, typename Geometry2>
390-
inline typename default_comparable_distance_result<Geometry1, Geometry2>::type
391-
comparable_distance(Geometry1 const& geometry1, Geometry2 const& geometry2)
279+
inline auto comparable_distance(Geometry1 const& geometry1,
280+
Geometry2 const& geometry2)
392281
{
393-
concepts::check<Geometry1 const>();
394-
concepts::check<Geometry2 const>();
395-
396282
return geometry::comparable_distance(geometry1, geometry2, default_strategy());
397283
}
398284

0 commit comments

Comments
 (0)