diff options
Diffstat (limited to 'boost/thread/detail/move.hpp')
-rw-r--r-- | boost/thread/detail/move.hpp | 155 |
1 files changed, 132 insertions, 23 deletions
diff --git a/boost/thread/detail/move.hpp b/boost/thread/detail/move.hpp index 748b8dc241..611557093e 100644 --- a/boost/thread/detail/move.hpp +++ b/boost/thread/detail/move.hpp @@ -9,24 +9,34 @@ #include <boost/thread/detail/config.hpp> #ifndef BOOST_NO_SFINAE -#include <boost/utility/enable_if.hpp> +#include <boost/core/enable_if.hpp> #include <boost/type_traits/is_convertible.hpp> #include <boost/type_traits/remove_reference.hpp> #include <boost/type_traits/remove_cv.hpp> #include <boost/type_traits/decay.hpp> +#include <boost/type_traits/conditional.hpp> +#include <boost/type_traits/remove_extent.hpp> +#include <boost/type_traits/is_array.hpp> +#include <boost/type_traits/is_function.hpp> +#include <boost/type_traits/remove_cv.hpp> +#include <boost/type_traits/add_pointer.hpp> +#include <boost/type_traits/decay.hpp> #endif #include <boost/thread/detail/delete.hpp> -#include <boost/move/move.hpp> +#include <boost/move/utility.hpp> +#include <boost/move/traits.hpp> #include <boost/config/abi_prefix.hpp> - +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES +#include <type_traits> +#endif namespace boost { namespace detail { template <typename T> - struct has_move_emulation_enabled_aux_dummy_specialization; + struct enable_move_utility_emulation_dummy_specialization; template<typename T> struct thread_move_t { @@ -49,6 +59,7 @@ namespace boost }; } +#if !defined BOOST_THREAD_USES_MOVE #ifndef BOOST_NO_SFINAE template<typename T> @@ -63,11 +74,15 @@ namespace boost { return t; } + +#endif //#if !defined BOOST_THREAD_USES_MOVE } -#if ! defined BOOST_NO_RVALUE_REFERENCES +#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES +#define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE) #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE) +#define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE) #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END #define BOOST_THREAD_RV(V) V @@ -77,16 +92,18 @@ namespace boost #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ namespace detail { \ template <typename T> \ - struct has_move_emulation_enabled_aux_dummy_specialization< + struct enable_move_utility_emulation_dummy_specialization< #define BOOST_THREAD_DCL_MOVABLE_END > \ - : integral_constant<bool, true> \ + : integral_constant<bool, false> \ {}; \ } -#elif ! defined BOOST_NO_RVALUE_REFERENCES && defined BOOST_MSVC +#elif ! defined BOOST_NO_CXX11_RVALUE_REFERENCES && defined BOOST_MSVC +#define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE) #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE) +#define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE) #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END #define BOOST_THREAD_RV(V) V @@ -96,17 +113,19 @@ namespace boost #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ namespace detail { \ template <typename T> \ - struct has_move_emulation_enabled_aux_dummy_specialization< + struct enable_move_utility_emulation_dummy_specialization< #define BOOST_THREAD_DCL_MOVABLE_END > \ - : integral_constant<bool, true> \ + : integral_constant<bool, false> \ {}; \ } #else #if defined BOOST_THREAD_USES_MOVE +#define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE) #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE) +#define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE) #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END #define BOOST_THREAD_RV(V) V @@ -115,15 +134,16 @@ namespace boost #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ namespace detail { \ template <typename T> \ - struct has_move_emulation_enabled_aux_dummy_specialization< + struct enable_move_utility_emulation_dummy_specialization< #define BOOST_THREAD_DCL_MOVABLE_END > \ - : integral_constant<bool, true> \ + : integral_constant<bool, false> \ {}; \ } #else +#define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) const TYPE& #define BOOST_THREAD_RV_REF(TYPE) boost::detail::thread_move_t< TYPE > #define BOOST_THREAD_RV_REF_BEG boost::detail::thread_move_t< #define BOOST_THREAD_RV_REF_END > @@ -132,17 +152,19 @@ namespace boost #define BOOST_THREAD_DCL_MOVABLE(TYPE) \ template <> \ -struct has_move_emulation_enabled_aux< TYPE > \ - : BOOST_MOVE_BOOST_NS::integral_constant<bool, true> \ -{}; +struct enable_move_utility_emulation< TYPE > \ +{ \ + static const bool value = false; \ +}; #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ template <typename T> \ -struct has_move_emulation_enabled_aux< +struct enable_move_utility_emulation< #define BOOST_THREAD_DCL_MOVABLE_END > \ - : BOOST_MOVE_BOOST_NS::integral_constant<bool, true> \ -{}; +{ \ + static const bool value = false; \ +}; #endif @@ -176,10 +198,12 @@ namespace detail #endif -#if ! defined BOOST_NO_RVALUE_REFERENCES +#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES #define BOOST_THREAD_MOVABLE(TYPE) +#define BOOST_THREAD_COPYABLE(TYPE) + #else #if defined BOOST_THREAD_USES_MOVE @@ -202,6 +226,11 @@ namespace detail return *static_cast<const ::boost::rv<TYPE>* >(this); \ }\ +#define BOOST_THREAD_COPYABLE(TYPE) \ + TYPE& operator=(TYPE &t)\ + { this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;} + + #else #define BOOST_THREAD_MOVABLE(TYPE) \ @@ -215,31 +244,111 @@ namespace detail return x; \ } \ +#define BOOST_THREAD_COPYABLE(TYPE) + #endif #endif #define BOOST_THREAD_MOVABLE_ONLY(TYPE) \ BOOST_THREAD_NO_COPYABLE(TYPE) \ BOOST_THREAD_MOVABLE(TYPE) \ + typedef int boost_move_no_copy_constructor_or_assign; \ + #define BOOST_THREAD_COPYABLE_AND_MOVABLE(TYPE) \ - BOOST_THREAD_MOVABLE(TYPE) \ + BOOST_THREAD_COPYABLE(TYPE) \ + BOOST_THREAD_MOVABLE(TYPE) \ -#ifndef BOOST_NO_RVALUE_REFERENCES namespace boost -{ namespace thread_detail +{ + namespace thread_detail + { + +#if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES +#elif defined BOOST_THREAD_USES_MOVE + template <class T> + struct is_rv + : ::boost::move_detail::is_rv<T> + {}; + +#else + template <class T> + struct is_rv + : ::boost::integral_constant<bool, false> + {}; + + template <class T> + struct is_rv< ::boost::detail::thread_move_t<T> > + : ::boost::integral_constant<bool, true> + {}; + + template <class T> + struct is_rv< const ::boost::detail::thread_move_t<T> > + : ::boost::integral_constant<bool, true> + {}; +#endif + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES + template <class Tp> + struct remove_reference : boost::remove_reference<Tp> {}; + template <class Tp> + struct decay : boost::decay<Tp> {}; +#else + template <class Tp> + struct remove_reference + { + typedef Tp type; + }; + template <class Tp> + struct remove_reference<Tp&> + { + typedef Tp type; + }; + template <class Tp> + struct remove_reference< rv<Tp> > { + typedef Tp type; + }; + + template <class Tp> + struct decay { + private: + typedef typename boost::move_detail::remove_rvalue_reference<Tp>::type Up0; + typedef typename boost::remove_reference<Up0>::type Up; + public: + typedef typename conditional + < + is_array<Up>::value, + typename remove_extent<Up>::type*, + typename conditional + < + is_function<Up>::value, + typename add_pointer<Up>::type, + typename remove_cv<Up>::type + >::type + >::type type; + }; +#endif + +#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES template <class T> typename decay<T>::type decay_copy(T&& t) { return boost::forward<T>(t); } +#else + template <class T> + typename decay<T>::type + decay_copy(BOOST_THREAD_FWD_REF(T) t) + { + return boost::forward<T>(t); } -} #endif + } +} #include <boost/config/abi_suffix.hpp> |