// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2015 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2015 Bruno Lalande, Paris, France. // Copyright (c) 2009-2015 Mateusz Loskot, London, UK. // Copyright (c) 2013-2015 Adam Wulkiewicz, Lodz, Poland // This file was modified by Oracle on 2013, 2014, 2015, 2017. // Modifications copyright (c) 2013-2017, Oracle and/or its affiliates. // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // 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_DISJOINT_POINT_POINT_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_POINT_HPP #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace disjoint { template struct point_point_generic { template static inline bool apply(Point1 const& p1, Point2 const& p2, Strategy const& ) { return apply(p1, p2); } template static inline bool apply(Point1 const& p1, Point2 const& p2) { if (! geometry::math::equals(get(p1), get(p2))) { return true; } return point_point_generic::apply(p1, p2); } }; template struct point_point_generic { template static inline bool apply(Point1 const&, Point2 const& ) { return false; } }; class point_point_on_spheroid { private: template struct are_same_points { static inline bool apply(Point1 const& point1, Point2 const& point2) { typedef typename helper_geometry::type helper_point_type1; typedef typename helper_geometry::type helper_point_type2; helper_point_type1 point1_normalized = return_normalized(point1); helper_point_type2 point2_normalized = return_normalized(point2); return point_point_generic < 0, dimension::value >::apply(point1_normalized, point2_normalized); } }; template struct are_same_points // points have different units { static inline bool apply(Point1 const& point1, Point2 const& point2) { typedef typename geometry::select_most_precise < typename fp_coordinate_type::type, typename fp_coordinate_type::type >::type calculation_type; typename helper_geometry < Point1, calculation_type, radian >::type helper_point1, helper_point2; Point1 point1_normalized = return_normalized(point1); Point2 point2_normalized = return_normalized(point2); geometry::transform(point1_normalized, helper_point1); geometry::transform(point2_normalized, helper_point2); return point_point_generic < 0, dimension::value >::apply(helper_point1, helper_point2); } }; public: template static inline bool apply(Point1 const& point1, Point2 const& point2, Strategy const& ) { return apply(point1, point2); } template static inline bool apply(Point1 const& point1, Point2 const& point2) { return are_same_points < Point1, Point2, boost::is_same < typename coordinate_system::type::units, typename coordinate_system::type::units >::value >::apply(point1, point2); } }; template < typename Point1, typename Point2, std::size_t Dimension, std::size_t DimensionCount, typename CSTag1 = typename cs_tag::type, typename CSTag2 = CSTag1 > struct point_point : point_point {}; template < typename Point1, typename Point2, std::size_t Dimension, std::size_t DimensionCount > struct point_point < Point1, Point2, Dimension, DimensionCount, spherical_equatorial_tag > : point_point_on_spheroid {}; template < typename Point1, typename Point2, std::size_t Dimension, std::size_t DimensionCount > struct point_point < Point1, Point2, Dimension, DimensionCount, geographic_tag > : point_point_on_spheroid {}; template < typename Point1, typename Point2, std::size_t Dimension, std::size_t DimensionCount > struct point_point : point_point_generic {}; /*! \brief Internal utility function to detect of points are disjoint \note To avoid circular references */ template inline bool disjoint_point_point(Point1 const& point1, Point2 const& point2) { return point_point < Point1, Point2, 0, dimension::type::value >::apply(point1, point2); } }} // namespace detail::disjoint #endif // DOXYGEN_NO_DETAIL #ifndef DOXYGEN_NO_DISPATCH namespace dispatch { template struct disjoint : detail::disjoint::point_point {}; } // namespace dispatch #endif // DOXYGEN_NO_DISPATCH }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_POINT_POINT_HPP