| // Boost.Geometry (aka GGL, Generic Geometry Library) |
| |
| // Copyright (c) 2014, Oracle and/or its affiliates. |
| |
| // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle |
| |
| // Licensed under the Boost Software License version 1.0. |
| // http://www.boost.org/users/license.html |
| |
| #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_LINEAR_HPP |
| #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_LINEAR_HPP |
| |
| #include <boost/geometry/core/point_type.hpp> |
| |
| #include <boost/geometry/strategies/distance.hpp> |
| |
| #include <boost/geometry/iterators/point_iterator.hpp> |
| #include <boost/geometry/iterators/segment_iterator.hpp> |
| |
| #include <boost/geometry/algorithms/num_points.hpp> |
| #include <boost/geometry/algorithms/num_segments.hpp> |
| |
| #include <boost/geometry/algorithms/dispatch/distance.hpp> |
| |
| #include <boost/geometry/algorithms/detail/distance/range_to_geometry_rtree.hpp> |
| |
| |
| namespace boost { namespace geometry |
| { |
| |
| #ifndef DOXYGEN_NO_DETAIL |
| namespace detail { namespace distance |
| { |
| |
| |
| template <typename Linear1, typename Linear2, typename Strategy> |
| struct linear_to_linear |
| { |
| typedef typename strategy::distance::services::return_type |
| < |
| Strategy, |
| typename point_type<Linear1>::type, |
| typename point_type<Linear2>::type |
| >::type return_type; |
| |
| static inline return_type apply(Linear1 const& linear1, |
| Linear2 const& linear2, |
| Strategy const& strategy, |
| bool = false) |
| { |
| if (geometry::num_points(linear1) == 1) |
| { |
| return dispatch::distance |
| < |
| typename point_type<Linear1>::type, |
| Linear2, |
| Strategy |
| >::apply(*points_begin(linear1), linear2, strategy); |
| } |
| |
| if (geometry::num_points(linear2) == 1) |
| { |
| return dispatch::distance |
| < |
| typename point_type<Linear2>::type, |
| Linear1, |
| Strategy |
| >::apply(*points_begin(linear2), linear1, strategy); |
| } |
| |
| if (geometry::num_segments(linear2) < geometry::num_segments(linear1)) |
| { |
| return point_or_segment_range_to_geometry_rtree |
| < |
| geometry::segment_iterator<Linear2 const>, |
| Linear1, |
| Strategy |
| >::apply(geometry::segments_begin(linear2), |
| geometry::segments_end(linear2), |
| linear1, |
| strategy); |
| |
| } |
| |
| return point_or_segment_range_to_geometry_rtree |
| < |
| geometry::segment_iterator<Linear1 const>, |
| Linear2, |
| Strategy |
| >::apply(geometry::segments_begin(linear1), |
| geometry::segments_end(linear1), |
| linear2, |
| strategy); |
| } |
| }; |
| |
| |
| }} // namespace detail::distance |
| #endif // DOXYGEN_NO_DETAIL |
| |
| |
| #ifndef DOXYGEN_NO_DISPATCH |
| namespace dispatch |
| { |
| |
| template <typename Linear1, typename Linear2, typename Strategy> |
| struct distance |
| < |
| Linear1, Linear2, Strategy, |
| linear_tag, linear_tag, |
| strategy_tag_distance_point_segment, false |
| > : detail::distance::linear_to_linear |
| < |
| Linear1, Linear2, Strategy |
| > |
| {}; |
| |
| } // namespace dispatch |
| #endif // DOXYGEN_NO_DISPATCH |
| |
| }} // namespace boost::geometry |
| |
| #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_LINEAR_HPP |