1 // Boost.Geometry (aka GGL, Generic Geometry Library) 2 3 // Copyright (c) 2014, Oracle and/or its affiliates. 4 5 // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle 6 7 // Licensed under the Boost Software License version 1.0. 8 // http://www.boost.org/users/license.html 9 10 #ifndef BOOST_GEOMETRY_ALGORITHMS_POLICIES_PREDICATE_BASED_INTERRUPT_POLICY_HPP 11 #define BOOST_GEOMETRY_ALGORITHMS_POLICIES_PREDICATE_BASED_INTERRUPT_POLICY_HPP 12 13 #include <boost/range.hpp> 14 15 #include <boost/geometry/algorithms/detail/check_iterator_range.hpp> 16 17 18 namespace boost { namespace geometry 19 { 20 21 22 #ifndef DOXYGEN_NO_DETAIL 23 namespace detail { namespace overlay 24 { 25 26 27 template 28 < 29 typename IsAcceptableTurnPredicate, 30 bool AllowEmptyTurnRange = true // by default, allow an empty turn range 31 > 32 struct stateless_predicate_based_interrupt_policy 33 { 34 static bool const enabled = true; 35 bool has_intersections; // set to true if there is at least one 36 // unacceptable turn 37 stateless_predicate_based_interrupt_policyboost::geometry::detail::overlay::stateless_predicate_based_interrupt_policy38 inline stateless_predicate_based_interrupt_policy() 39 : has_intersections(false) 40 {} 41 42 template <typename Range> applyboost::geometry::detail::overlay::stateless_predicate_based_interrupt_policy43 inline bool apply(Range const& range) 44 { 45 // if there is at least one unacceptable turn in the range, return false 46 has_intersections = !detail::check_iterator_range 47 < 48 IsAcceptableTurnPredicate, 49 AllowEmptyTurnRange 50 >::apply(boost::begin(range), boost::end(range)); 51 52 return has_intersections; 53 } 54 }; 55 56 57 58 59 template 60 < 61 typename IsAcceptableTurnPredicate, 62 bool AllowEmptyTurnRange = true // by default, allow an empty turn range 63 > 64 struct predicate_based_interrupt_policy 65 { 66 static bool const enabled = true; 67 bool has_intersections; // set to true if there is at least one 68 // unacceptable turn 69 IsAcceptableTurnPredicate const& m_predicate; 70 71 inline predicate_based_interrupt_policyboost::geometry::detail::overlay::predicate_based_interrupt_policy72 predicate_based_interrupt_policy(IsAcceptableTurnPredicate const& predicate) 73 : has_intersections(false) 74 , m_predicate(predicate) 75 {} 76 77 template <typename Range> applyboost::geometry::detail::overlay::predicate_based_interrupt_policy78 inline bool apply(Range const& range) 79 { 80 // if there is at least one unacceptable turn in the range, return false 81 has_intersections = !detail::check_iterator_range 82 < 83 IsAcceptableTurnPredicate, 84 AllowEmptyTurnRange 85 >::apply(boost::begin(range), boost::end(range), m_predicate); 86 87 return has_intersections; 88 } 89 }; 90 91 92 93 94 }} // namespace detail::overlay 95 #endif // DOXYGEN_NO_DETAIL 96 97 98 }} // namespace boost::geometry 99 100 101 #endif // BOOST_GEOMETRY_ALGORITHMS_POLICIES_PREDICATE_BASED_INTERRUPT_POLICY_HPP 102