$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r56249 - trunk/boost/numeric/ublas
From: guwi17_at_[hidden]
Date: 2009-09-16 18:05:01
Author: guwi17
Date: 2009-09-16 18:05:00 EDT (Wed, 16 Sep 2009)
New Revision: 56249
URL: http://svn.boost.org/trac/boost/changeset/56249
Log:
see #3457
 * matrix.hpp: added move semantics
 * vector.hpp: added move semantics
Text files modified: 
   trunk/boost/numeric/ublas/matrix.hpp |    32 +++++++++++++++++++++++++++++++-        
   trunk/boost/numeric/ublas/vector.hpp |    32 +++++++++++++++++++++++++++++++-        
   2 files changed, 62 insertions(+), 2 deletions(-)
Modified: trunk/boost/numeric/ublas/matrix.hpp
==============================================================================
--- trunk/boost/numeric/ublas/matrix.hpp	(original)
+++ trunk/boost/numeric/ublas/matrix.hpp	2009-09-16 18:05:00 EDT (Wed, 16 Sep 2009)
@@ -180,6 +180,15 @@
         }
 
         // Assignment
+#ifdef BOOST_UBLAS_MOVE_SEMANTICS
+
+        /*! @note "pass by value" the key idea to enable move semantics */
+        BOOST_UBLAS_INLINE
+        matrix &operator = (matrix m) {
+            assign_temporary(m);
+            return *this;
+        }
+#else
         BOOST_UBLAS_INLINE
         matrix &operator = (const matrix &m) {
             size1_ = m.size1_;
@@ -187,6 +196,7 @@
             data () = m.data ();
             return *this;
         }
+#endif
         template<class C>          // Container assignment without temporary
         BOOST_UBLAS_INLINE
         matrix &operator = (const matrix_container<C> &m) {
@@ -1005,11 +1015,21 @@
         ~bounded_matrix () {}
 
         // Assignment
+#ifdef BOOST_UBLAS_MOVE_SEMANTICS
+
+        /*! @note "pass by value" the key idea to enable move semantics */
+        BOOST_UBLAS_INLINE
+        bounded_matrix &operator = (bounded_matrix m) {
+            matrix_type::operator = (m);
+            return *this;
+        }
+#else
         BOOST_UBLAS_INLINE
         bounded_matrix &operator = (const bounded_matrix &m) {
             matrix_type::operator = (m);
             return *this;
         }
+#endif
         template<class L2, class A2>        // Generic matrix assignment
         BOOST_UBLAS_INLINE
         bounded_matrix &operator = (const matrix<T, L2, A2> &m) {
@@ -3298,7 +3318,7 @@
             size1_ (m.size1_), size2_ (m.size2_) /* , data_ () */ {
             if (size1_ > N || size2_ > M)
                 bad_size ().raise ();
-            *this = m;
+            assign(m);
         }
         template<class AE>
         BOOST_UBLAS_INLINE
@@ -3382,6 +3402,15 @@
         }
 
         // Assignment
+#ifdef BOOST_UBLAS_MOVE_SEMANTICS
+
+        /*! @note "pass by value" the key idea to enable move semantics */
+        BOOST_UBLAS_INLINE
+        c_matrix &operator = (c_matrix m) {
+            assign_temporary(m);
+            return *this;
+        }
+#else
         BOOST_UBLAS_INLINE
         c_matrix &operator = (const c_matrix &m) {
             size1_ = m.size1_;
@@ -3390,6 +3419,7 @@
                 std::copy (m.data_ [i], m.data_ [i] + m.size2_, data_ [i]);
             return *this;
         }
+#endif
         template<class C>          // Container assignment without temporary
         BOOST_UBLAS_INLINE
         c_matrix &operator = (const matrix_container<C> &m) {
Modified: trunk/boost/numeric/ublas/vector.hpp
==============================================================================
--- trunk/boost/numeric/ublas/vector.hpp	(original)
+++ trunk/boost/numeric/ublas/vector.hpp	2009-09-16 18:05:00 EDT (Wed, 16 Sep 2009)
@@ -157,11 +157,21 @@
         }
 
         // Assignment
+#ifdef BOOST_UBLAS_MOVE_SEMANTICS
+
+        /*! @note "pass by value" the key idea to enable move semantics */
+        BOOST_UBLAS_INLINE
+        vector &operator = (vector v) {
+            assign_temporary(v);
+            return *this;
+        }
+#else
         BOOST_UBLAS_INLINE
         vector &operator = (const vector &v) {
             data () = v.data ();
             return *this;
         }
+#endif
         template<class C>          // Container assignment without temporary
         BOOST_UBLAS_INLINE
         vector &operator = (const vector_container<C> &v) {
@@ -550,11 +560,21 @@
         ~bounded_vector () {}
 
         // Assignment
+#ifdef BOOST_UBLAS_MOVE_SEMANTICS
+
+        /*! @note "pass by value" the key idea to enable move semantics */
+        BOOST_UBLAS_INLINE
+        bounded_vector &operator = (bounded_vector v) {
+            vector_type::operator = (v);
+            return *this;
+        }
+#else
         BOOST_UBLAS_INLINE
         bounded_vector &operator = (const bounded_vector &v) {
             vector_type::operator = (v);
             return *this;
         }
+#endif
         template<class A2>         // Generic vector assignment
         BOOST_UBLAS_INLINE
         bounded_vector &operator = (const vector<T, A2> &v) {
@@ -1276,7 +1296,7 @@
             size_ (v.size_) /* , data_ () */ {
             if (size_ > N)
                 bad_size ().raise ();
-            *this = v;
+            assign(v);
         }
         template<class AE>
         BOOST_UBLAS_INLINE
@@ -1359,12 +1379,22 @@
         }
 
         // Assignment
+#ifdef BOOST_UBLAS_MOVE_SEMANTICS
+
+        /*! @note "pass by value" the key idea to enable move semantics */
+        BOOST_UBLAS_INLINE
+        c_vector &operator = (c_vector v) {
+            assign_temporary(v);
+            return *this;
+        }
+#else
         BOOST_UBLAS_INLINE
         c_vector &operator = (const c_vector &v) {
             size_ = v.size_;
             std::copy (v.data_, v.data_ + v.size_, data_);
             return *this;
         }
+#endif
         template<class C>          // Container assignment without temporary
         BOOST_UBLAS_INLINE
         c_vector &operator = (const vector_container<C> &v) {