// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2007-2012 Barend Gehrels, Amsterdam, the Netherlands. // Copyright (c) 2008-2012 Bruno Lalande, Paris, France. // Copyright (c) 2009-2012 Mateusz Loskot, London, UK. // 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_HPP #define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_HPP // Note: contrary to most files, the geometry::detail::disjoint namespace // is partly implemented in a separate file, to avoid circular references // disjoint -> get_turns -> disjoint #include #include #include #include #include #include namespace boost { namespace geometry { #ifndef DOXYGEN_NO_DETAIL namespace detail { namespace disjoint { struct disjoint_interrupt_policy { static bool const enabled = true; bool has_intersections; inline disjoint_interrupt_policy() : has_intersections(false) {} template inline bool apply(Range const& range) { // If there is any IP in the range, it is NOT disjoint if (boost::size(range) > 0) { has_intersections = true; return true; } return false; } }; template < typename Point1, typename Point2, std::size_t Dimension, std::size_t DimensionCount > struct point_point { static inline bool apply(Point1 const& p1, Point2 const& p2) { if (! geometry::math::equals(get(p1), get(p2))) { return true; } return point_point < Point1, Point2, Dimension + 1, DimensionCount >::apply(p1, p2); } }; template struct point_point { static inline bool apply(Point1 const& , Point2 const& ) { return false; } }; template < typename Point, typename Box, std::size_t Dimension, std::size_t DimensionCount > struct point_box { static inline bool apply(Point const& point, Box const& box) { if (get(point) < get(box) || get(point) > get(box)) { return true; } return point_box < Point, Box, Dimension + 1, DimensionCount >::apply(point, box); } }; template struct point_box { static inline bool apply(Point const& , Box const& ) { return false; } }; template < typename Box1, typename Box2, std::size_t Dimension, std::size_t DimensionCount > struct box_box { static inline bool apply(Box1 const& box1, Box2 const& box2) { if (get(box1) < get(box2)) { return true; } if (get(box1) > get(box2)) { return true; } return box_box < Box1, Box2, Dimension + 1, DimensionCount >::apply(box1, box2); } }; template struct box_box { static inline bool apply(Box1 const& , Box2 const& ) { return false; } }; /*! \brief Internal utility function to detect of boxes are disjoint \note Is used from other algorithms, declared separately to avoid circular references */ template inline bool disjoint_box_box(Box1 const& box1, Box2 const& box2) { return box_box < Box1, Box2, 0, dimension::type::value >::apply(box1, box2); } /*! \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_DETAIL namespace detail { namespace equals { /*! \brief Internal utility function to detect of points are disjoint \note To avoid circular references */ template inline bool equals_point_point(Point1 const& point1, Point2 const& point2) { return ! detail::disjoint::disjoint_point_point(point1, point2); } }} // namespace detail::equals #endif // DOXYGEN_NO_DETAIL }} // namespace boost::geometry #endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_HPP