123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- // Boost.Geometry Index
- // Unit Test
- // Copyright (c) 2015 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 <rtree/test_rtree.hpp>
- #include <algorithm>
- #include <boost/container/vector.hpp>
- #include <boost/move/move.hpp>
- #include <boost/move/iterator.hpp>
- #include <boost/geometry/geometries/register/point.hpp>
- class point_cm
- {
- BOOST_COPYABLE_AND_MOVABLE(point_cm)
- public:
- point_cm(double xx = 0, double yy = 0)
- : x(xx)
- , y(yy)
- , moved(false)
- {}
- point_cm(point_cm const& other)
- : x(other.x)
- , y(other.y)
- , moved(false)
- {
- BOOST_CHECK_MESSAGE(false, "copy not allowed");
- }
- point_cm & operator=(BOOST_COPY_ASSIGN_REF(point_cm) other)
- {
- BOOST_CHECK_MESSAGE(false, "copy not allowed");
- x = other.x;
- y = other.y;
- moved = false;
- return *this;
- }
- point_cm(BOOST_RV_REF(point_cm) other)
- : x(other.x)
- , y(other.y)
- , moved(false)
- {
- BOOST_CHECK_MESSAGE(!other.moved, "only one move allowed");
- other.moved = true;
- }
- point_cm & operator=(BOOST_RV_REF(point_cm) other)
- {
- BOOST_CHECK_MESSAGE(!other.moved, "only one move allowed");
- x = other.x;
- y = other.y;
- moved = false;
- other.moved = true;
- return *this;
- }
- double x, y;
- bool moved;
- };
- template <typename Point>
- struct indexable
- {
- typedef Point const& result_type;
- result_type operator()(Point const& p) const
- {
- BOOST_CHECK_MESSAGE(!p.moved, "can't access indexable of moved Value");
- return p;
- }
- };
- BOOST_GEOMETRY_REGISTER_POINT_2D(point_cm, double, bg::cs::cartesian, x, y)
- template <typename Vector>
- void append(Vector & vec, double x, double y)
- {
- point_cm pt(x, y);
- BOOST_CHECK(!pt.moved);
- vec.push_back(boost::move(pt));
- BOOST_CHECK(pt.moved);
- }
- struct test_moved
- {
- test_moved(bool ex)
- : expected(ex)
- {}
- template <typename Point>
- void operator()(Point const& p) const
- {
- BOOST_CHECK_EQUAL(p.moved, expected);
- }
- bool expected;
- };
- template <typename Point, typename Params>
- void test_rtree(Params const& params = Params())
- {
- // sanity check
- boost::container::vector<Point> vec;
- append(vec, 0, 0); append(vec, 0, 1); append(vec, 0, 2);
- append(vec, 1, 0); append(vec, 1, 1); append(vec, 1, 2);
- append(vec, 2, 0); append(vec, 2, 1); append(vec, 2, 2);
- std::for_each(vec.begin(), vec.end(), test_moved(false));
- bgi::rtree<Point, Params, indexable<Point> > rt(
- boost::make_move_iterator(vec.begin()),
- boost::make_move_iterator(vec.end()),
- params);
- std::for_each(vec.begin(), vec.end(), test_moved(true));
- BOOST_CHECK_EQUAL(rt.size(), vec.size());
- }
- int test_main(int, char* [])
- {
- test_rtree< point_cm, bgi::linear<4> >();
- test_rtree< point_cm, bgi::quadratic<4> >();
- test_rtree< point_cm, bgi::rstar<4> >();
- test_rtree<point_cm>(bgi::dynamic_linear(4));
- test_rtree<point_cm>(bgi::dynamic_quadratic(4));
- test_rtree<point_cm>(bgi::dynamic_rstar(4));
- return 0;
- }
|