// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2018, Oracle and/or its affiliates. // Contributed and/or modified by Vissarion Fysikopoulos, 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_BOX_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_BOX_HPP #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace distance { template struct linear_to_box { typedef typename strategy::distance::services::return_type < Strategy, typename point_type::type, typename point_type::type >::type return_type; template static inline return_type apply(Box const& box, Iterator begin, Iterator end, Strategy const& strategy) { bool first = true; return_type d_min(0); for (Iterator it = begin; it != end; ++it, first = false) { typedef typename std::iterator_traits::value_type Segment; return_type d = dispatch::distance ::apply(*it, box, strategy); if ( first || d < d_min ) { d_min = d; } } return d_min; } static inline return_type apply(Linear const& linear, Box const& box, Strategy const& strategy) { if ( geometry::intersects(linear, box) ) { return 0; } return apply(box, geometry::segments_begin(linear), geometry::segments_end(linear), strategy); } static inline return_type apply(Box const& box, Linear const& linear, Strategy const& strategy) { return apply(linear, box, strategy); } }; }} // namespace detail::distance #endif // DOXYGEN_NO_DETAIL #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { template struct distance < Linear, Box, Strategy, linear_tag, box_tag, strategy_tag_distance_segment_box, false > : detail::distance::linear_to_box < Linear, Box, Strategy > {}; template struct distance < Areal, Box, Strategy, areal_tag, box_tag, strategy_tag_distance_segment_box, false > : detail::distance::linear_to_box < Areal, Box, Strategy > {}; } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_LINEAR_TO_BOX_HPP