diff --git a/include/boost/geometry/extensions/index/inserter.hpp b/include/boost/geometry/extensions/index/inserter.hpp new file mode 100644 index 000000000..73fe21fc7 --- /dev/null +++ b/include/boost/geometry/extensions/index/inserter.hpp @@ -0,0 +1,65 @@ +// Boost.Geometry (aka GGL, Generic Geometry Library) +// +// Boost.SpatialIndex - inserter +// +// 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_INSERTER_HPP +#define BOOST_GEOMETRY_EXTENSIONS_INDEX_INSERTER_HPP + +#include + +namespace boost { namespace geometry { namespace index { + +template +class insert_iterator : + public std::iterator +{ +public: + typedef Container container_type; + + inline explicit insert_iterator() +// : container(0) + {} + + inline explicit insert_iterator(Container & c) + : container(&c) + {} + + insert_iterator & operator=(typename Container::value_type const& value) + { + index::insert(*container, value); + return *this; + } + + insert_iterator & operator* () + { + return *this; + } + + insert_iterator & operator++ () + { + return *this; + } + + insert_iterator operator++(int) + { + return *this; + } + +private: + Container * container; +}; + +template +insert_iterator inserter(Container & c) +{ + return insert_iterator(c); +} + +}}} // namespace boost::geometry::index + +#endif // BOOST_GEOMETRY_EXTENSIONS_INDEX_INSERTER_HPP diff --git a/include/boost/geometry/extensions/index/rtree/rtree.hpp b/include/boost/geometry/extensions/index/rtree/rtree.hpp index 1d6115f5e..974e10d3c 100644 --- a/include/boost/geometry/extensions/index/rtree/rtree.hpp +++ b/include/boost/geometry/extensions/index/rtree/rtree.hpp @@ -57,9 +57,6 @@ namespace boost { namespace geometry { namespace index { // TODO change remove() to erase() or just add erase() ? // erase works on iterators of this container so this may be confusing with remove(ValIt, ValIt) -// TODO add third parameter to insert(It, It) - unary_op, like in std::transform -// transforming It::value_type to rtree::value_type ? - template < typename Value, typename Parameters, @@ -355,7 +352,7 @@ inline void insert(rtree & tree, Value const& v) tree.insert(v); } -template +template inline void insert(rtree & tree, Iterator first, Iterator last) { tree.insert(first, last); @@ -367,7 +364,7 @@ inline void remove(rtree & tree, Value const& v) tree.remove(v); } -template +template inline void remove(rtree & tree, Iterator first, Iterator last) { tree.remove(first, last); diff --git a/tests/additional_sizes_and_times.cpp b/tests/additional_sizes_and_times.cpp index 2ac1ca206..2d8352e12 100644 --- a/tests/additional_sizes_and_times.cpp +++ b/tests/additional_sizes_and_times.cpp @@ -11,6 +11,7 @@ #include #include +#include #include #include @@ -137,6 +138,25 @@ int main() std::cout << "time: " << tim.elapsed() << "s\n"; } + // elements inserting test using insert_iterator + { + RT t; + + std::cout << "rtree inserting time test using insert_iterator<>... (" + << values_count << ")\n"; + bgi::insert_iterator ii = bgi::inserter(t); + tim.restart(); + for (size_t i = 0 ; i < values_count ; ++i ) + { + float x = coords[i].first; + float y = coords[i].second; + B b(P(x - 0.5f, y - 0.5f), P(x + 0.5f, y + 0.5f)); + + *ii++ = std::make_pair(b, i); + } + std::cout << "time: " << tim.elapsed() << "s\n"; + } + std::vector< std::pair > v; // elements inserting test diff --git a/tests/rtree_function.hpp b/tests/rtree_function.hpp index 60048dd69..3eb92a484 100644 --- a/tests/rtree_function.hpp +++ b/tests/rtree_function.hpp @@ -5,6 +5,7 @@ #include #include +#include #include @@ -118,10 +119,13 @@ void random_insert(Rtree & t, Cont & c, size_t n, Randomizer r) namespace bg = boost::geometry; namespace bgi = bg::index; + bgi::insert_iterator ii = bgi::inserter(t); + for ( size_t i = 0 ; i < n ; ++i ) { typename Randomizer::value_type v = r(); - bgi::insert(t, v); + //bgi::insert(t, v); + *ii++ = v; c.push_back(v); } }