From 940c594d3e70b3e8319d5bbcd9d51a1d535b3b93 Mon Sep 17 00:00:00 2001 From: Joel de Guzman Date: Thu, 25 Oct 2012 02:06:04 +0000 Subject: [PATCH] Merge from trunk [SVN r81060] --- test/Jamfile | 6 ++ test/sequence/construction.hpp | 2 +- test/sequence/deque_move.cpp | 32 +++++++ test/sequence/move.hpp | 120 +++++++++++++++++++++++++++ test/sequence/tuple_construction.cpp | 2 +- test/sequence/vector_move.cpp | 31 +++++++ 6 files changed, 191 insertions(+), 2 deletions(-) create mode 100644 test/sequence/deque_move.cpp create mode 100644 test/sequence/move.hpp create mode 100644 test/sequence/vector_move.cpp diff --git a/test/Jamfile b/test/Jamfile index 3cea5ecf..7e464575 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -8,6 +8,10 @@ # bring in rules for testing import testing ; +project + : requirements + ; + { test-suite fusion : @@ -76,6 +80,7 @@ import testing ; [ run sequence/deque_iterator.cpp : : : : ] [ run sequence/deque_make.cpp : : : : ] [ run sequence/deque_misc.cpp : : : : ] + [ run sequence/deque_move.cpp : : : : ] [ run sequence/deque_mutate.cpp : : : : ] [ run sequence/deque_tie.cpp : : : : ] [ run sequence/deque_value_at.cpp : : : : ] @@ -109,6 +114,7 @@ import testing ; [ 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 : : : : ] diff --git a/test/sequence/construction.hpp b/test/sequence/construction.hpp index 380a9eed..57ba5301 100644 --- a/test/sequence/construction.hpp +++ b/test/sequence/construction.hpp @@ -57,7 +57,7 @@ test() FUSION_SEQUENCE<> empty0; -#ifndef TR1_TUPLE_TEST +#ifndef NO_CONSTRUCT_FROM_NIL FUSION_SEQUENCE<> empty1(empty); #endif diff --git a/test/sequence/deque_move.cpp b/test/sequence/deque_move.cpp new file mode 100644 index 00000000..42fda2d9 --- /dev/null +++ b/test/sequence/deque_move.cpp @@ -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 + +#if !defined(BOOST_NO_RVALUE_REFERENCES) + +#include + +#define FUSION_SEQUENCE boost::fusion::deque +#include "move.hpp" + +#else +#include +#endif + +int +main() +{ +#if !defined(BOOST_NO_RVALUE_REFERENCES) + test(); +#endif + + return boost::report_errors(); +} + diff --git a/test/sequence/move.hpp b/test/sequence/move.hpp new file mode 100644 index 00000000..b96a60e7 --- /dev/null +++ b/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 + +#if defined(BOOST_NO_RVALUE_REFERENCES) +#error "Valid only on compilers that support rvalues" +#endif + +#include +#include +#include +#include + + +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 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 + 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_SEQUENCE, 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); + + v2 = move_me(generate2()); + BOOST_TEST(copies == 0); + + std::cout << "Copies: " << copies << std::endl; +} + +namespace test_detail +{ + bool disable_rvo = true; +} + diff --git a/test/sequence/tuple_construction.cpp b/test/sequence/tuple_construction.cpp index b35233ab..044701c4 100644 --- a/test/sequence/tuple_construction.cpp +++ b/test/sequence/tuple_construction.cpp @@ -8,7 +8,7 @@ #include #include -#define TR1_TUPLE_TEST +#define NO_CONSTRUCT_FROM_NIL #define FUSION_SEQUENCE tuple #define FUSION_AT get #include "construction.hpp" diff --git a/test/sequence/vector_move.cpp b/test/sequence/vector_move.cpp new file mode 100644 index 00000000..70483f06 --- /dev/null +++ b/test/sequence/vector_move.cpp @@ -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 + +#if !defined(BOOST_NO_RVALUE_REFERENCES) + +#include + +#define FUSION_SEQUENCE boost::fusion::vector +#include "move.hpp" + +#else +#include +#endif + +int +main() +{ +#if !defined(BOOST_NO_RVALUE_REFERENCES) + test(); +#endif + + return boost::report_errors(); +} +