Added move ctors for vector and deque (deque for gcc partially working for now)

[SVN r80330]
This commit is contained in:
Joel de Guzman
2012-08-31 14:32:08 +00:00
parent 038976991e
commit 16de1dcd01
5 changed files with 183 additions and 1 deletions

View File

@ -109,6 +109,7 @@ import testing ;
[ run sequence/vector_iterator.cpp : : : : ] [ run sequence/vector_iterator.cpp : : : : ]
[ run sequence/vector_make.cpp : : : : ] [ run sequence/vector_make.cpp : : : : ]
[ run sequence/vector_misc.cpp : : : : ] [ run sequence/vector_misc.cpp : : : : ]
[ run sequence/vector_move.cpp : : : : ]
[ run sequence/vector_mutate.cpp : : : : ] [ run sequence/vector_mutate.cpp : : : : ]
[ run sequence/vector_n.cpp : : : : ] [ run sequence/vector_n.cpp : : : : ]
[ run sequence/vector_tie.cpp : : : : ] [ run sequence/vector_tie.cpp : : : : ]

View File

@ -3,7 +3,7 @@
Copyright (c) 2001-2011 Joel de Guzman Copyright (c) 2001-2011 Joel de Guzman
Copyright (c) 2006 Dan Marsden 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) file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/ ==============================================================================*/
#include <boost/fusion/container/deque/deque.hpp> #include <boost/fusion/container/deque/deque.hpp>

View File

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

118
test/sequence/move.hpp Normal file
View File

@ -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;
}

View File

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