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