$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r74619 - sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree
From: adam.wulkiewicz_at_[hidden]
Date: 2011-09-30 17:39:15
Author: awulkiew
Date: 2011-09-30 17:39:13 EDT (Fri, 30 Sep 2011)
New Revision: 74619
URL: http://svn.boost.org/trac/boost/changeset/74619
Log:
added rtree's constructor, insert, remove methods and free functions working for ranges specified by a pair of iterators.
Text files modified: 
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp |   122 ++++++++++++++++++++++++++++----------- 
   1 files changed, 87 insertions(+), 35 deletions(-)
Modified: sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp
==============================================================================
--- sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp	(original)
+++ sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp	2011-09-30 17:39:13 EDT (Fri, 30 Sep 2011)
@@ -41,20 +41,24 @@
 
 namespace boost { namespace geometry { namespace index {
 
-// TODO copying
 // TODO move extensional/debug visitors to the other folder
+// move gldraw indexable (+ value with translator) to geometry::index namespace
 
-// TODO: awulkiew
-// iterators, begin/end/etc.
+// TODO: awulkiew - implement iterators ?
 
-// TODO: copy, assignment
-// allow copying of a tree with different template parameters? e.g. Parameters, Translator?
+// TODO: 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?
+// TODO: should funcions like empty(tree) clear(tree) box(tree) be free functions?
+// change name of empty predicate generator - empty()?
 
 // TODO which types should be public and which one should be private?
-// nodes, options etc. probably shouldn't
+// nodes, options etc. probably shouldn't be public
+
+// 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,
@@ -86,14 +90,76 @@
         create();
     }
 
+    template<typename Iterator>
+    inline explicit rtree(Iterator first, Iterator last, translator_type const& translator = translator_type())
+        : m_values_count(0)
+        , m_root(0)
+        , m_leafs_level(0)
+        , m_translator(translator)
+    {
+        create();
+        insert(first, last);
+    }
+
+    inline ~rtree()
+    {
+        destroy(*this);
+    }
+
     inline rtree(rtree const& src)
     {
         copy(src, *this);
     }
 
-    inline ~rtree()
+    inline rtree & operator=(rtree const& src)
     {
+        if ( &src == this )
+            return *this;
+
         destroy(*this);
+        copy(src, *this);
+
+        return *this;
+    }
+
+    inline void insert(value_type const& value)
+    {
+        // TODO: awulkiew - assert for correct value
+
+        detail::rtree::visitors::insert<value_type, value_type, options_type, translator_type, box_type, typename options_type::insert_tag>
+            insert_v(m_root, m_leafs_level, value, m_translator);
+
+        detail::rtree::apply_visitor(insert_v, *m_root);
+
+        ++m_values_count;
+    }
+
+    template <typename Iterator>
+    inline void insert(Iterator first, Iterator last)
+    {
+        for ( ; first != last ; ++first )
+            insert(*first);
+    }
+
+    inline void remove(value_type const& value)
+    {
+        // TODO: awulkiew - assert for correct value
+
+        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_values_count, "can't remove, there is no elements in the rtree");
+
+        detail::rtree::visitors::remove<value_type, options_type, translator_type, box_type>
+            remove_v(m_root, m_leafs_level, value, m_translator);
+
+        detail::rtree::apply_visitor(remove_v, *m_root);
+
+        --m_values_count;
+    }
+
+    template <typename Iterator>
+    inline void remove(Iterator first, Iterator last)
+    {
+        for ( ; first != last ; ++first )
+            remove(*first);
     }
 
     template <typename Predicates, typename OutIter>
@@ -131,32 +197,6 @@
         return nearest_k(dpred, k, pred, out_it);
     }
 
-    inline void insert(value_type const& value)
-    {
-        // TODO: awulkiew - assert for correct value
-
-        detail::rtree::visitors::insert<value_type, value_type, options_type, translator_type, box_type, typename options_type::insert_tag>
-            insert_v(m_root, m_leafs_level, value, m_translator);
-
-        detail::rtree::apply_visitor(insert_v, *m_root);
-
-        ++m_values_count;
-    }
-
-    inline void remove(value_type const& value)
-    {
-        // TODO: awulkiew - assert for correct value
-
-        BOOST_GEOMETRY_INDEX_ASSERT(0 < m_values_count, "can't remove, there is no elements in the rtree");
-
-        detail::rtree::visitors::remove<value_type, options_type, translator_type, box_type>
-            remove_v(m_root, m_leafs_level, value, m_translator);
-
-        detail::rtree::apply_visitor(remove_v, *m_root);
-
-        --m_values_count;
-    }
-
     inline size_t size() const
     {
         return m_values_count;
@@ -315,12 +355,24 @@
     tree.insert(v);
 }
 
+template<typename Iterator, typename Value, typename Options, typename Translator>
+inline void insert(rtree<Value, Options, Translator> & tree, Iterator first, Iterator last)
+{
+    tree.insert(first, last);
+}
+
 template <typename Value, typename Options, typename Translator>
 inline void remove(rtree<Value, Options, Translator> & tree, Value const& v)
 {
     tree.remove(v);
 }
 
+template<typename Iterator, typename Value, typename Options, typename Translator>
+inline void remove(rtree<Value, Options, Translator> & tree, Iterator first, Iterator last)
+{
+    tree.remove(first, last);
+}
+
 template <typename Value, typename Options, typename Translator, typename Predicates, typename OutIter>
 inline size_t query(rtree<Value, Options, Translator> const& tree, Predicates const& pred, OutIter out_it)
 {