$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r80330 - in trunk/libs/fusion/test: . sequence
From: joel_at_[hidden]
Date: 2012-08-31 10:32:10
Author: djowel
Date: 2012-08-31 10:32:08 EDT (Fri, 31 Aug 2012)
New Revision: 80330
URL: http://svn.boost.org/trac/boost/changeset/80330
Log:
Added move ctors for vector and deque (deque for gcc partially working for now)
Added:
   trunk/libs/fusion/test/sequence/deque_move.cpp   (contents, props changed)
   trunk/libs/fusion/test/sequence/move.hpp   (contents, props changed)
   trunk/libs/fusion/test/sequence/vector_move.cpp   (contents, props changed)
Text files modified: 
   trunk/libs/fusion/test/Jamfile                 |     1 +                                       
   trunk/libs/fusion/test/sequence/deque_copy.cpp |     2 +-                                      
   2 files changed, 2 insertions(+), 1 deletions(-)
Modified: trunk/libs/fusion/test/Jamfile
==============================================================================
--- trunk/libs/fusion/test/Jamfile	(original)
+++ trunk/libs/fusion/test/Jamfile	2012-08-31 10:32:08 EDT (Fri, 31 Aug 2012)
@@ -109,6 +109,7 @@
     [ run sequence/vector_iterator.cpp :  :  :  : ]
     [ run sequence/vector_make.cpp :  :  :  : ]
     [ run sequence/vector_misc.cpp :  :  :  : ]
+    [ run sequence/vector_move.cpp :  :  :  : ]
     [ run sequence/vector_mutate.cpp :  :  :  : ]
     [ run sequence/vector_n.cpp :  :  :  : ]
     [ run sequence/vector_tie.cpp :  :  :  : ]
Modified: trunk/libs/fusion/test/sequence/deque_copy.cpp
==============================================================================
--- trunk/libs/fusion/test/sequence/deque_copy.cpp	(original)
+++ trunk/libs/fusion/test/sequence/deque_copy.cpp	2012-08-31 10:32:08 EDT (Fri, 31 Aug 2012)
@@ -3,7 +3,7 @@
     Copyright (c) 2001-2011 Joel de Guzman
     Copyright (c) 2006 Dan Marsden
 
-    Distributed under the Boost Software License, Version 1.0. (See accompanying 
+    Distributed under 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)
 ==============================================================================*/
 #include <boost/fusion/container/deque/deque.hpp>
Added: trunk/libs/fusion/test/sequence/deque_move.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/fusion/test/sequence/deque_move.cpp	2012-08-31 10:32:08 EDT (Fri, 31 Aug 2012)
@@ -0,0 +1,32 @@
+/*=============================================================================
+    Copyright (c) 2012 Joel de Guzman
+
+    Distributed under 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)
+==============================================================================*/
+#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES // $$$ JDG temp $$$
+
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_RVALUE_REFERENCES)
+
+#include <boost/fusion/container/deque/deque.hpp>
+
+#define FUSION_SEQUENCE boost::fusion::deque
+#include "move.hpp"
+
+#else
+#include <boost/detail/lightweight_test.hpp>
+#endif
+
+int
+main()
+{
+#if !defined(BOOST_NO_RVALUE_REFERENCES)
+    test();
+#endif
+
+    return boost::report_errors();
+}
+
Added: trunk/libs/fusion/test/sequence/move.hpp
==============================================================================
--- (empty file)
+++ trunk/libs/fusion/test/sequence/move.hpp	2012-08-31 10:32:08 EDT (Fri, 31 Aug 2012)
@@ -0,0 +1,118 @@
+/*=============================================================================
+    Copyright (c) 2012 Joel de Guzman
+
+    Distributed under 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)
+==============================================================================*/
+#include <boost/config.hpp>
+
+#if defined(BOOST_NO_RVALUE_REFERENCES)
+#error "Valid only on compilers that support rvalues"
+#endif
+
+#include <boost/detail/lightweight_test.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/assert.hpp>
+#include <vector>
+
+
+namespace test_detail
+{
+    int copies = 0;
+
+    void incr_copy()
+    {
+        copies++;
+    }
+
+    struct x //: boost::noncopyable
+    {
+        int i;
+        x() : i(123) {}
+
+        x(x&& rhs) : i(rhs.i) {}
+
+        x& operator=(x&& rhs)
+        {
+            i = rhs.i;
+            return *this;
+        }
+
+        x(x const& rhs)
+        {
+            incr_copy();
+        }
+
+        x& operator=(x const& rhs)
+        {
+            incr_copy();
+            return *this;
+        }
+    };
+
+    typedef std::vector<x> vector_type;
+    extern bool disable_rvo; // to disable RVO
+
+    vector_type
+    generate_vec()
+    {
+        vector_type v;
+        v.push_back(x());
+        if (disable_rvo)
+            return v;
+        return vector_type();
+   }
+
+
+    template <typename T>
+    T move_me(T && val)
+    {
+        T r(std::move(val));
+        if (disable_rvo)
+            return r;
+        return T();
+    }
+
+    typedef FUSION_SEQUENCE<std::vector<x>> return_type;
+
+    return_type
+    generate()
+    {
+        return_type r(generate_vec());
+        if (disable_rvo)
+            return r;
+        return return_type();
+    }
+
+    typedef FUSION_SEQUENCE<std::vector<x>, x> return_type2;
+
+    return_type2
+    generate2()
+    {
+        return_type2 r(generate_vec(), x());
+        if (disable_rvo)
+            return r;
+        return return_type2();
+    }
+}
+
+void test()
+{
+    using namespace boost::fusion;
+    using namespace test_detail;
+
+    return_type v = move_me(generate());
+    BOOST_TEST(copies == 0);
+
+    return_type2 v2 = move_me(generate2());
+    BOOST_TEST(copies == 0);
+
+    std::cout << "Copies: " << copies << std::endl;
+}
+
+namespace test_detail
+{
+   bool disable_rvo = true;
+}
+
Added: trunk/libs/fusion/test/sequence/vector_move.cpp
==============================================================================
--- (empty file)
+++ trunk/libs/fusion/test/sequence/vector_move.cpp	2012-08-31 10:32:08 EDT (Fri, 31 Aug 2012)
@@ -0,0 +1,31 @@
+/*=============================================================================
+    Copyright (c) 2012 Joel de Guzman
+
+    Distributed under 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)
+==============================================================================*/
+#define BOOST_FUSION_DONT_USE_PREPROCESSED_FILES // $$$ JDG temp $$$
+
+#include <boost/config.hpp>
+
+#if !defined(BOOST_NO_RVALUE_REFERENCES)
+
+#include <boost/fusion/container/vector/vector.hpp>
+
+#define FUSION_SEQUENCE boost::fusion::vector
+#include "move.hpp"
+
+#else
+#include <boost/detail/lightweight_test.hpp>
+#endif
+
+int
+main()
+{
+#if !defined(BOOST_NO_RVALUE_REFERENCES)
+    test();
+#endif
+
+    return boost::report_errors();
+}
+