// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2014 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2014 Bruno Lalande, Paris, France. // Copyright (c) 2009-2014 Mateusz Loskot, London, UK. // Copyright (c) 2013-2014 Adam Wulkiewicz, Lodz, Poland. // This file was modified by Oracle on 2014. // Modifications copyright (c) 2014, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Parts of Boost.Geometry are redesigned from Geodan's Geographic Library // (geolib/GGL), copyright (c) 1995-2010 Geodan, Amsterdam, the Netherlands. // Use, modification and distribution is subject to the Boost Software License, // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #ifndef BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP #include #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace distance { template struct point_to_segment { static inline typename strategy::distance::services::return_type < Strategy, Point, typename point_type::type >::type apply(Point const& point, Segment const& segment, Strategy const& ) { typename detail::distance::default_ps_strategy < Point, typename point_type::type, Strategy >::type segment_strategy; typename point_type::type p[2]; geometry::detail::assign_point_from_index<0>(segment, p[0]); geometry::detail::assign_point_from_index<1>(segment, p[1]); return segment_strategy.apply(point, p[0], p[1]); } }; }} // namespace detail::distance #endif // DOXYGEN_NO_DETAIL #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { // Point-segment version 1, with point-point strategy template struct distance < Point, Segment, Strategy, point_tag, segment_tag, strategy_tag_distance_point_point, false > : detail::distance::point_to_segment {}; // Point-line version 1, where point-point strategy is specified template struct distance < Point, Linestring, Strategy, point_tag, linestring_tag, strategy_tag_distance_point_point, false > { static inline typename strategy::distance::services::return_type < Strategy, Point, typename point_type::type >::type apply(Point const& point, Linestring const& linestring, Strategy const&) { typedef typename detail::distance::default_ps_strategy < Point, typename point_type::type, Strategy >::type ps_strategy_type; return detail::distance::point_to_range < Point, Linestring, closed, ps_strategy_type >::apply(point, linestring, ps_strategy_type()); } }; // Point-ring , where point-point strategy is specified template struct distance < Point, Ring, Strategy, point_tag, ring_tag, strategy_tag_distance_point_point, false > { typedef typename strategy::distance::services::return_type < Strategy, Point, typename point_type::type >::type return_type; static inline return_type apply(Point const& point, Ring const& ring, Strategy const&) { typedef typename detail::distance::default_ps_strategy < Point, typename point_type::type, Strategy >::type ps_strategy_type; return detail::distance::point_to_ring < Point, Ring, geometry::closure::value, ps_strategy_type >::apply(point, ring, ps_strategy_type()); } }; // Point-polygon , where point-point strategy is specified template struct distance < Point, Polygon, Strategy, point_tag, polygon_tag, strategy_tag_distance_point_point, false > { typedef typename strategy::distance::services::return_type < Strategy, Point, typename point_type::type >::type return_type; static inline return_type apply(Point const& point, Polygon const& polygon, Strategy const&) { typedef typename detail::distance::default_ps_strategy < Point, typename point_type::type, Strategy >::type ps_strategy_type; return detail::distance::point_to_polygon < Point, Polygon, geometry::closure::value, ps_strategy_type >::apply(point, polygon, ps_strategy_type()); } }; template < typename Point, typename MultiGeometry, typename MultiGeometryTag, typename Strategy > struct distance < Point, MultiGeometry, Strategy, point_tag, MultiGeometryTag, strategy_tag_distance_point_point, false > { typedef typename strategy::distance::services::return_type < Strategy, Point, typename point_type::type >::type return_type; static inline return_type apply(Point const& point, MultiGeometry const& multigeometry, Strategy const&) { typedef typename detail::distance::default_ps_strategy < Point, typename point_type::type, Strategy >::type ps_strategy_type; return distance < Point, MultiGeometry, ps_strategy_type, point_tag, MultiGeometryTag, strategy_tag_distance_point_segment, false >::apply(point, multigeometry, ps_strategy_type()); } }; template < typename Geometry, typename MultiPoint, typename GeometryTag, typename Strategy > struct distance < Geometry, MultiPoint, Strategy, GeometryTag, multi_point_tag, strategy_tag_distance_point_point, false > { typedef typename strategy::distance::services::return_type < Strategy, typename point_type::type, typename point_type::type >::type return_type; static inline return_type apply(Geometry const& geometry, MultiPoint const& multipoint, Strategy const&) { typedef typename detail::distance::default_ps_strategy < typename point_type::type, typename point_type::type, Strategy >::type ps_strategy_type; return distance < Geometry, MultiPoint, ps_strategy_type, GeometryTag, multi_point_tag, strategy_tag_distance_point_segment, false >::apply(geometry, multipoint, ps_strategy_type()); } }; template < typename MultiPoint, typename MultiGeometry, typename MultiGeometryTag, typename Strategy > struct distance < MultiPoint, MultiGeometry, Strategy, multi_point_tag, MultiGeometryTag, strategy_tag_distance_point_point, false > { typedef typename strategy::distance::services::return_type < Strategy, typename point_type::type, typename point_type::type >::type return_type; static inline return_type apply(MultiPoint const& multipoint, MultiGeometry const& multigeometry, Strategy const&) { typedef typename detail::distance::default_ps_strategy < typename point_type::type, typename point_type::type, Strategy >::type ps_strategy_type; return distance < MultiPoint, MultiGeometry, ps_strategy_type, multi_point_tag, MultiGeometryTag, strategy_tag_distance_point_segment, false >::apply(multipoint, multigeometry, ps_strategy_type()); } }; } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISTANCE_BACKWARD_COMPATIBILITY_HPP