...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
#include <boost/geometry.hpp> #include <boost/geometry/geometries/point.hpp> #include <boost/geometry/geometries/box.hpp> #include <boost/geometry/index/rtree.hpp> // Boost.Range #include <boost/range.hpp> // adaptors #include <boost/range/adaptor/indexed.hpp> #include <boost/range/adaptor/transformed.hpp> // a container #include <vector> // just for output #include <iostream> namespace bg = boost::geometry; namespace bgi = boost::geometry::index; // Define a function object converting a value_type of indexed Range into std::pair<>. // This is a generic implementation but of course it'd be possible to use some // specific types. One could also take Value as template parameter and access // first_type and second_type members, etc. template <typename First, typename Second> struct pair_maker { typedef std::pair<First, Second> result_type; template<typename T> inline result_type operator()(T const& v) const { return result_type(v.value(), v.index()); } }; int main() { typedef bg::model::point<float, 2, bg::cs::cartesian> point; typedef bg::model::box<point> box; typedef std::vector<box> container; typedef container::size_type size_type; typedef std::pair<box, size_type> value; // create a container of boxes container boxes; for ( size_type i = 0 ; i < 10 ; ++i ) { // add a box into the container box b(point(i + 0.0f, i + 0.0f), point(i + 0.5f, i + 0.5f)); boxes.push_back(b); } // create the rtree passing a Range bgi::rtree< value, bgi::quadratic<16> > rtree(boxes | boost::adaptors::indexed() | boost::adaptors::transformed(pair_maker<box, size_type>())); // print the number of values using boxes[0] as indexable std::cout << rtree.count(boxes[0]) << std::endl; return 0; }
1