Boost logo

Boost-Commit :

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();
+}
+


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