#ifndef TESTS_RTREE_FUNCTION_HPP #define TESTS_RTREE_FUNCTION_HPP #include #include #include #include #include #include #include namespace helpers { template struct value_randomizer_impl_set {}; template struct value_randomizer_impl_set { inline static void apply( Box & b, typename boost::geometry::index::traits::coordinate_type::type m, typename boost::geometry::index::traits::coordinate_type::type w) { namespace bg = boost::geometry; typedef typename bg::index::traits::coordinate_type::type coord_t; coord_t c1 = ::rand() / coord_t(RAND_MAX / m); coord_t c2 = ::rand() / coord_t(RAND_MAX / w); bg::set(b, c1 - c2); bg::set(b, c1 + c2); } }; template struct value_randomizer_impl_set { inline static void apply( Point & p, typename boost::geometry::index::traits::coordinate_type::type m, typename boost::geometry::index::traits::coordinate_type::type) { namespace bg = boost::geometry; typedef typename bg::index::traits::coordinate_type::type coord_t; coord_t c = ::rand() / coord_t(RAND_MAX / m); bg::set(p, c); } }; template struct value_randomizer_impl { inline static void apply( Indexable & i, typename boost::geometry::index::traits::coordinate_type::type m, typename boost::geometry::index::traits::coordinate_type::type w) { value_randomizer_impl::apply(i, m, w); value_randomizer_impl_set< Indexable, D - 1, typename boost::geometry::index::traits::tag::type >::apply(i, m, w); } }; template struct value_randomizer_impl { inline static void apply( Indexable & i, typename boost::geometry::index::traits::coordinate_type::type m, typename boost::geometry::index::traits::coordinate_type::type w) { value_randomizer_impl_set< Indexable, 0, typename boost::geometry::index::traits::tag::type >::apply(i, m, w); } }; template struct value_randomizer { typedef Indexable value_type; typedef typename boost::geometry::index::traits::coordinate_type::type coord_t; inline value_randomizer(coord_t mm, coord_t ww) : m(mm), w(ww) {} inline Indexable operator()() const { namespace bg = boost::geometry; namespace bgi = bg::index; Indexable i; value_randomizer_impl::value>::apply(i, m, w); return i; } coord_t m, w; }; template void random_insert(Rtree & t, Cont & c, size_t n, Randomizer r) { namespace bg = boost::geometry; namespace bgi = bg::index; for ( size_t i = 0 ; i < n ; ++i ) { typename Randomizer::value_type v = r(); bgi::insert(t, v); c.push_back(v); } } template bool results_comp(Cont const& c1, Cont const& c2, Translator const& tr) { if ( c1.size() != c2.size() ) return false; for ( typename Cont::const_iterator it = c1.begin() ; it != c1.end() ; ++it ) { bool found = false; for ( typename Cont::const_iterator it2 = c2.begin() ; it2 != c2.end() ; ++it2 ) if ( tr.equals(*it, *it2) ) { found = true; break; } if ( !found ) return false; } return true; } template void random_query_check(Rtree const& t, Cont const& c, size_t n, Randomizer r) { namespace bg = boost::geometry; namespace bgi = bg::index; for ( size_t i = 0 ; i < n ; ++i ) { Predicate pred = Predicate(r()); std::vector res1, res2; bgi::query(t, pred, std::back_inserter(res1)); for ( typename Cont::const_iterator it = c.begin() ; it != c.end() ; ++it ) { if ( bgi::predicates_check(pred, t.get_translator()(*it)) ) res2.push_back(*it); } BOOST_CHECK( helpers::results_comp(res1, res2, t.get_translator()) ); } } template struct val_mindist_cmp { val_mindist_cmp(Point const& p, Translator const& t) : pt(p), tr(t) {} template bool operator()(Value const& v1, Value const& v2) { return boost::geometry::index::mindist(pt, tr(v1)) < boost::geometry::index::mindist(pt, tr(v2)); } Point const& pt; Translator const& tr; }; template void random_nearest_check( Rtree const& t, Cont const& c, size_t n, PointRandomizer const& pr, size_t k, PredicateRandomizer const& r) { namespace bg = boost::geometry; namespace bgi = bg::index; for ( size_t i = 0 ; i < n ; ++i ) { typename PointRandomizer::value_type pt = pr(); Predicate pred = Predicate(r()); std::vector res1, res2; bgi::nearest(t, pt, k, pred, std::back_inserter(res1)); for ( typename Cont::const_iterator it = c.begin() ; it != c.end() ; ++it ) { if ( bgi::predicates_check(pred, t.get_translator()(*it)) ) res2.push_back(*it); } std::sort( res2.begin(), res2.end(), val_mindist_cmp< typename PointRandomizer::value_type, typename Rtree::translator_type >(pt, t.get_translator()) ); if ( k < res2.size() ) res2.resize(k); BOOST_CHECK( helpers::results_comp(res1, res2, t.get_translator()) ); } } } template struct tests_rtree_function_queries {}; template struct tests_rtree_function_queries { template inline static void apply(Rtree const& t, Cont const& v) { namespace bgi = boost::geometry::index; helpers::random_query_check(t, v, 5, helpers::value_randomizer(10, 5)); helpers::random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); helpers::random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); helpers::random_query_check >(t, v, 5, helpers::value_randomizer(10, 5)); helpers::random_nearest_check(t, v, 5, helpers::value_randomizer

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

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

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

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

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

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

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

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

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

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

(10, 0), 3, helpers::value_randomizer(10, 5)); } }; template void tests_rtree_function() { namespace bg = boost::geometry; namespace bgi = bg::index; bgi::rtree t; std::vector v; typedef typename bgi::rtree::indexable_type I; typedef typename bgi::rtree::box_type B; typedef typename bgi::traits::point_type::type P ; helpers::random_insert(t, v, 10, helpers::value_randomizer(10, 1)); tests_rtree_function_queries::type>::apply(t, v); } BOOST_AUTO_TEST_CASE(tests_rtree_function_box3f) { std::cout << "tests/rtree_function_box3f\n"; namespace bg = boost::geometry; namespace bgi = bg::index; typedef bg::model::point P; typedef bg::model::box

B; typedef B val_t; tests_rtree_function< val_t, bgi::linear<4, 2> >(); tests_rtree_function< val_t, bgi::quadratic<4, 2> >(); tests_rtree_function< val_t, bgi::rstar<4, 2> >(); } BOOST_AUTO_TEST_CASE(tests_rtree_function_box2f) { std::cout << "tests/rtree_function_box2f\n"; namespace bg = boost::geometry; namespace bgi = bg::index; typedef bg::model::point P; typedef bg::model::box

B; typedef B val_t; tests_rtree_function< val_t, bgi::linear<4, 2> >(); tests_rtree_function< val_t, bgi::quadratic<4, 2> >(); tests_rtree_function< val_t, bgi::rstar<4, 2> >(); } BOOST_AUTO_TEST_CASE(tests_rtree_function_point2f) { std::cout << "tests/rtree_function_point2f\n"; namespace bg = boost::geometry; namespace bgi = bg::index; typedef bg::model::point P; typedef P val_t; tests_rtree_function< val_t, bgi::linear<4, 2> >(); tests_rtree_function< val_t, bgi::quadratic<4, 2> >(); tests_rtree_function< val_t, bgi::rstar<4, 2> >(); } namespace helpers { template struct value_randomizer< std::pair > { typedef std::pair value_type; typedef typename boost::geometry::index::traits::coordinate_type::type coord_t; inline value_randomizer(coord_t mm, coord_t ww) : r(mm, ww) {} inline value_type operator()() const { return std::make_pair(r(), ::rand()); } value_randomizer r; }; } // namespace helpers BOOST_AUTO_TEST_CASE(tests_rtree_function_pair_box2f_int) { std::cout << "tests/rtree_function_pair_box2f_int\n"; namespace bg = boost::geometry; namespace bgi = bg::index; typedef bg::model::point P; typedef bg::model::box

B; typedef std::pair V; tests_rtree_function< V, bgi::linear<4, 2> >(); tests_rtree_function< V, bgi::quadratic<4, 2> >(); tests_rtree_function< V, bgi::rstar<4, 2> >(); } // std::cout << "-------------------------------------------------\n"; // std::cout << "-------------------------------------------------\n"; // std::cout << "boost::shared_ptr< std::pair >\n"; // { // typedef bg::model::point P; // typedef bg::model::box

B; // // typedef boost::shared_ptr< std::pair > V; // V v1( new std::pair(B(P(0, 0), P(1, 1)), 0) ); // V v2( new std::pair(B(P(2, 2), P(3, 3)), 1) ); // V v3( new std::pair(B(P(4, 4), P(5, 5)), 2) ); // V v4( new std::pair(B(P(6, 6), P(7, 7)), 3) ); // V v5( new std::pair(B(P(8, 8), P(9, 9)), 4) ); // bgi::rtree t; // bgi::insert(t, v1); // bgi::insert(t, v2); // bgi::insert(t, v3); // bgi::insert(t, v4); // bgi::insert(t, v5); // std::cerr << t; // } // std::cout << "-------------------------------------------------\n"; // std::cout << "-------------------------------------------------\n"; // std::cout << "std::map::iterator\n"; // { // typedef bg::model::point P; // typedef bg::model::box

B; // // typedef std::map::iterator V; // std::map m; // m.insert(std::pair(0, B(P(0, 0), P(1, 1)))); // m.insert(std::pair(1, B(P(2, 2), P(3, 3)))); // m.insert(std::pair(2, B(P(4, 4), P(5, 5)))); // m.insert(std::pair(3, B(P(6, 6), P(7, 7)))); // m.insert(std::pair(4, B(P(8, 8), P(9, 9)))); // bgi::rtree t; // V vit = m.begin(); // bgi::insert(t, vit++); // bgi::insert(t, vit++); // bgi::insert(t, vit++); // bgi::insert(t, vit++); // bgi::insert(t, vit); // std::cerr << t; // } // std::cout << "-------------------------------------------------\n"; // std::cout << "-------------------------------------------------\n"; // std::cout << "size_t\n"; // { // typedef bg::model::point P; // typedef bg::model::box

B; // typedef size_t V; // typedef bgi::translator::index > Tr; // std::vector v; // v.push_back(B(P(0, 0), P(1, 1))); // v.push_back(B(P(2, 2), P(3, 3))); // v.push_back(B(P(4, 4), P(5, 5))); // v.push_back(B(P(6, 6), P(7, 7))); // v.push_back(B(P(8, 8), P(9, 9))); //Tr tr(v); // bgi::rtree t(tr); // bgi::insert(t, 0u); // bgi::insert(t, 1u); // bgi::insert(t, 2u); // bgi::insert(t, 3u); // bgi::insert(t, 4u); // std::cerr << t; // } #endif // TESTS_RTREE_FUNCTION_HPP