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