// Boost.Geometry (aka GGL, Generic Geometry Library) // Copyright (c) 2015, 2019, Oracle and/or its affiliates. // Contributed and/or modified by Menelaos Karavelas, on behalf of Oracle // Contributed and/or modified by Adam Wulkiewicz, on behalf of Oracle // Licensed under the Boost Software License version 1.0. // http://www.boost.org/users/license.html #ifndef BOOST_GEOMETRY_TEST_CHECK_TURN_LESS_HPP #define BOOST_GEOMETRY_TEST_CHECK_TURN_LESS_HPP #include #include "test_set_ops_linear_linear.hpp" // check less functor for turns template inline void verify_less_for_turns(Turns turns, Less const& less) { typedef typename boost::range_iterator::type iterator_type; if (boost::size(turns) < 2) { return; } iterator_type last = --boost::end(turns); for (iterator_type it1 = boost::begin(turns); it1 != last; ++it1) { iterator_type it2 = it1; ++it2; for (; it2 != boost::end(turns); ++it2) { if (less(*it1, *it2)) { BOOST_CHECK(! less(*it2, *it1)); } if (less(*it2, *it1)) { BOOST_CHECK(! less(*it1, *it2)); } } } } struct check_turn_less { template struct assign_policy { static bool const include_no_turn = false; static bool const include_degenerate = EnableDegenerateTurns; static bool const include_opposite = false; template < typename Info, typename Point1, typename Point2, typename IntersectionInfo > static inline void apply(Info& , Point1 const& , Point2 const& , IntersectionInfo const& ) { } }; template static inline void apply(Geometry1 const& geometry1, Geometry2 const& geometry2) { typedef typename bg::strategy::intersection::services::default_strategy < typename bg::cs_tag::type >::type strategy_type; typedef bg::detail::no_rescale_policy robust_policy_type; typedef bg::detail::relate::turns::get_turns < Geometry1, Geometry2, bg::detail::get_turns::get_turn_info_type < Geometry1, Geometry2, assign_policy<> > > get_turns_type; typedef typename get_turns_type::template turn_info_type < strategy_type, robust_policy_type >::type turn_info; typedef std::vector turns_container; turns_container turns; bg::detail::get_turns::no_interrupt_policy interrupt_policy; get_turns_type::apply(turns, geometry1, geometry2, interrupt_policy, strategy_type(), robust_policy_type()); typedef bg::detail::turns::less_seg_fraction_other_op<> turn_less_type; verify_less_for_turns(turns, turn_less_type()); } }; #endif // BOOST_GEOMETRY_TEST_CHECK_TURN_LESS_HPP