From dffb4db8ced1e680fe00d0e00a781d1823740cba Mon Sep 17 00:00:00 2001 From: Bruno Lalande Date: Sat, 21 Dec 2013 00:49:16 +0000 Subject: [PATCH] Break circular dependency get_turns->disjoint->covered_by->within->get_turns --- .../geometry/algorithms/detail/disjoint.hpp | 55 +----------- .../algorithms/detail/disjoint/box_box.hpp | 87 +++++++++++++++++++ .../algorithms/detail/overlay/get_turns.hpp | 3 +- 3 files changed, 91 insertions(+), 54 deletions(-) create mode 100644 include/boost/geometry/algorithms/detail/disjoint/box_box.hpp diff --git a/include/boost/geometry/algorithms/detail/disjoint.hpp b/include/boost/geometry/algorithms/detail/disjoint.hpp index d1b30e0ab..10917cded 100644 --- a/include/boost/geometry/algorithms/detail/disjoint.hpp +++ b/include/boost/geometry/algorithms/detail/disjoint.hpp @@ -16,7 +16,7 @@ #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 +// is partly implemented in separate files, to avoid circular references // disjoint -> get_turns -> disjoint #include @@ -31,6 +31,7 @@ #include +#include #include @@ -100,41 +101,6 @@ struct point_box }; -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; - } -}; - // Segment - Box intersection // Based on Ray-AABB intersection // http://www.siggraph.org/education/materials/HyperGraph/raytrace/rtinter3.htm @@ -271,23 +237,6 @@ struct reverse_covered_by }; - -/*! - \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); -} - - }} // namespace detail::disjoint #endif // DOXYGEN_NO_DETAIL diff --git a/include/boost/geometry/algorithms/detail/disjoint/box_box.hpp b/include/boost/geometry/algorithms/detail/disjoint/box_box.hpp new file mode 100644 index 000000000..24f9aa24e --- /dev/null +++ b/include/boost/geometry/algorithms/detail/disjoint/box_box.hpp @@ -0,0 +1,87 @@ +// 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. +// Copyright (c) 2013 Adam Wulkiewicz, Lodz, Poland + +// 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_BOX_BOX_HPP +#define BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_BOX_BOX_HPP + +#include + + +namespace boost { namespace geometry +{ + +#ifndef DOXYGEN_NO_DETAIL +namespace detail { namespace disjoint +{ + + +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); +} + + +}} // namespace detail::disjoint +#endif // DOXYGEN_NO_DETAIL + +}} // namespace boost::geometry + + +#endif // BOOST_GEOMETRY_ALGORITHMS_DETAIL_DISJOINT_BOX_BOX_HPP diff --git a/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp b/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp index 96a9fc135..dcf4170c0 100644 --- a/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp +++ b/include/boost/geometry/algorithms/detail/overlay/get_turns.hpp @@ -43,7 +43,8 @@ #include #include -#include +#include +#include #include #include