diff options
Diffstat (limited to 'libs/fusion/test/sequence/move.hpp')
-rw-r--r-- | libs/fusion/test/sequence/move.hpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/libs/fusion/test/sequence/move.hpp b/libs/fusion/test/sequence/move.hpp new file mode 100644 index 0000000000..febbc2bbaf --- /dev/null +++ b/libs/fusion/test/sequence/move.hpp @@ -0,0 +1,120 @@ +/*============================================================================= + 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; +} + |