1 ////////////////////////////////////////////////////////////////////////////// 2 // 3 // (C) Copyright David Abrahams, Vicente Botet, Ion Gaztanaga 2009. 4 // (C) Copyright Ion Gaztanaga 2009-2014. 5 // Distributed under the Boost Software License, Version 1.0. 6 // (See accompanying file LICENSE_1_0.txt or copy at 7 // http://www.boost.org/LICENSE_1_0.txt) 8 // 9 // See http://www.boost.org/libs/move for documentation. 10 // 11 ////////////////////////////////////////////////////////////////////////////// 12 #include <boost/move/detail/config_begin.hpp> 13 #include <boost/move/utility_core.hpp> 14 #include "../example/movable.hpp" 15 #include "../example/copymovable.hpp" 16 #include <boost/static_assert.hpp> 17 function(movable m)18movable function(movable m) 19 { 20 return movable(boost::move(m)); 21 } 22 functionr(BOOST_RV_REF (movable)m)23movable functionr(BOOST_RV_REF(movable) m) 24 { 25 return movable(boost::move(m)); 26 } 27 function2(movable m)28movable function2(movable m) 29 { 30 return boost::move(m); 31 } 32 function2r(BOOST_RV_REF (movable)m)33BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m) 34 { 35 return boost::move(m); 36 } 37 move_return_function2()38movable move_return_function2 () 39 { 40 return movable(); 41 } 42 move_return_function()43movable move_return_function () 44 { 45 movable m; 46 return (boost::move(m)); 47 } 48 49 50 //Catch by value function_value(movable)51void function_value(movable) 52 {} 53 54 //Catch by reference function_ref(const movable &)55void function_ref(const movable &) 56 {} 57 58 //Catch by reference function_ref(BOOST_RV_REF (movable))59void function_ref(BOOST_RV_REF(movable)) 60 {} 61 create_movable()62movable create_movable() 63 { return movable(); } 64 65 template<class Type> 66 struct factory 67 { operator ()factory68 Type operator()() const 69 { 70 Type t; 71 return BOOST_MOVE_RET(Type, t); 72 } 73 }; 74 75 template<class Type> 76 struct factory<Type &> 77 { 78 static Type t; operator ()factory79 Type &operator()() const 80 { 81 return BOOST_MOVE_RET(Type&, t); 82 } 83 }; 84 85 template<class Type> 86 Type factory<Type&>::t; 87 88 template <class R, class F> factory_wrapper(F f)89R factory_wrapper(F f) 90 { 91 // lock(); 92 R r = f(); 93 // unlock(); 94 return BOOST_MOVE_RET(R, r); 95 } 96 main()97int main() 98 { 99 #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) 100 BOOST_STATIC_ASSERT((boost::has_nothrow_move<movable>::value == true)); 101 BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable>::value == false)); 102 BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable*>::value == false)); 103 BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int>::value == false)); 104 BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int&>::value == false)); 105 BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int*>::value == false)); 106 #endif 107 108 { 109 movable m; 110 movable m2(boost::move(m)); 111 movable m3(function(movable(boost::move(m2)))); 112 movable m4(function(boost::move(m3))); 113 (void)m;(void)m2;(void)m3;(void)m4; 114 } 115 { 116 movable m; 117 movable m2(boost::move(m)); 118 movable m3(functionr(movable(boost::move(m2)))); 119 movable m4(functionr(boost::move(m3))); 120 (void)m;(void)m2;(void)m3;(void)m4; 121 } 122 { 123 movable m; 124 movable m2(boost::move(m)); 125 movable m3(function2(movable(boost::move(m2)))); 126 movable m4(function2(boost::move(m3))); 127 (void)m;(void)m2;(void)m3;(void)m4; 128 } 129 { 130 movable m; 131 movable m2(boost::move(m)); 132 movable m3(function2r(movable(boost::move(m2)))); 133 movable m4(function2r(boost::move(m3))); 134 (void)m;(void)m2;(void)m3;(void)m4; 135 } 136 { 137 movable m; 138 movable m2(boost::move(m)); 139 movable m3(move_return_function()); 140 (void)m;(void)m2;(void)m3; 141 } 142 { 143 movable m; 144 movable m2(boost::move(m)); 145 movable m3(move_return_function2()); 146 (void)m;(void)m2;(void)m3; 147 } 148 { 149 //movable 150 movable m (factory_wrapper<movable>(factory<movable>())); 151 m = factory_wrapper<movable>(factory<movable>()); 152 movable&mr(factory_wrapper<movable&>(factory<movable&>())); 153 movable&mr2 = factory_wrapper<movable&>(factory<movable&>()); 154 (void)mr; 155 (void)mr2; 156 (void)m; 157 } 158 { 159 //copyable 160 copyable c (factory_wrapper<copyable>(factory<copyable>())); 161 c = factory_wrapper<copyable>(factory<copyable>()); 162 copyable&cr(factory_wrapper<copyable&>(factory<copyable&>())); 163 copyable&cr2 = factory_wrapper<copyable&>(factory<copyable&>()); 164 (void)cr; 165 (void)cr2; 166 (void)c; 167 } 168 169 { 170 //copy_movable 171 copy_movable c (factory_wrapper<copy_movable>(factory<copy_movable>())); 172 c = factory_wrapper<copy_movable>(factory<copy_movable>()); 173 copy_movable&cr(factory_wrapper<copy_movable&>(factory<copy_movable&>())); 174 copy_movable&cr2 = factory_wrapper<copy_movable&>(factory<copy_movable&>()); 175 (void)cr; 176 (void)cr2; 177 (void)c; 178 } 179 180 return 0; 181 } 182 183 #include <boost/move/detail/config_end.hpp> 184