1 // Boost.Geometry
2 
3 // Copyright (c) 2014-2021, Oracle and/or its affiliates.
4 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle
5 // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle
6 
7 // Licensed under the Boost Software License version 1.0.
8 // http://www.boost.org/users/license.html
9 
10 #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_RANGE_TO_GEOMETRY_RTREE_HPP
11 #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_RANGE_TO_GEOMETRY_RTREE_HPP
12 
13 #include <iterator>
14 #include <utility>
15 
16 #include <boost/geometry/algorithms/detail/closest_feature/range_to_range.hpp>
17 #include <boost/geometry/algorithms/detail/distance/is_comparable.hpp>
18 #include <boost/geometry/algorithms/detail/distance/iterator_selector.hpp>
19 #include <boost/geometry/algorithms/detail/distance/strategy_utils.hpp>
20 #include <boost/geometry/algorithms/dispatch/distance.hpp>
21 
22 #include <boost/geometry/core/assert.hpp>
23 #include <boost/geometry/core/point_type.hpp>
24 
25 #include <boost/geometry/iterators/detail/has_one_element.hpp>
26 
27 #include <boost/geometry/strategies/distance.hpp>
28 
29 
30 namespace boost { namespace geometry
31 {
32 
33 
34 #ifndef DOXYGEN_NO_DETAIL
35 namespace detail { namespace distance
36 {
37 
38 
39 template
40 <
41     typename PointOrSegmentIterator,
42     typename Geometry,
43     typename Strategies
44 >
45 class point_or_segment_range_to_geometry_rtree
46 {
47 private:
48     typedef typename std::iterator_traits
49         <
50             PointOrSegmentIterator
51         >::value_type point_or_segment_type;
52 
53     typedef iterator_selector<Geometry const> selector_type;
54 
55     typedef detail::closest_feature::range_to_range_rtree range_to_range;
56 
57     typedef distance::strategy_t<point_or_segment_type, Geometry, Strategies> strategy_type;
58 
59 public:
60     typedef distance::return_t<point_or_segment_type, Geometry, Strategies> return_type;
61 
apply(PointOrSegmentIterator first,PointOrSegmentIterator last,Geometry const & geometry,Strategies const & strategies)62     static inline return_type apply(PointOrSegmentIterator first,
63                                     PointOrSegmentIterator last,
64                                     Geometry const& geometry,
65                                     Strategies const& strategies)
66     {
67         BOOST_GEOMETRY_ASSERT( first != last );
68 
69         if ( detail::has_one_element(first, last) )
70         {
71             return dispatch::distance
72                 <
73                     point_or_segment_type, Geometry, Strategies
74                 >::apply(*first, geometry, strategies);
75         }
76 
77         distance::creturn_t<point_or_segment_type, Geometry, Strategies> cd_min;
78 
79         std::pair
80             <
81                 point_or_segment_type,
82                 typename selector_type::iterator_type
83             > closest_features
84             = range_to_range::apply(first,
85                                     last,
86                                     selector_type::begin(geometry),
87                                     selector_type::end(geometry),
88                                     strategies,
89                                     cd_min);
90 
91         return
92             is_comparable<strategy_type>::value
93             ?
94             cd_min
95             :
96             dispatch::distance
97                 <
98                     point_or_segment_type,
99                     typename std::iterator_traits
100                         <
101                             typename selector_type::iterator_type
102                         >::value_type,
103                     Strategies
104                 >::apply(closest_features.first,
105                          *closest_features.second,
106                          strategies);
107     }
108 };
109 
110 
111 }} // namespace detail::distance
112 #endif // DOXYGEN_NO_DETAIL
113 
114 
115 }} // namespace boost::geometry
116 
117 #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_RANGE_TO_GEOMETRY_RTREE_HPP
118