summaryrefslogtreecommitdiff
path: root/boost/move/detail/move_helpers.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/move/detail/move_helpers.hpp')
-rw-r--r--boost/move/detail/move_helpers.hpp322
1 files changed, 198 insertions, 124 deletions
diff --git a/boost/move/detail/move_helpers.hpp b/boost/move/detail/move_helpers.hpp
index e3b8883159..7b62e26994 100644
--- a/boost/move/detail/move_helpers.hpp
+++ b/boost/move/detail/move_helpers.hpp
@@ -26,9 +26,9 @@
#if defined(BOOST_NO_CXX11_RVALUE_REFERENCES)
#define BOOST_MOVE_CATCH_CONST(U) \
- typename ::boost::move_detail::if_< ::boost::move_detail::is_class_or_union<U>, BOOST_CATCH_CONST_RLVALUE(U), const U &>::type
+ typename ::boost::move_detail::if_< ::boost::move_detail::is_class<U>, BOOST_CATCH_CONST_RLVALUE(U), const U &>::type
#define BOOST_MOVE_CATCH_RVALUE(U)\
- typename ::boost::move_detail::if_< ::boost::move_detail::is_class_or_union<U>, BOOST_RV_REF(U), ::boost::move_detail::nat>::type
+ typename ::boost::move_detail::if_< ::boost::move_detail::is_class<U>, BOOST_RV_REF(U), ::boost::move_detail::nat>::type
#define BOOST_MOVE_CATCH_FWD(U) BOOST_FWD_REF(U)
#else
#define BOOST_MOVE_CATCH_CONST(U) const U &
@@ -36,142 +36,216 @@
#define BOOST_MOVE_CATCH_FWD(U) U &&
#endif
-#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(::boost::move(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(TYPE &x)\
- { return FWD_FUNCTION(const_cast<const TYPE &>(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::enable_if_and\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::move_detail::is_class_or_union<TYPE>\
- , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
- >::type\
- PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
- { return FWD_FUNCTION(u); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::disable_if_or\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
- , ::boost::move_detail::and_ \
- < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
- , ::boost::move_detail::is_class_or_union<BOOST_MOVE_TEMPL_PARAM> \
- > \
- >::type\
- PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(::boost::move(t));\
- }\
+////////////////////////////////////////
+//
+// BOOST_MOVE_CONVERSION_AWARE_CATCH
//
+////////////////////////////////////////
+#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(::boost::move(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(TYPE &x)\
+ { return FWD_FUNCTION(const_cast<const TYPE &>(x)); }\
+ //
+ #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::enable_if_and\
+ < ::boost::move_detail::nat \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_class<TYPE>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type* = 0)\
+ { return FWD_FUNCTION(u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::disable_if_or\
+ < ::boost::move_detail::nat \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::and_ \
+ < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::is_class<BOOST_MOVE_TEMPL_PARAM> \
+ > \
+ >::type* = 0)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(::boost::move(t));\
+ }\
+ //
+ #else
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::enable_if_and\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_class<TYPE>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type\
+ PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+ { return FWD_FUNCTION(u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::disable_if_or\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::and_ \
+ < ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::is_class<BOOST_MOVE_TEMPL_PARAM> \
+ > \
+ >::type\
+ PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(::boost::move(t));\
+ }\
+ //
+ #endif
#elif (defined(_MSC_VER) && (_MSC_VER == 1600))
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(::boost::move(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::enable_if_c\
- < !::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value\
- , RETURN_VALUE >::type\
- PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(::boost::move(t));\
- }\
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(::boost::move(x)); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::enable_if_c\
+ < !::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>::value\
+ , RETURN_VALUE >::type\
+ PUB_FUNCTION(const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(::boost::move(t));\
+ }\
+ //
+
+#else //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(::boost::move(x)); }\
+ //
+
+#endif //BOOST_NO_CXX11_RVALUE_REFERENCES
+
+////////////////////////////////////////
//
-
-#else
-
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION)\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(::boost::move(x)); }\
+// BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG
//
-
-#endif
-
+////////////////////////////////////////
#ifdef BOOST_NO_CXX11_RVALUE_REFERENCES
-
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, TYPE &x)\
- { return FWD_FUNCTION(arg1, const_cast<const TYPE &>(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::enable_if_and\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
- >::type\
- PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
- { return FWD_FUNCTION(arg1, u); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::disable_if_or\
- < RETURN_VALUE \
- , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
- , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
- >::type\
- PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(arg1, ::boost::move(t));\
- }\
-//
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, TYPE &x)\
+ { return FWD_FUNCTION(arg1, const_cast<const TYPE &>(x)); }\
+ //
+ #if defined(BOOST_MOVE_HELPERS_RETURN_SFINAE_BROKEN)
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::enable_if_and\
+ < ::boost::move_detail::nat \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type* = 0)\
+ { return FWD_FUNCTION(arg1, u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u,\
+ typename ::boost::move_detail::disable_if_or\
+ < void \
+ , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
+ >::type* = 0)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(arg1, ::boost::move(t));\
+ }\
+ //
+ #else
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG_COMMON(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::enable_if_and\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::has_move_emulation_disabled<BOOST_MOVE_TEMPL_PARAM>\
+ >::type\
+ PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+ { return FWD_FUNCTION(arg1, u); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::disable_if_or\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_rv<BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM>\
+ , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO>\
+ >::type\
+ PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(arg1, ::boost::move(t));\
+ }\
+ //
+ #endif
#elif (defined(_MSC_VER) && (_MSC_VER == 1600))
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
-\
- template<class BOOST_MOVE_TEMPL_PARAM>\
- typename ::boost::move_detail::disable_if_or\
- < RETURN_VALUE \
- , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
- , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO> \
- >::type\
- PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
- {\
- TYPE t(u);\
- return FWD_FUNCTION(arg1, ::boost::move(t));\
- }\
-//
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
+ \
+ template<class BOOST_MOVE_TEMPL_PARAM>\
+ typename ::boost::move_detail::disable_if_or\
+ < RETURN_VALUE \
+ , ::boost::move_detail::is_same<TYPE, BOOST_MOVE_TEMPL_PARAM> \
+ , ::boost::move_detail::is_convertible<BOOST_MOVE_TEMPL_PARAM, UNLESS_CONVERTIBLE_TO> \
+ >::type\
+ PUB_FUNCTION(ARG1 arg1, const BOOST_MOVE_TEMPL_PARAM &u)\
+ {\
+ TYPE t(u);\
+ return FWD_FUNCTION(arg1, ::boost::move(t));\
+ }\
+ //
#else
-#define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
- { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
-\
- RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
- { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
-//
+ #define BOOST_MOVE_CONVERSION_AWARE_CATCH_1ARG(PUB_FUNCTION, TYPE, RETURN_VALUE, FWD_FUNCTION, ARG1, UNLESS_CONVERTIBLE_TO)\
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_CONST(TYPE) x)\
+ { return FWD_FUNCTION(arg1, static_cast<const TYPE&>(x)); }\
+ \
+ RETURN_VALUE PUB_FUNCTION(ARG1 arg1, BOOST_MOVE_CATCH_RVALUE(TYPE) x) \
+ { return FWD_FUNCTION(arg1, ::boost::move(x)); }\
+ //
#endif