move.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  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. movable function(movable m)
  18. {
  19. return movable(boost::move(m));
  20. }
  21. movable functionr(BOOST_RV_REF(movable) m)
  22. {
  23. return movable(boost::move(m));
  24. }
  25. movable function2(movable m)
  26. {
  27. return boost::move(m);
  28. }
  29. BOOST_RV_REF(movable) function2r(BOOST_RV_REF(movable) m)
  30. {
  31. return boost::move(m);
  32. }
  33. movable move_return_function2 ()
  34. {
  35. return movable();
  36. }
  37. movable move_return_function ()
  38. {
  39. movable m;
  40. return (boost::move(m));
  41. }
  42. //Catch by value
  43. void function_value(movable)
  44. {}
  45. //Catch by reference
  46. void function_ref(const movable &)
  47. {}
  48. //Catch by reference
  49. void function_ref(BOOST_RV_REF(movable))
  50. {}
  51. movable create_movable()
  52. { return movable(); }
  53. template<class Type>
  54. struct factory
  55. {
  56. Type operator()() const
  57. {
  58. Type t;
  59. return BOOST_MOVE_RET(Type, t);
  60. }
  61. };
  62. template<class Type>
  63. struct factory<Type &>
  64. {
  65. static Type t;
  66. Type &operator()() const
  67. {
  68. return BOOST_MOVE_RET(Type&, t);
  69. }
  70. };
  71. template<class Type>
  72. Type factory<Type&>::t;
  73. template <class R, class F>
  74. R factory_wrapper(F f)
  75. {
  76. // lock();
  77. R r = f();
  78. // unlock();
  79. return BOOST_MOVE_RET(R, r);
  80. }
  81. int main()
  82. {
  83. #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  84. BOOST_STATIC_ASSERT((boost::has_nothrow_move<movable>::value == true));
  85. BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable>::value == false));
  86. BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<copyable*>::value == false));
  87. BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int>::value == false));
  88. BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int&>::value == false));
  89. BOOST_STATIC_ASSERT((boost::has_move_emulation_enabled<int*>::value == false));
  90. #endif
  91. {
  92. movable m;
  93. movable m2(boost::move(m));
  94. movable m3(function(movable(boost::move(m2))));
  95. movable m4(function(boost::move(m3)));
  96. (void)m;(void)m2;(void)m3;(void)m4;
  97. }
  98. {
  99. movable m;
  100. movable m2(boost::move(m));
  101. movable m3(functionr(movable(boost::move(m2))));
  102. movable m4(functionr(boost::move(m3)));
  103. (void)m;(void)m2;(void)m3;(void)m4;
  104. }
  105. {
  106. movable m;
  107. movable m2(boost::move(m));
  108. movable m3(function2(movable(boost::move(m2))));
  109. movable m4(function2(boost::move(m3)));
  110. (void)m;(void)m2;(void)m3;(void)m4;
  111. }
  112. {
  113. movable m;
  114. movable m2(boost::move(m));
  115. movable m3(function2r(movable(boost::move(m2))));
  116. movable m4(function2r(boost::move(m3)));
  117. (void)m;(void)m2;(void)m3;(void)m4;
  118. }
  119. {
  120. movable m;
  121. movable m2(boost::move(m));
  122. movable m3(move_return_function());
  123. (void)m;(void)m2;(void)m3;
  124. }
  125. {
  126. movable m;
  127. movable m2(boost::move(m));
  128. movable m3(move_return_function2());
  129. (void)m;(void)m2;(void)m3;
  130. }
  131. {
  132. //movable
  133. movable m (factory_wrapper<movable>(factory<movable>()));
  134. m = factory_wrapper<movable>(factory<movable>());
  135. movable&mr(factory_wrapper<movable&>(factory<movable&>()));
  136. movable&mr2 = factory_wrapper<movable&>(factory<movable&>());
  137. (void)mr;
  138. (void)mr2;
  139. (void)m;
  140. }
  141. {
  142. //copyable
  143. copyable c (factory_wrapper<copyable>(factory<copyable>()));
  144. c = factory_wrapper<copyable>(factory<copyable>());
  145. copyable&cr(factory_wrapper<copyable&>(factory<copyable&>()));
  146. copyable&cr2 = factory_wrapper<copyable&>(factory<copyable&>());
  147. (void)cr;
  148. (void)cr2;
  149. (void)c;
  150. }
  151. {
  152. //copy_movable
  153. copy_movable c (factory_wrapper<copy_movable>(factory<copy_movable>()));
  154. c = factory_wrapper<copy_movable>(factory<copy_movable>());
  155. copy_movable&cr(factory_wrapper<copy_movable&>(factory<copy_movable&>()));
  156. copy_movable&cr2 = factory_wrapper<copy_movable&>(factory<copy_movable&>());
  157. (void)cr;
  158. (void)cr2;
  159. (void)c;
  160. }
  161. return 0;
  162. }
  163. #include <boost/move/detail/config_end.hpp>