diff --git a/index/test/rtree/CMakeLists.txt b/index/test/rtree/CMakeLists.txt index 5c09204f9..7c2ee72b8 100644 --- a/index/test/rtree/CMakeLists.txt +++ b/index/test/rtree/CMakeLists.txt @@ -1,4 +1,5 @@ # Boost.Geometry +# Copyright (c) 2025 Adam Wulkiewicz, Lodz, Poland. # Copyright (c) 2024, Oracle and/or its affiliates. # Contributed and/or modified by Vissarion Fysikopoulos, on behalf of Oracle # Use, modification and distribution is subject to the Boost Software License, @@ -13,6 +14,7 @@ foreach(item IN ITEMS rtree_move_pack rtree_non_cartesian rtree_values + rtree_with_strategies #compile-fail rtree_values_invalid ) boost_geometry_add_unit_test("index" ${item}) diff --git a/index/test/rtree/Jamfile b/index/test/rtree/Jamfile index c930e8a3f..0ea4a30d1 100644 --- a/index/test/rtree/Jamfile +++ b/index/test/rtree/Jamfile @@ -1,6 +1,6 @@ # Boost.Geometry Index # -# Copyright (c) 2011-2016 Adam Wulkiewicz, Lodz, Poland. +# Copyright (c) 2011-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 @@ -19,5 +19,6 @@ test-suite boost-geometry-index-rtree [ run rtree_move_pack.cpp ] [ run rtree_non_cartesian.cpp ] [ run rtree_values.cpp ] + [ compile rtree_with_strategies.cpp ] [ compile-fail rtree_values_invalid.cpp ] ; diff --git a/index/test/rtree/rtree_with_strategies.cpp b/index/test/rtree/rtree_with_strategies.cpp new file mode 100644 index 000000000..66b192a32 --- /dev/null +++ b/index/test/rtree/rtree_with_strategies.cpp @@ -0,0 +1,156 @@ +// 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) + +#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_box::value + || bg::util::is_box::value + && bg::util::is_point::value; + +template +constexpr bool is_pb_or_bb_v = bg::util::is_box::value + && bg::util::is_box::value + || bg::util::is_point::value + && bg::util::is_box::value; + +template +constexpr bool is_pp_or_bb_v = bg::util::is_box::value + && bg::util::is_box::value + || bg::util::is_point::value + && bg::util::is_point::value; + +template +< + typename QueryValue, typename Rtree, + std::enable_if_t, int> = 0 +> +void test_queries_bp_bb(Rtree const& rtree) +{ + 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_overlaps_pp_bb(Rtree const& rtree) +{ + 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_overlaps_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_overlaps_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_params() +{ + test_strategies>(); + test_strategies>(); + test_strategies>(); + test_strategies>(); + test_strategies>(); + test_strategies>(); +} + +template +void test_value() +{ + test_params>(); + test_params>(); + test_params>(); +} + +int test_main(int, char* []) +{ + test_value(); + test_value(); + test_value(); + + return 0; +}