$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r52775 - in sandbox/boost0x: boost/ptr_container boost/ptr_container/detail boost/utility/detail libs/ptr_container/test
From: sebastian.redl_at_[hidden]
Date: 2009-05-05 17:34:31
Author: cornedbee
Date: 2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
New Revision: 52775
URL: http://svn.boost.org/trac/boost/changeset/52775
Log:
Partial move support for ptr_container.
Text files modified: 
   sandbox/boost0x/boost/ptr_container/detail/reversible_ptr_container.hpp |    51 +++++++++++++++++++++++++++------------ 
   sandbox/boost0x/boost/ptr_container/ptr_sequence_adapter.hpp            |    15 ++++++++++-                             
   sandbox/boost0x/boost/utility/detail/result_of_iterate.hpp              |     2                                         
   sandbox/boost0x/libs/ptr_container/test/Jamfile.v2                      |     2                                         
   sandbox/boost0x/libs/ptr_container/test/ptr_map.cpp                     |     9 +++++++                                 
   sandbox/boost0x/libs/ptr_container/test/sequence_test_data.hpp          |    12 ++++++++                                
   6 files changed, 70 insertions(+), 21 deletions(-)
Modified: sandbox/boost0x/boost/ptr_container/detail/reversible_ptr_container.hpp
==============================================================================
--- sandbox/boost0x/boost/ptr_container/detail/reversible_ptr_container.hpp	(original)
+++ sandbox/boost0x/boost/ptr_container/detail/reversible_ptr_container.hpp	2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
@@ -37,6 +37,8 @@
 #include <boost/type_traits/is_integral.hpp>
 #include <typeinfo>
 #include <memory>
+#include <utility>
+#include <stdio.h>
 
 #if BOOST_WORKAROUND(BOOST_MSVC, >= 1400)  
 #pragma warning(push)  
@@ -318,6 +320,10 @@
         reversible_ptr_container()
         { }
 
+        reversible_ptr_container( reversible_ptr_container&& o )
+          : c_( std::move( o.c_ ) )
+        {  }
+
         template< class SizeType >
         reversible_ptr_container( SizeType n, unordered_associative_container_tag )
           : c_( n )
@@ -362,13 +368,20 @@
             return *this;
         }
 
-        reversible_ptr_container& operator=( reversible_ptr_container r ) // strong 
+        reversible_ptr_container& operator=( const reversible_ptr_container& o ) // strong 
         {
+            reversible_ptr_container r(o);
             swap( r );
             return *this;
         }
-        
-        // overhead: null-initilization of container pointer (very cheap compared to cloning)
+
+        reversible_ptr_container& operator=( reversible_ptr_container&& r ) // nothrow
+        {
+            c_ = std::move( r.c_ );
+            return *this;
+        }
+
+        // overhead: null-initialization of container pointer (very cheap compared to cloning)
         // overhead: 1 heap allocation (very cheap compared to cloning)
         template< class InputIterator >
         reversible_ptr_container( InputIterator first, 
@@ -701,17 +714,23 @@
        return std::auto_ptr<this_type>( new this_type( this->begin(), this->end() ) ); \
     }
 
-#define BOOST_PTR_CONTAINER_DEFINE_COPY_CONSTRUCTORS( PC, base_type ) \
-                                                                      \
-    template< class U >                                               \
-    PC( const PC<U>& r ) : base_type( r ) { }                         \
-                                                                      \
-    PC& operator=( PC r )                                             \
-    {                                                                 \
-        this->swap( r );                                              \
-        return *this;                                                 \
-    }                                                                 \
-                                                                           
+#define BOOST_PTR_CONTAINER_DEFINE_COPY_CONSTRUCTORS( PC, base_type )     \
+                                                                          \
+    template< class U >                                                   \
+    PC( const PC<U>& r ) : base_type( r ) { }                             \
+                                                                          \
+    PC& operator=( const PC& o )                                          \
+    {                                                                     \
+        PC r(o);                                                          \
+        this->swap( r );                                                  \
+        return *this;                                                     \
+    }                                                                     \
+    PC( PC&& r ) : base_type( static_cast<base_type&&>( r ) ) { }         \
+    PC& operator=( PC&& r ) {                                             \
+        base_type::operator=( std::move( r ) );                           \
+        return *this;                                                     \
+    }
+
 
 #define BOOST_PTR_CONTAINER_DEFINE_CONSTRUCTORS( PC, base_type )                       \
     typedef BOOST_DEDUCED_TYPENAME base_type::iterator        iterator;                \
@@ -724,8 +743,8 @@
     PC( InputIterator first, InputIterator last ) : base_type( first, last ) {}        \
     template< class InputIterator >                                                    \
     PC( InputIterator first, InputIterator last,                                       \
-        const allocator_type& a ) : base_type( first, last, a ) {}  
-                 
+        const allocator_type& a ) : base_type( first, last, a ) {}
+
 #define BOOST_PTR_CONTAINER_DEFINE_NON_INHERITED_MEMBERS( PC, base_type, this_type )           \
    BOOST_PTR_CONTAINER_DEFINE_CONSTRUCTORS( PC, base_type )                                    \
    BOOST_PTR_CONTAINER_DEFINE_RELEASE_AND_CLONE( PC, base_type, this_type )
Modified: sandbox/boost0x/boost/ptr_container/ptr_sequence_adapter.hpp
==============================================================================
--- sandbox/boost0x/boost/ptr_container/ptr_sequence_adapter.hpp	(original)
+++ sandbox/boost0x/boost/ptr_container/ptr_sequence_adapter.hpp	2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
@@ -161,6 +161,10 @@
           : base_type( a )
         { }
 
+        ptr_sequence_adapter( ptr_sequence_adapter&& o)
+            : base_type( static_cast<base_type&&>(o) )
+        { }
+
         template< class SizeType >
         ptr_sequence_adapter( SizeType n, 
                               ptr_container_detail::fixed_length_sequence_tag tag )
@@ -224,12 +228,19 @@
           : base_type( clone )
         { }
 
-        ptr_sequence_adapter& operator=( const ptr_sequence_adapter r )
+        ptr_sequence_adapter& operator=( const ptr_sequence_adapter& o )
         {
+            ptr_sequence_adapter r(o);
             this->swap( r );
             return *this; 
         }
-        
+
+        ptr_sequence_adapter& operator=( ptr_sequence_adapter&& r )
+        {
+            base_type::operator=( std::move(r) );
+            return *this;
+        }
+
         template< class PtrContainer >
         ptr_sequence_adapter& operator=( std::auto_ptr<PtrContainer> clone )    
         {
Modified: sandbox/boost0x/boost/utility/detail/result_of_iterate.hpp
==============================================================================
--- sandbox/boost0x/boost/utility/detail/result_of_iterate.hpp	(original)
+++ sandbox/boost0x/boost/utility/detail/result_of_iterate.hpp	2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
@@ -10,7 +10,7 @@
 # error Boost result_of - do not include this file!
 #endif
 
-#if defined(BOOST_HAS_DECLTYPE)
+#if defined(BOOST_HAS_DECLTYPE) && 0
 
 // As of N2588, C++0x result_of only supports function call
 // expressions of the form f(x). This precludes support for member
Modified: sandbox/boost0x/libs/ptr_container/test/Jamfile.v2
==============================================================================
--- sandbox/boost0x/libs/ptr_container/test/Jamfile.v2	(original)
+++ sandbox/boost0x/libs/ptr_container/test/Jamfile.v2	2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
@@ -39,5 +39,5 @@
     [ sc-test ptr_unordered_map ]        
     [ sc-test ptr_circular_buffer ]    
  #   [ sc-test null_filter_iterator ]    
-  
+    [ sc-test small ]
     ;
Modified: sandbox/boost0x/libs/ptr_container/test/ptr_map.cpp
==============================================================================
--- sandbox/boost0x/libs/ptr_container/test/ptr_map.cpp	(original)
+++ sandbox/boost0x/libs/ptr_container/test/ptr_map.cpp	2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
@@ -111,6 +111,15 @@
 
     BOOST_MESSAGE( "finished iterator test" );
 
+    C m1; m1.insert( a_key, new T );
+    C m2( std::move(m1) );
+    BOOST_CHECK_EQUAL( m1.size(), 0u );
+    BOOST_CHECK_EQUAL( m2.size(), 1u );
+    m1 = std::move(m2);
+    BOOST_CHECK_EQUAL( m1.size(), 1u );
+    BOOST_CHECK_EQUAL( m2.size(), 0u );
+    BOOST_MESSAGE( "finished moving test" );
+
     BOOST_DEDUCED_TYPENAME C::size_type s                 = c.size();
     BOOST_DEDUCED_TYPENAME C::size_type s2                = c.max_size();
     hide_warning(s2);
Modified: sandbox/boost0x/libs/ptr_container/test/sequence_test_data.hpp
==============================================================================
--- sandbox/boost0x/libs/ptr_container/test/sequence_test_data.hpp	(original)
+++ sandbox/boost0x/libs/ptr_container/test/sequence_test_data.hpp	2009-05-05 17:34:30 EDT (Tue, 05 May 2009)
@@ -56,7 +56,17 @@
     a_copy = a_copy;
     BOOST_CHECK( a_copy.empty() );
     BOOST_CHECK( !c.empty() );
-    BOOST_MESSAGE( "finished copying test" ); 
+    BOOST_MESSAGE( "finished copying test" );
+
+    C m1;
+    m1.push_back(new T);
+    C m2( std::move(m1) );
+    BOOST_CHECK_EQUAL( m1.size(), 0u );
+    BOOST_CHECK_EQUAL( m2.size(), 1u );
+    m1 = std::move(m2);
+    BOOST_CHECK_EQUAL( m1.size(), 1u );
+    BOOST_CHECK_EQUAL( m2.size(), 0u );
+    BOOST_MESSAGE( "finished moving test" );
 
     BOOST_DEDUCED_TYPENAME C::allocator_type alloc        = c.get_allocator();
     hide_warning(alloc);