move_helpers.hpp 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. //////////////////////////////////////////////////////////////////////////////
  2. //
  3. // (C) Copyright Ion Gaztanaga 2010-2012.
  4. // Distributed under the Boost Software License, Version 1.0.
  5. // (See accompanying file LICENSE_1_0.txt or copy at
  6. // http://www.boost.org/LICENSE_1_0.txt)
  7. //
  8. // See http://www.boost.org/libs/move for documentation.
  9. //
  10. //////////////////////////////////////////////////////////////////////////////
  11. #ifndef BOOST_MOVE_MOVE_HELPERS_HPP
  12. #define BOOST_MOVE_MOVE_HELPERS_HPP
  13. #include <boost/move/utility.hpp>
  14. #include <boost/type_traits/is_class.hpp>
  15. #include <boost/move/utility.hpp>
  16. #include <boost/move/traits.hpp>
  17. #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES) || (defined(_MSC_VER) && (_MSC_VER == 1600))
  18. #include <boost/type_traits/is_same.hpp>
  19. #include <boost/type_traits/is_class.hpp>
  20. #include <boost/type_traits/is_convertible.hpp>
  21. #include <boost/utility/enable_if.hpp>
  22. #endif
  23. #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  24. #include <boost/mpl/if.hpp>
  25. #endif
  26. #if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
  27. struct not_a_type;
  28. struct not_a_type2;
  29. #define BOOST_MOVE_CATCH_CONST(U) \
  30. typename ::boost::mpl::if_< ::boost::is_class<U>, BOOST_CATCH_CONST_RLVALUE(U), const U &>::type
  31. #define BOOST_MOVE_CATCH_RVALUE(U)\
  32. typename ::boost::mpl::if_< ::boost::is_class<U>, BOOST_RV_REF(U), not_a_type>::type
  33. #define BOOST_MOVE_CATCH_FWD(U) BOOST_FWD_REF(U)
  34. #else
  35. #define BOOST_MOVE_CATCH_CONST(U) const U &
  36. #define BOOST_MOVE_CATCH_RVALUE(U) U &&
  37. #define BOOST_MOVE_CATCH_FWD(U) U &&
  38. #endif
  39. #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
  40. #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
  41. RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
  42. { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
  43. \
  44. RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
  45. { return FWD_FUNCTION(::boost::move(x)); }\
  46. \
  47. RETURN_VALUE PUB_FUNCTION(TYPE &x)\
  48. { return FWD_FUNCTION(const_cast<const TYPE &>(x)); }\
  49. \
  50. template<class BOOST_MOVE_TEMPL_PARAM>\
  51. typename ::boost::enable_if_c\
  52. < ::boost::is_class<TYPE>::value &&\
  53. ::boost::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value &&\
  54. !::boost::has_move_emulation_enabled<BOOST_MOVE_TEMPL_PARAM>::value\
  55. , RETURN_VALUE >::type\
  56. PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
  57. { return FWD_FUNCTION(u); }\
  58. \
  59. template<class BOOST_MOVE_TEMPL_PARAM>\
  60. typename ::boost::enable_if_c\
  61. < (!::boost::is_class<BOOST_MOVE_TEMPL_PARAM>::value || \
  62. !::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>::value) && \
  63. !::boost::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value \
  64. , RETURN_VALUE >::type\
  65. PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
  66. {\
  67. TYPE t(u);\
  68. return FWD_FUNCTION(::boost::move(t));\
  69. }\
  70. //
  71. // ::boost::is_convertible<BOOST_MOVE_TEMPL_PARAM, TYPE>::value &&
  72. #elif (defined(_MSC_VER) && (_MSC_VER == 1600))
  73. #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
  74. RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
  75. { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
  76. \
  77. RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
  78. { return FWD_FUNCTION(::boost::move(x)); }\
  79. \
  80. template<class BOOST_MOVE_TEMPL_PARAM>\
  81. typename ::boost::enable_if_c\
  82. < !::boost::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value\
  83. , RETURN_VALUE >::type\
  84. PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
  85. {\
  86. TYPE t(u);\
  87. return FWD_FUNCTION(::boost::move(t));\
  88. }\
  89. //
  90. #else
  91. #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
  92. RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
  93. { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
  94. \
  95. RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
  96. { return FWD_FUNCTION(::boost::move(x)); }\
  97. //
  98. #endif
  99. #ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
  100. #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
  101. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
  102. { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
  103. \
  104. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
  105. { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
  106. \
  107. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, TYPE &x)\
  108. { return FWD_FUNCTION(arg1, const_cast<const TYPE &>(x)); }\
  109. \
  110. template<class BOOST_MOVE_TEMPL_PARAM>\
  111. typename ::boost::enable_if_c<\
  112. ::boost::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value &&\
  113. !::boost::has_move_emulation_enabled<BOOST_MOVE_TEMPL_PARAM>::value\
  114. , RETURN_VALUE >::type\
  115. PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
  116. { return FWD_FUNCTION(arg1, u); }\
  117. \
  118. template<class BOOST_MOVE_TEMPL_PARAM>\
  119. typename ::boost::enable_if_c<\
  120. !::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>::value && \
  121. !::boost::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value && \
  122. !::boost::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>::value \
  123. , RETURN_VALUE >::type\
  124. PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
  125. {\
  126. TYPE t(u);\
  127. return FWD_FUNCTION(arg1, ::boost::move(t));\
  128. }\
  129. //
  130. #elif (defined(_MSC_VER) && (_MSC_VER == 1600))
  131. #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
  132. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
  133. { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
  134. \
  135. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
  136. { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
  137. \
  138. template<class BOOST_MOVE_TEMPL_PARAM>\
  139. typename ::boost::enable_if_c\
  140. < !::boost::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value && \
  141. !::boost::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>::value \
  142. , RETURN_VALUE >::type\
  143. PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
  144. {\
  145. TYPE t(u);\
  146. return FWD_FUNCTION(arg1, ::boost::move(t));\
  147. }\
  148. //
  149. #else
  150. #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
  151. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
  152. { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
  153. \
  154. RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
  155. { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
  156. //
  157. #endif
  158. #endif //#ifndef BOOST_MOVE_MOVE_HELPERS_HPP