From 4bc1bc3eb798c119ba2896a03d20105060977dd6 Mon Sep 17 00:00:00 2001 From: Adam Wulkiewicz Date: Fri, 30 Sep 2011 13:12:44 +0000 Subject: [PATCH] copy constructor implemented + tests updated, rtree::get_translator() changed to rtree::translator() + other files updated to respect this [SVN r74618] --- .../index/rtree/node/node_default.hpp | 14 +- .../geometry/extensions/index/rtree/rtree.hpp | 51 ++++++-- .../index/rtree/visitors/are_boxes_ok.hpp | 2 +- .../index/rtree/visitors/are_levels_ok.hpp | 2 +- .../index/rtree/visitors/children_box.hpp | 16 +-- .../extensions/index/rtree/visitors/copy.hpp | 76 +++++++++++ .../index/rtree/visitors/gl_draw.hpp | 2 +- .../index/rtree/visitors/nearest.hpp | 4 +- .../extensions/index/rtree/visitors/print.hpp | 2 +- tests/additional_sizes_and_times.cpp | 28 ++++ tests/main.cpp | 3 +- tests/rtree_filters.hpp | 44 ++++--- tests/rtree_function.hpp | 122 ++++++++++-------- 13 files changed, 251 insertions(+), 115 deletions(-) create mode 100644 include/boost/geometry/extensions/index/rtree/visitors/copy.hpp diff --git a/include/boost/geometry/extensions/index/rtree/node/node_default.hpp b/include/boost/geometry/extensions/index/rtree/node/node_default.hpp index b189a07b9..c32e1f983 100644 --- a/include/boost/geometry/extensions/index/rtree/node/node_default.hpp +++ b/include/boost/geometry/extensions/index/rtree/node/node_default.hpp @@ -153,7 +153,7 @@ struct element_indexable_type< template inline typename Translator::indexable_type const& - element_indexable(Value const& el, Translator const& tr) +element_indexable(Value const& el, Translator const& tr) { return tr(el); } @@ -207,14 +207,14 @@ struct elements_type template inline typename elements_type::type & - elements(Node & n) +elements(Node & n) { return n.elements; } template inline typename elements_type::type const& - elements(Node const& n) +elements(Node const& n) { return n.elements; } @@ -224,13 +224,9 @@ inline typename elements_type::type const& template inline Box elements_box(FwdIter first, FwdIter last, Translator const& tr) { - Box result; + BOOST_GEOMETRY_INDEX_ASSERT(first != last, "Can't calculate element's box"); - if (first == last) - { - geometry::assign_zero(result); - return result; - } + Box result; geometry::convert(element_indexable(*first, tr), result); ++first; diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 94c6e768b..ce41f936c 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -27,11 +27,12 @@ #include -#include -#include -#include #include #include +#include +#include +#include +#include #include #include @@ -47,6 +48,7 @@ namespace boost { namespace geometry { namespace index { // iterators, begin/end/etc. // TODO: copy, assignment +// allow copying of a tree with different template parameters? e.g. Parameters, Translator? // TODO: should funcions like empty() clear() box() be free functions? // change name of empty() - empty predicate generator? @@ -84,9 +86,14 @@ public: create(); } - ~rtree() + inline rtree(rtree const& src) { - destroy(); + copy(src, *this); + } + + inline ~rtree() + { + destroy(*this); } template @@ -162,12 +169,19 @@ public: inline void clear() { - destroy(); + destroy(*this); create(); } inline box_type box() const { + if ( empty() ) + { + box_type result; + geometry::assign_inverse(result); + return result; + } + detail::rtree::visitors::children_box children_box_v(m_translator); @@ -182,7 +196,7 @@ public: detail::rtree::apply_visitor(visitor, *m_root); } - inline translator_type const& get_translator() const + inline translator_type const& translator() const { return m_translator; } @@ -205,19 +219,30 @@ private: m_leafs_level = 0; } - inline void destroy() + inline void destroy(rtree & t) { detail::rtree::visitors::destroy del_v; - detail::rtree::apply_visitor(del_v, *m_root); + detail::rtree::apply_visitor(del_v, *t.m_root); // TODO: awulkiew - consider moving this into the destroy visitor // but have in mind that visitors works on references // and address from reference would be passed here - detail::rtree::delete_node(m_root); + detail::rtree::delete_node(t.m_root); - m_root = 0; - m_values_count = 0; - m_leafs_level = 0; + t.m_root = 0; + t.m_values_count = 0; + t.m_leafs_level = 0; + } + + inline void copy(rtree const& src, rtree & dst) const + { + detail::rtree::visitors::copy copy_v; + detail::rtree::apply_visitor(copy_v, *src.m_root); + + dst.m_root = copy_v.result; + dst.m_values_count = src.m_values_count; + dst.m_leafs_level = src.m_leafs_level; + dst.m_translator = src.m_translator; } template diff --git a/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp b/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp index 7a1acd23a..94408eaf7 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/are_boxes_ok.hpp @@ -117,7 +117,7 @@ bool are_boxes_ok(rtree const& tree) typename rt::value_type, typename rt::options_type, typename rt::translator_type, - typename rt::box_type> v(tree.get_translator()); + typename rt::box_type> v(tree.translator()); tree.apply_visitor(v); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp b/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp index c1d88b2a0..b9394dd24 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/are_levels_ok.hpp @@ -95,7 +95,7 @@ bool are_levels_ok(rtree const& tree) typename rt::value_type, typename rt::options_type, typename rt::translator_type, - typename rt::box_type> v(tree.get_translator()); + typename rt::box_type> v(tree.translator()); tree.apply_visitor(v); diff --git a/include/boost/geometry/extensions/index/rtree/visitors/children_box.hpp b/include/boost/geometry/extensions/index/rtree/visitors/children_box.hpp index 761634233..34f493323 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/children_box.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/children_box.hpp @@ -27,20 +27,14 @@ class children_box public: inline children_box(Translator const& tr) : m_tr(tr) - { - geometry::assign_inverse(result); - } + {} inline void operator()(internal_node const& n) { typedef typename rtree::elements_type::type elements_type; elements_type const& elements = rtree::elements(n); - for( typename elements_type::const_iterator it = elements.begin(); - it != elements.end() ; ++it) - { - geometry::expand(result, it->first); - } + result = rtree::elements_box(elements.begin(), elements.end(), m_tr); } inline void operator()(leaf const& n) @@ -48,11 +42,7 @@ public: typedef typename rtree::elements_type::type elements_type; elements_type const& elements = rtree::elements(n); - for(typename elements_type::const_iterator it = elements.begin(); - it != elements.end() ; ++it) - { - geometry::expand(result, m_tr(*it)); - } + result = rtree::elements_box(elements.begin(), elements.end(), m_tr); } Box result; diff --git a/include/boost/geometry/extensions/index/rtree/visitors/copy.hpp b/include/boost/geometry/extensions/index/rtree/visitors/copy.hpp new file mode 100644 index 000000000..26bdd8737 --- /dev/null +++ b/include/boost/geometry/extensions/index/rtree/visitors/copy.hpp @@ -0,0 +1,76 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Boost.Index - R-tree copying visitor +// +// Copyright 2011 Adam Wulkiewicz. +// 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_EXTENSIONS_INDEX_RTREE_VISITORS_COPY_HPP +#define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_COPY_HPP + +#include + +namespace boost { namespace geometry { namespace index { + +namespace detail { namespace rtree { namespace visitors { + +template +struct copy + : public rtree::visitor::type +{ + typedef typename rtree::node::type node; + typedef typename rtree::internal_node::type internal_node; + typedef typename rtree::leaf::type leaf; + + explicit inline copy() + : result(0) + {} + + inline void operator()(internal_node & n) + { + node * new_node = rtree::create_node(internal_node()); + + typedef typename rtree::elements_type::type elements_type; + elements_type & elements = rtree::elements(n); + + elements_type & elements_dst = rtree::elements(rtree::get(*new_node)); + + for (typename elements_type::iterator it = elements.begin(); + it != elements.end(); ++it) + { + rtree::apply_visitor(*this, *it->second); + + elements_dst.push_back( std::make_pair(it->first, result) ); + } + + result = new_node; + } + + inline void operator()(leaf & l) + { + node * new_node = rtree::create_node(leaf()); + + typedef typename rtree::elements_type::type elements_type; + elements_type & elements = rtree::elements(l); + + elements_type & elements_dst = rtree::elements(rtree::get(*new_node)); + + for (typename elements_type::iterator it = elements.begin(); + it != elements.end(); ++it) + { + elements_dst.push_back(*it); + } + + result = new_node; + } + + node * result; +}; + +}}} // namespace detail::rtree::visitors + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_VISITORS_COPY_HPP diff --git a/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp b/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp index ea9e55c2b..1d4e9feb7 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/gl_draw.hpp @@ -201,7 +201,7 @@ void gl_draw(rtree const& tree, typedef typename rtree::box_type box_type; detail::rtree::visitors::gl_draw - gl_draw_v(tree.get_translator(), level_first, level_last, z_coord_level_multiplier); + gl_draw_v(tree.translator(), level_first, level_last, z_coord_level_multiplier); tree.apply_visitor(gl_draw_v); } diff --git a/include/boost/geometry/extensions/index/rtree/visitors/nearest.hpp b/include/boost/geometry/extensions/index/rtree/visitors/nearest.hpp index a13f6b0d0..2796bd480 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/nearest.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/nearest.hpp @@ -191,7 +191,7 @@ public: // calculate node's distance(s) for distance predicate node_distances_type node_dist_data = node_distances_calc::apply(m_dist_pred, it->first); - // TODO: awulkiew - consider at first calculating just near distance, + // TODO: awulkiew - consider at first calculating near distance only, // comparing it with m_result.comparable_distance if it's valid, // after that calculate the rest of distances and check predicates @@ -246,7 +246,7 @@ public: // calculate values distance for distance predicate value_distances_type distances = value_distances_calc::apply(m_dist_pred, m_tr(*it)); - // TODO: awulkiew - consider at first calculating just point relation distance, + // TODO: awulkiew - consider at first calculating point relation distance only, // comparing it with m_result.comparable_distance if it's valid, // after that calculate the rest of distances and check predicates diff --git a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp index 26e16a3e5..45928e1e0 100644 --- a/include/boost/geometry/extensions/index/rtree/visitors/print.hpp +++ b/include/boost/geometry/extensions/index/rtree/visitors/print.hpp @@ -185,7 +185,7 @@ std::ostream & operator<<(std::ostream & os, rtree c typedef typename rtree::options_type options_type; typedef typename rtree::translator_type translator_type; typedef typename rtree::box_type box_type; - detail::rtree::visitors::print print_v(os, tree.get_translator()); + detail::rtree::visitors::print print_v(os, tree.translator()); tree.apply_visitor(print_v); return os; } diff --git a/tests/additional_sizes_and_times.cpp b/tests/additional_sizes_and_times.cpp index 1145cff69..2ac1ca206 100644 --- a/tests/additional_sizes_and_times.cpp +++ b/tests/additional_sizes_and_times.cpp @@ -183,6 +183,34 @@ int main() std::cout << "found: " << temp << "\n"; } + // copying test + { + std::cout << "rtree copying time test... (" + << values_count << ")\n"; + tim.restart(); + RT t_copy(t); + std::cout << "time: " << tim.elapsed() << "s\n"; + std::cout << "new size: " << t_copy.size() << '\n'; + + // t_copy searching test + { + std::cout << "tree copy query(intersects(B)) searching time test... (" + << queries_count << ")\n"; + tim.restart(); + size_t temp = 0; + for (size_t i = 0 ; i < queries_count ; ++i ) + { + float x = coords[i].first; + float y = coords[i].second; + std::deque< std::pair > result; + t_copy.query(bgi::intersects(B(P(x - 10, y - 10), P(x + 10, y + 10))), std::back_inserter(result)); + temp += result.size(); + } + std::cout << "time: " << tim.elapsed() << "s\n"; + std::cout << "found: " << temp << "\n"; + } + } + // searching test { std::cout << "query(!disjoint(B)) searching time test... (" diff --git a/tests/main.cpp b/tests/main.cpp index f26e2927d..0ed7fda2d 100644 --- a/tests/main.cpp +++ b/tests/main.cpp @@ -27,8 +27,7 @@ BOOST_AUTO_TEST_CASE( first_test_case ) BOOST_AUTO_TEST_CASE( last_test_case ) { - tests_rtree_filters_hpp(); - + #ifdef _MSC_VER std::cin.get(); #endif diff --git a/tests/rtree_filters.hpp b/tests/rtree_filters.hpp index 98461a1d3..86a9454af 100644 --- a/tests/rtree_filters.hpp +++ b/tests/rtree_filters.hpp @@ -12,24 +12,24 @@ #include #include -template -void tests_rtree_filters_hpp_print_range(R const& r) -{ - BOOST_FOREACH(typename boost::iterator_value::type const& b, r) - { - float min_x = b.min_corner().template get<0>(); - float min_y = b.min_corner().template get<1>(); - float max_x = b.max_corner().template get<0>(); - float max_y = b.max_corner().template get<1>(); - std::cout << "(" << min_x << ", " << min_y << ")"; - std::cout << 'x'; - std::cout << "(" << max_x << ", " << max_y << ")"; - std::cout << '\n'; - } - std::cout << std::endl; -} +//template +//void tests_rtree_filters_hpp_print_range(R const& r) +//{ +// BOOST_FOREACH(typename boost::iterator_value::type const& b, r) +// { +// float min_x = b.min_corner().template get<0>(); +// float min_y = b.min_corner().template get<1>(); +// float max_x = b.max_corner().template get<0>(); +// float max_y = b.max_corner().template get<1>(); +// std::cout << "(" << min_x << ", " << min_y << ")"; +// std::cout << 'x'; +// std::cout << "(" << max_x << ", " << max_y << ")"; +// std::cout << '\n'; +// } +// std::cout << std::endl; +//} -void tests_rtree_filters_hpp() +BOOST_AUTO_TEST_CASE(tests_rtree_query_filter) { #ifdef TEST_PRINT_INFO std::cout << "tests/rtree_filters.hpp\n"; @@ -47,10 +47,14 @@ void tests_rtree_filters_hpp() bgi::insert(t, B(P(4, 4), P(5, 5))); bgi::insert(t, B(P(6, 6), P(7, 7))); bgi::insert(t, B(P(8, 8), P(9, 9))); - std::cout << t; - std::cout << "Query: (2.5, 2.5)x(4.5, 4.5)\n"; - tests_rtree_filters_hpp_print_range(t | bgi::query_filtered(B(P(2.5f, 2.5f), P(4.5f, 4.5f)))); + size_t n = 0; + BOOST_FOREACH(B const& b, t | bgi::query_filtered(B(P(1.5f, 1.5f), P(4.5f, 4.5f)))) + { + ++n; + } + + BOOST_CHECK(n == 2); } } diff --git a/tests/rtree_function.hpp b/tests/rtree_function.hpp index 4aac2fc91..60048dd69 100644 --- a/tests/rtree_function.hpp +++ b/tests/rtree_function.hpp @@ -224,7 +224,7 @@ Box values_box(Iter first, Iter last, Translator const& tr) } // namespace helpers template -void random_query_check(Rtree const& t, Cont const& c, size_t n, Randomizer r) +void random_query_check(Rtree const& t, Rtree const& t_copy, Cont const& c, size_t n, Randomizer r) { namespace bg = boost::geometry; namespace bgi = bg::index; @@ -233,26 +233,32 @@ void random_query_check(Rtree const& t, Cont const& c, size_t n, Randomizer r) { Predicate pred = Predicate(r()); - std::vector res1, res2; + std::vector res1, res2, res3; bgi::query(t, pred, std::back_inserter(res1)); + bgi::query(t_copy, pred, std::back_inserter(res2)); for ( typename Cont::const_iterator it = c.begin() ; it != c.end() ; ++it ) { - if ( bgi::predicates_check(pred, *it, t.get_translator()(*it)) ) - res2.push_back(*it); + if ( bgi::predicates_check(pred, *it, t.translator()(*it)) ) + res3.push_back(*it); } std::stringstream ss; - ss << "\nPredicate: " << typeid(Predicate).name() << "\nres1: " << res1.size() << ", res2: " << res2.size() << '\n'; + ss << "\nPredicate: " << typeid(Predicate).name() << "\n" + << "res1: " << res1.size() + << ", res2: " << res2.size() + << ", res3: " << res3.size() << '\n'; - BOOST_CHECK_MESSAGE( helpers::results_compare(res1, res2, t.get_translator()), ss.str()); + BOOST_CHECK_MESSAGE( helpers::results_compare(res1, res2, t.translator()), ss.str()); + BOOST_CHECK_MESSAGE( helpers::results_compare(res1, res3, t.translator()), ss.str()); } } template void random_nearest_check( Rtree const& t, + Rtree const& t_copy, Cont const& c, size_t n, PointRandomizer const& pr, @@ -267,30 +273,36 @@ void random_nearest_check( typename PointRandomizer::value_type pt = pr(); Predicate pred = Predicate(r()); - std::vector res1, res2; + std::vector res1, res2, res3; bgi::nearest(t, pt, k, pred, std::back_inserter(res1)); + bgi::nearest(t_copy, pt, k, pred, std::back_inserter(res2)); + for ( typename Cont::const_iterator it = c.begin() ; it != c.end() ; ++it ) { - if ( bgi::predicates_check(pred, *it, t.get_translator()(*it)) ) - res2.push_back(*it); + if ( bgi::predicates_check(pred, *it, t.translator()(*it)) ) + res3.push_back(*it); } std::sort( - res2.begin(), - res2.end(), + res3.begin(), + res3.end(), helpers::val_mindist_cmp< typename PointRandomizer::value_type, typename Rtree::translator_type - >(pt, t.get_translator()) + >(pt, t.translator()) ); - if ( k < res2.size() ) - res2.resize(k); + if ( k < res3.size() ) + res3.resize(k); std::stringstream ss; - ss << "\nPredicate: " << typeid(Predicate).name() << "\nres1: " << res1.size() << ", res2: " << res2.size() << '\n'; + ss << "\nPredicate: " << typeid(Predicate).name() << "\n" + << "res1: " << res1.size() + << ", res2: " << res2.size() + << ", res3: " << res3.size() << '\n'; - BOOST_CHECK_MESSAGE(helpers::nearest_results_compare(pt, res1, res2, t.get_translator()), ss.str()); + BOOST_CHECK_MESSAGE(helpers::nearest_results_compare(pt, res1, res2, t.translator()), ss.str()); + BOOST_CHECK_MESSAGE(helpers::nearest_results_compare(pt, res1, res3, t.translator()), ss.str()); } } @@ -301,26 +313,26 @@ template struct tests_rtree_function_queries { template - inline static void apply(Rtree const& t, Cont const& v) + inline static void apply(Rtree const& t, Rtree const& t_copy, Cont const& v) { namespace bgi = boost::geometry::index; - random_query_check(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); + random_query_check(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); - random_nearest_check(t, v, 5, helpers::value_randomizer

(10, 0), 3, bgi::empty); - random_nearest_check(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, bgi::empty); + random_nearest_check(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); } }; @@ -328,29 +340,29 @@ template struct tests_rtree_function_queries { template - inline static void apply(Rtree const& t, Cont const& v) + inline static void apply(Rtree const& t, Rtree const& t_copy, Cont const& v) { namespace bgi = boost::geometry::index; - random_query_check(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); - random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); + random_query_check(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); + random_query_check >(t, t_copy, v, 5, helpers::value_randomizer(10, 5)); - random_nearest_check(t, v, 5, helpers::value_randomizer

(10, 0), 3, bgi::empty); - random_nearest_check(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); - random_nearest_check >(t, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, bgi::empty); + random_nearest_check(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); + random_nearest_check >(t, t_copy, v, 5, helpers::value_randomizer

(10, 0), 3, helpers::value_randomizer(10, 5)); } }; @@ -369,11 +381,17 @@ void tests_rtree_function(Translator const& tr = Translator()) helpers::random_insert(t, v, 10, helpers::value_randomizer(10, 1)); + bgi::rtree t_copy(t); + + BOOST_CHECK(bgi::size(t) == 10); + BOOST_CHECK(bgi::size(t) == bgi::size(t_copy)); + BOOST_CHECK(bg::equals(bgi::box(t), bgi::box(t_copy))); + B bt = bgi::box(t); B bv = helpers::values_box(v.begin(), v.end(), tr); BOOST_CHECK(bg::equals(bt, bv)); - tests_rtree_function_queries::type>::apply(t, v); + tests_rtree_function_queries::type>::apply(t, t_copy, v); bgi::clear(t); BOOST_CHECK(bgi::empty(t));