// Boost.Geometry Index // Unit Test // Copyright (c) 2025 Adam Wulkiewicz, Lodz, Poland. // 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_INDEX_TEST_RTREE_STRATEGIES_HPP #define BOOST_GEOMETRY_INDEX_TEST_RTREE_STRATEGIES_HPP #include #define BOOST_GEOMETRY_INDEX_DETAIL_EXPERIMENTAL_PREDICATES #include #include #include #include struct point { double x, y; }; struct box { point mi, ma; }; struct segment { point first, second; }; BOOST_GEOMETRY_REGISTER_POINT_2D(point, double, cs::undefined, x, y) BOOST_GEOMETRY_REGISTER_BOX(box, point, mi, ma) BOOST_GEOMETRY_REGISTER_SEGMENT(segment, point, first, second) template constexpr bool is_bp_or_bb_v = (bg::util::is_box::value && bg::util::is_point::value) || (bg::util::is_box::value && bg::util::is_box::value); template constexpr bool is_pb_or_bb_v = (bg::util::is_point::value && bg::util::is_box::value) || (bg::util::is_box::value && bg::util::is_box::value); template constexpr bool is_pp_or_bb_v = (bg::util::is_point::value && bg::util::is_point::value) || (bg::util::is_box::value && bg::util::is_box::value); template < typename QueryValue, typename Rtree, std::enable_if_t, int> = 0 > void test_queries_bp_bb(Rtree const& rtree) { // These predicates use algorithms that are not implemented for // some geometry combinations std::vector values; rtree.query(bgi::covered_by(QueryValue{}), std::back_inserter(values)); rtree.query(bgi::disjoint(QueryValue{}), std::back_inserter(values)); rtree.query(bgi::within(QueryValue{}), std::back_inserter(values)); } template < typename QueryValue, typename Rtree, std::enable_if_t<(!is_bp_or_bb_v), int> = 0 > void test_queries_bp_bb(Rtree const& ) {} template < typename QueryValue, typename Rtree, std::enable_if_t, int> = 0 > void test_queries_pb_bb(Rtree const& rtree) { // These predicates use algorithms that are not implemented for // some geometry combinations std::vector values; rtree.query(bgi::contains(QueryValue{}), std::back_inserter(values)); rtree.query(bgi::covers(QueryValue{}), std::back_inserter(values)); } template < typename QueryValue, typename Rtree, std::enable_if_t<(!is_pb_or_bb_v), int> = 0 > void test_queries_pb_bb(Rtree const& ) {} template < typename QueryValue, typename Rtree, std::enable_if_t, int> = 0 > void test_queries_pp_bb(Rtree const& rtree) { // These predicates use algorithms that are not implemented for // some geometry combinations std::vector values; rtree.query(bgi::overlaps(QueryValue{}), std::back_inserter(values)); rtree.query(bgi::touches(QueryValue{}), std::back_inserter(values)); } template < typename QueryValue, typename Rtree, std::enable_if_t<(!is_pp_or_bb_v), int> = 0 > void test_queries_pp_bb(Rtree const& ) {} template void test_queries(Rtree const& rtree) { std::vector values; rtree.query(bgi::intersects(QueryValue{}), std::back_inserter(values)); rtree.query(bgi::nearest(QueryValue{}, 1), std::back_inserter(values)); test_queries_bp_bb(rtree); test_queries_pb_bb(rtree); test_queries_pp_bb(rtree); } template void test_strategies() { std::vector values; bgi::rtree> rtree{values}; rtree.insert(Value{}); rtree.remove(Value{}); test_queries(rtree); test_queries(rtree); test_queries(rtree); } template void test_rtree() { test_strategies>(); test_strategies>(); test_strategies>(); test_strategies>(); test_strategies>(); test_strategies>(); } #endif // BOOST_GEOMETRY_INDEX_TEST_RTREE_STRATEGIES_HPP