Chris@16: // Distributed under the Boost Software License, Version 1.0. (See Chris@16: // accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: // (C) Copyright 2007-8 Anthony Williams Chris@16: // (C) Copyright 2011-2012 Vicente J. Botet Escriba Chris@16: Chris@16: #ifndef BOOST_THREAD_MOVE_HPP Chris@16: #define BOOST_THREAD_MOVE_HPP Chris@16: Chris@16: #include Chris@16: #ifndef BOOST_NO_SFINAE Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: #include Chris@101: #include Chris@16: #endif Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@101: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@101: #include Chris@101: #endif Chris@16: namespace boost Chris@16: { Chris@16: Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct enable_move_utility_emulation_dummy_specialization; Chris@16: template Chris@16: struct thread_move_t Chris@16: { Chris@16: T& t; Chris@16: explicit thread_move_t(T& t_): Chris@16: t(t_) Chris@16: {} Chris@16: Chris@16: T& operator*() const Chris@16: { Chris@16: return t; Chris@16: } Chris@16: Chris@16: T* operator->() const Chris@16: { Chris@16: return &t; Chris@16: } Chris@16: private: Chris@16: void operator=(thread_move_t&); Chris@16: }; Chris@16: } Chris@16: Chris@16: #if !defined BOOST_THREAD_USES_MOVE Chris@16: Chris@16: #ifndef BOOST_NO_SFINAE Chris@16: template Chris@16: typename enable_if >, boost::detail::thread_move_t >::type move(T& t) Chris@16: { Chris@16: return boost::detail::thread_move_t(t); Chris@16: } Chris@16: #endif Chris@16: Chris@16: template Chris@16: boost::detail::thread_move_t move(boost::detail::thread_move_t t) Chris@16: { Chris@16: return t; Chris@16: } Chris@16: Chris@16: #endif //#if !defined BOOST_THREAD_USES_MOVE Chris@16: } Chris@16: Chris@16: #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: Chris@101: #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE) Chris@16: #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE) Chris@16: #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE) Chris@16: #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG Chris@16: #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END Chris@16: #define BOOST_THREAD_RV(V) V Chris@16: #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE Chris@16: #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE) Chris@16: #define BOOST_THREAD_DCL_MOVABLE(TYPE) Chris@16: #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ Chris@16: namespace detail { \ Chris@16: template \ Chris@16: struct enable_move_utility_emulation_dummy_specialization< Chris@16: Chris@16: #define BOOST_THREAD_DCL_MOVABLE_END > \ Chris@16: : integral_constant \ Chris@16: {}; \ Chris@16: } Chris@16: Chris@16: #elif ! defined BOOST_NO_CXX11_RVALUE_REFERENCES && defined BOOST_MSVC Chris@16: Chris@101: #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE) Chris@16: #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE) Chris@16: #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE) Chris@16: #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG Chris@16: #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END Chris@16: #define BOOST_THREAD_RV(V) V Chris@16: #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE Chris@16: #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE) Chris@16: #define BOOST_THREAD_DCL_MOVABLE(TYPE) Chris@16: #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ Chris@16: namespace detail { \ Chris@16: template \ Chris@16: struct enable_move_utility_emulation_dummy_specialization< Chris@16: Chris@16: #define BOOST_THREAD_DCL_MOVABLE_END > \ Chris@16: : integral_constant \ Chris@16: {}; \ Chris@16: } Chris@16: Chris@16: #else Chris@16: Chris@16: #if defined BOOST_THREAD_USES_MOVE Chris@101: #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE) Chris@16: #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE) Chris@16: #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE) Chris@16: #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG Chris@16: #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END Chris@16: #define BOOST_THREAD_RV(V) V Chris@16: #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE) Chris@16: #define BOOST_THREAD_DCL_MOVABLE(TYPE) Chris@16: #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ Chris@16: namespace detail { \ Chris@16: template \ Chris@16: struct enable_move_utility_emulation_dummy_specialization< Chris@16: Chris@16: #define BOOST_THREAD_DCL_MOVABLE_END > \ Chris@16: : integral_constant \ Chris@16: {}; \ Chris@16: } Chris@16: Chris@16: #else Chris@16: Chris@101: #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) const TYPE& Chris@16: #define BOOST_THREAD_RV_REF(TYPE) boost::detail::thread_move_t< TYPE > Chris@16: #define BOOST_THREAD_RV_REF_BEG boost::detail::thread_move_t< Chris@16: #define BOOST_THREAD_RV_REF_END > Chris@16: #define BOOST_THREAD_RV(V) (*V) Chris@16: #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE) Chris@16: Chris@16: #define BOOST_THREAD_DCL_MOVABLE(TYPE) \ Chris@16: template <> \ Chris@16: struct enable_move_utility_emulation< TYPE > \ Chris@16: { \ Chris@16: static const bool value = false; \ Chris@16: }; Chris@16: Chris@16: #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \ Chris@16: template \ Chris@16: struct enable_move_utility_emulation< Chris@16: Chris@16: #define BOOST_THREAD_DCL_MOVABLE_END > \ Chris@16: { \ Chris@16: static const bool value = false; \ Chris@16: }; Chris@16: Chris@16: #endif Chris@16: Chris@16: namespace boost Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: BOOST_THREAD_RV_REF(typename ::boost::remove_cv::type>::type) Chris@16: make_rv_ref(T v) BOOST_NOEXCEPT Chris@16: { Chris@16: return (BOOST_THREAD_RV_REF(typename ::boost::remove_cv::type>::type))(v); Chris@16: } Chris@16: // template Chris@16: // BOOST_THREAD_RV_REF(typename ::boost::remove_cv::type>::type) Chris@16: // make_rv_ref(T &v) BOOST_NOEXCEPT Chris@16: // { Chris@16: // return (BOOST_THREAD_RV_REF(typename ::boost::remove_cv::type>::type))(v); Chris@16: // } Chris@16: // template Chris@16: // const BOOST_THREAD_RV_REF(typename ::boost::remove_cv::type>::type) Chris@16: // make_rv_ref(T const&v) BOOST_NOEXCEPT Chris@16: // { Chris@16: // return (const BOOST_THREAD_RV_REF(typename ::boost::remove_cv::type>::type))(v); Chris@16: // } Chris@16: } Chris@16: } Chris@16: Chris@16: #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE.move() Chris@16: //#define BOOST_THREAD_MAKE_RV_REF(RVALUE) boost::detail::make_rv_ref(RVALUE) Chris@16: #endif Chris@16: Chris@16: Chris@16: #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: Chris@16: #define BOOST_THREAD_MOVABLE(TYPE) Chris@16: Chris@101: #define BOOST_THREAD_COPYABLE(TYPE) Chris@101: Chris@16: #else Chris@16: Chris@16: #if defined BOOST_THREAD_USES_MOVE Chris@16: Chris@16: #define BOOST_THREAD_MOVABLE(TYPE) \ Chris@16: ::boost::rv& move() BOOST_NOEXCEPT \ Chris@16: { \ Chris@16: return *static_cast< ::boost::rv* >(this); \ Chris@16: } \ Chris@16: const ::boost::rv& move() const BOOST_NOEXCEPT \ Chris@16: { \ Chris@16: return *static_cast* >(this); \ Chris@16: } \ Chris@16: operator ::boost::rv&() \ Chris@16: { \ Chris@16: return *static_cast< ::boost::rv* >(this); \ Chris@16: } \ Chris@16: operator const ::boost::rv&() const \ Chris@16: { \ Chris@16: return *static_cast* >(this); \ Chris@16: }\ Chris@16: Chris@101: #define BOOST_THREAD_COPYABLE(TYPE) \ Chris@101: TYPE& operator=(TYPE &t)\ Chris@101: { this->operator=(static_cast &>(const_cast(t))); return *this;} Chris@101: Chris@101: Chris@16: #else Chris@16: Chris@16: #define BOOST_THREAD_MOVABLE(TYPE) \ Chris@16: operator ::boost::detail::thread_move_t() BOOST_NOEXCEPT \ Chris@16: { \ Chris@16: return move(); \ Chris@16: } \ Chris@16: ::boost::detail::thread_move_t move() BOOST_NOEXCEPT \ Chris@16: { \ Chris@16: ::boost::detail::thread_move_t x(*this); \ Chris@16: return x; \ Chris@16: } \ Chris@16: Chris@101: #define BOOST_THREAD_COPYABLE(TYPE) Chris@101: Chris@16: #endif Chris@16: #endif Chris@16: Chris@16: #define BOOST_THREAD_MOVABLE_ONLY(TYPE) \ Chris@16: BOOST_THREAD_NO_COPYABLE(TYPE) \ Chris@16: BOOST_THREAD_MOVABLE(TYPE) \ Chris@101: typedef int boost_move_no_copy_constructor_or_assign; \ Chris@101: Chris@16: Chris@16: #define BOOST_THREAD_COPYABLE_AND_MOVABLE(TYPE) \ Chris@101: BOOST_THREAD_COPYABLE(TYPE) \ Chris@101: BOOST_THREAD_MOVABLE(TYPE) \ Chris@16: Chris@16: Chris@16: Chris@16: namespace boost Chris@101: { Chris@101: namespace thread_detail Chris@16: { Chris@101: Chris@101: #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES Chris@101: #elif defined BOOST_THREAD_USES_MOVE Chris@101: template Chris@101: struct is_rv Chris@101: : ::boost::move_detail::is_rv Chris@101: {}; Chris@101: Chris@101: #else Chris@101: template Chris@101: struct is_rv Chris@101: : ::boost::integral_constant Chris@101: {}; Chris@101: Chris@101: template Chris@101: struct is_rv< ::boost::detail::thread_move_t > Chris@101: : ::boost::integral_constant Chris@101: {}; Chris@101: Chris@101: template Chris@101: struct is_rv< const ::boost::detail::thread_move_t > Chris@101: : ::boost::integral_constant Chris@101: {}; Chris@101: #endif Chris@101: Chris@101: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@101: template Chris@101: struct remove_reference : boost::remove_reference {}; Chris@101: template Chris@101: struct decay : boost::decay {}; Chris@101: #else Chris@101: template Chris@101: struct remove_reference Chris@101: { Chris@101: typedef Tp type; Chris@101: }; Chris@101: template Chris@101: struct remove_reference Chris@101: { Chris@101: typedef Tp type; Chris@101: }; Chris@101: template Chris@101: struct remove_reference< rv > { Chris@101: typedef Tp type; Chris@101: }; Chris@101: Chris@101: template Chris@101: struct decay Chris@101: { Chris@101: private: Chris@101: typedef typename boost::move_detail::remove_rvalue_reference::type Up0; Chris@101: typedef typename boost::remove_reference::type Up; Chris@101: public: Chris@101: typedef typename conditional Chris@101: < Chris@101: is_array::value, Chris@101: typename remove_extent::type*, Chris@101: typename conditional Chris@101: < Chris@101: is_function::value, Chris@101: typename add_pointer::type, Chris@101: typename remove_cv::type Chris@101: >::type Chris@101: >::type type; Chris@101: }; Chris@101: #endif Chris@101: Chris@16: #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES Chris@16: template Chris@16: typename decay::type Chris@16: decay_copy(T&& t) Chris@16: { Chris@16: return boost::forward(t); Chris@16: } Chris@16: #else Chris@16: template Chris@16: typename decay::type Chris@16: decay_copy(BOOST_THREAD_FWD_REF(T) t) Chris@16: { Chris@16: return boost::forward(t); Chris@16: } Chris@16: #endif Chris@16: } Chris@16: } Chris@16: Chris@16: #include Chris@16: Chris@16: #endif