123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120 |
- /*=============================================================================
- 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_CXX11_RVALUE_REFERENCES)
- #error "Valid only on compilers that support rvalues"
- #endif
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/static_assert.hpp>
- #include <boost/assert.hpp>
- #include <vector>
- namespace test_detail
- {
- int copies = 0;
- void incr_copy()
- {
- copies++;
- }
- struct x
- {
- 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 return_type;
- return_type
- generate()
- {
- return_type r(generate_vec());
- if (disable_rvo)
- return r;
- return return_type();
- }
- typedef FUSION_SEQUENCE2 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);
- v2 = move_me(generate2());
- BOOST_TEST(copies == 0);
- std::cout << "Copies: " << copies << std::endl;
- }
- namespace test_detail
- {
- bool disable_rvo = true;
- }
|