////////////////////////////////////////////////////////////////////////////// // // (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009. // (C) Copyright Ion Gaztanaga 2009-2014. // 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) // // See http://www.boost.org/libs/move for documentation. // ////////////////////////////////////////////////////////////////////////////// #include #include #include "../example/movable.hpp" #include "../example/copymovable.hpp" #include movable function(movable m) { return movable(boost::move(m)); } movable functionr(BOOST_RV_REF(movable) m) { return movable(boost::move(m)); } movable function2(movable m) { return boost::move(m); } BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m) { return boost::move(m); } movable move_return_function2 () { return movable(); } movable move_return_function () { movable m; return (boost::move(m)); } //Catch by value void function_value(movable) {} //Catch by reference void function_ref(const movable &) {} //Catch by reference void function_ref(BOOST_RV_REF(movable)) {} movable create_movable() { return movable(); } template struct factory { Type operator()() const { Type t; return BOOST_MOVE_RET(Type, t); } }; template struct factory { static Type t; Type &operator()() const { return BOOST_MOVE_RET(Type&, t); } }; template Type factory::t; template R factory_wrapper(F f) { // lock(); R r = f(); // unlock(); return BOOST_MOVE_RET(R, r); } int main() { #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) BOOST_STATIC_ASSERT((boost::has_nothrow_move::value == true)); BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled::value == false)); BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled::value == false)); BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled::value == false)); BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled::value == false)); BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled::value == false)); #endif { movable m; movable m2(boost::move(m)); movable m3(function(movable(boost::move(m2)))); movable m4(function(boost::move(m3))); (void)m;(void)m2;(void)m3;(void)m4; } { movable m; movable m2(boost::move(m)); movable m3(functionr(movable(boost::move(m2)))); movable m4(functionr(boost::move(m3))); (void)m;(void)m2;(void)m3;(void)m4; } { movable m; movable m2(boost::move(m)); movable m3(function2(movable(boost::move(m2)))); movable m4(function2(boost::move(m3))); (void)m;(void)m2;(void)m3;(void)m4; } { movable m; movable m2(boost::move(m)); movable m3(function2r(movable(boost::move(m2)))); movable m4(function2r(boost::move(m3))); (void)m;(void)m2;(void)m3;(void)m4; } { movable m; movable m2(boost::move(m)); movable m3(move_return_function()); (void)m;(void)m2;(void)m3; } { movable m; movable m2(boost::move(m)); movable m3(move_return_function2()); (void)m;(void)m2;(void)m3; } { //movable movable m (factory_wrapper(factory())); m = factory_wrapper(factory()); movable&mr(factory_wrapper(factory())); movable&mr2 = factory_wrapper(factory()); (void)mr; (void)mr2; (void)m; } { //copyable copyable c (factory_wrapper(factory())); c = factory_wrapper(factory()); copyable&cr(factory_wrapper(factory())); copyable&cr2 = factory_wrapper(factory()); (void)cr; (void)cr2; (void)c; } { //copy_movable copy_movable c (factory_wrapper(factory())); c = factory_wrapper(factory()); copy_movable&cr(factory_wrapper(factory())); copy_movable&cr2 = factory_wrapper(factory()); (void)cr; (void)cr2; (void)c; } return 0; } #include