Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r80142 - sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree
From: adam.wulkiewicz_at_[hidden]
Date: 2012-08-22 10:59:31


Author: awulkiew
Date: 2012-08-22 10:59:29 EDT (Wed, 22 Aug 2012)
New Revision: 80142
URL: http://svn.boost.org/trac/boost/changeset/80142

Log:
Implemented moving semantics in the r-tree.
Text files modified:
   sandbox-branches/geometry/index/boost/geometry/extensions/index/rtree/rtree.hpp | 120 +++++++++++++++++++++++++++++++++------
   1 files changed, 101 insertions(+), 19 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 2012-08-22 10:59:29 EDT (Wed, 22 Aug 2012)
@@ -12,7 +12,9 @@
 #define BOOST_GEOMETRY_EXTENSIONS_INDEX_RTREE_RTREE_HPP
 
 #include <algorithm>
+
 #include <boost/tuple/tuple.hpp>
+#include <boost/move/move.hpp>
 
 #include <boost/geometry/geometry.hpp>
 
@@ -60,6 +62,8 @@
>
 class rtree
 {
+ BOOST_COPYABLE_AND_MOVABLE(rtree)
+
 public:
     typedef Value value_type;
     typedef Translator translator_type;
@@ -90,7 +94,7 @@
         , m_translator(translator)
         , m_allocators(allocator)
     {
- create();
+ this->create();
     }
 
     /*!
@@ -102,14 +106,15 @@
     \param allocator The allocator object.
     */
     template<typename Iterator>
- inline explicit rtree(Iterator first, Iterator last, translator_type const& translator = translator_type(), Allocator allocator = std::allocator<value_type>())
+ inline rtree(Iterator first, Iterator last, translator_type const& translator = translator_type(), Allocator allocator = std::allocator<value_type>())
         : m_values_count(0)
         , m_root(0)
         , m_leafs_level(0)
         , m_translator(translator)
+ , m_allocators(allocator)
     {
- create();
- insert(first, last);
+ this->create();
+ this->insert(first, last);
     }
 
     /*!
@@ -117,7 +122,8 @@
     */
     inline ~rtree()
     {
- destroy(*this);
+ if ( !this->empty() )
+ this->destroy(*this);
     }
 
     /*!
@@ -126,36 +132,73 @@
     inline rtree(rtree const& src)
         : m_allocators(src.m_allocators)
     {
+ //TODO use Boost.Container allocator_traits_type::select_on_container_copy_construction()
+
+ try
+ {
+ this->copy(src, *this);
+ }
+ catch(...)
+ {
+ this->destroy(*this);
+ throw;
+ }
+ }
+
+ /*!
+ The copy constructor.
+ */
+ inline rtree(rtree const& src, Allocator const& allocator)
+ : m_allocators(allocator)
+ {
         try
         {
- copy(src, *this);
+ this->copy(src, *this);
         }
         catch(...)
         {
- destroy(*this);
+ this->destroy(*this);
             throw;
         }
     }
 
     /*!
+ The moving constructor.
+ */
+ inline rtree(BOOST_RV_REF(rtree) src)
+ : m_values_count(src.m_values_count)
+ , m_root(src.m_root)
+ , m_leafs_level(src.m_leafs_level)
+ , m_translator(src.m_translator)
+ , m_allocators(src.m_allocators)
+ {
+ src.m_values_count = 0;
+ src.m_root = 0;
+ src.m_leafs_level = 0;
+ }
+
+ /*!
     The assignment operator.
     */
- inline rtree & operator=(rtree const& src)
+ inline rtree & operator=(BOOST_COPY_ASSIGN_REF(rtree) src)
     {
+ //TODO use Boost.Container allocator_traits_type::propagate_on_container_move_assignment
+
         if ( &src == this )
             return *this;
 
- destroy(*this);
+ if ( !this->empty() )
+ this->destroy(*this);
         
- m_allocators = src.m_allocators;
+ //m_allocators = src.m_allocators;
 
         try
         {
- copy(src, *this);
+ this->copy(src, *this);
         }
         catch(...)
         {
- destroy(*this);
+ this->destroy(*this);
             throw;
         }
 
@@ -163,6 +206,45 @@
     }
 
     /*!
+ The moving assignment.
+ */
+ inline rtree & operator=(BOOST_RV_REF(rtree) src)
+ {
+ //TODO use Boost.Container allocator_traits_type::propagate_on_container_move_assignment
+
+ if ( this == &src )
+ return *this;
+
+ if ( !this->empty() )
+ this->destroy(*this);
+
+ //m_allocators = src.m_allocators;
+
+ if ( m_allocators == src.m_allocators)
+ {
+ m_values_count = src.m_values_count;
+ src.m_values_count = 0;
+ m_root = src.m_root;
+ src.m_root = 0;
+ m_leafs_level = src.m_leafs_level;
+ src.m_leafs_level = 0;
+ m_translator = src.m_translator;
+ }
+ else
+ {
+ try
+ {
+ this->copy(src, *this);
+ }
+ catch(...)
+ {
+ this->destroy(*this);
+ throw;
+ }
+ }
+ }
+
+ /*!
     Insert a value to the index.
 
     \param value The value which will be stored in the container.
@@ -189,7 +271,7 @@
         }
         catch(...)
         {
- destroy(*this);
+ this->destroy(*this);
             throw;
         }
     }
@@ -204,7 +286,7 @@
     inline void insert(Iterator first, Iterator last)
     {
         for ( ; first != last ; ++first )
- insert(*first);
+ this->insert(*first);
     }
 
     /*!
@@ -234,7 +316,7 @@
         }
         catch(...)
         {
- destroy(*this);
+ this->destroy(*this);
             throw;
         }
     }
@@ -249,7 +331,7 @@
     inline void remove(Iterator first, Iterator last)
     {
         for ( ; first != last ; ++first )
- remove(*first);
+ this->remove(*first);
     }
 
     /*!
@@ -358,8 +440,8 @@
     */
     inline void clear()
     {
- destroy(*this);
- create();
+ this->destroy(*this);
+ this->create();
     }
 
     /*!
@@ -371,7 +453,7 @@
     */
     inline box_type box() const
     {
- if ( empty() )
+ if ( this->empty() )
         {
             box_type result;
             geometry::assign_inverse(result);


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk