1 // Distributed under the Boost Software License, Version 1.0. (See
2 // accompanying file LICENSE_1_0.txt or copy at
3 // http://www.boost.org/LICENSE_1_0.txt)
4 // (C) Copyright 2007-8 Anthony Williams
5 // (C) Copyright 2011-2012 Vicente J. Botet Escriba
7 #ifndef BOOST_THREAD_MOVE_HPP
8 #define BOOST_THREAD_MOVE_HPP
10 #include <boost/thread/detail/config.hpp>
11 #ifndef BOOST_NO_SFINAE
12 #include <boost/core/enable_if.hpp>
13 #include <boost/type_traits/is_convertible.hpp>
14 #include <boost/type_traits/remove_reference.hpp>
15 #include <boost/type_traits/remove_cv.hpp>
16 #include <boost/type_traits/decay.hpp>
17 #include <boost/type_traits/conditional.hpp>
18 #include <boost/type_traits/remove_extent.hpp>
19 #include <boost/type_traits/is_array.hpp>
20 #include <boost/type_traits/is_function.hpp>
21 #include <boost/type_traits/remove_cv.hpp>
22 #include <boost/type_traits/add_pointer.hpp>
23 #include <boost/type_traits/decay.hpp>
26 #include <boost/thread/detail/delete.hpp>
27 #include <boost/move/utility.hpp>
28 #include <boost/move/traits.hpp>
29 #include <boost/config/abi_prefix.hpp>
30 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
31 #include <type_traits>
39 struct enable_move_utility_emulation_dummy_specialization;
44 explicit thread_move_t(T& t_):
58 void operator=(thread_move_t&);
62 #if !defined BOOST_THREAD_USES_MOVE
64 #ifndef BOOST_NO_SFINAE
66 typename enable_if<boost::is_convertible<T&,boost::detail::thread_move_t<T> >, boost::detail::thread_move_t<T> >::type move(T& t)
68 return boost::detail::thread_move_t<T>(t);
73 boost::detail::thread_move_t<T> move(boost::detail::thread_move_t<T> t)
78 #endif //#if !defined BOOST_THREAD_USES_MOVE
81 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
83 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE)
84 #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE)
85 #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE)
86 #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG
87 #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END
88 #define BOOST_THREAD_RV(V) V
89 #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE
90 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
91 #define BOOST_THREAD_DCL_MOVABLE(TYPE)
92 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
94 template <typename T> \
95 struct enable_move_utility_emulation_dummy_specialization<
97 #define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
99 template <typename T1, typename T2> \
100 struct enable_move_utility_emulation_dummy_specialization<
102 #define BOOST_THREAD_DCL_MOVABLE_END > \
103 : integral_constant<bool, false> \
107 #elif ! defined BOOST_NO_CXX11_RVALUE_REFERENCES && defined BOOST_MSVC
109 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE)
110 #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE)
111 #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE)
112 #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG
113 #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END
114 #define BOOST_THREAD_RV(V) V
115 #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE
116 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
117 #define BOOST_THREAD_DCL_MOVABLE(TYPE)
118 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
120 template <typename T> \
121 struct enable_move_utility_emulation_dummy_specialization<
123 #define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
125 template <typename T1, typename T2> \
126 struct enable_move_utility_emulation_dummy_specialization<
128 #define BOOST_THREAD_DCL_MOVABLE_END > \
129 : integral_constant<bool, false> \
135 #if defined BOOST_THREAD_USES_MOVE
136 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE)
137 #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE)
138 #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE)
139 #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG
140 #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END
141 #define BOOST_THREAD_RV(V) V
142 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
143 #define BOOST_THREAD_DCL_MOVABLE(TYPE)
144 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
146 template <typename T> \
147 struct enable_move_utility_emulation_dummy_specialization<
149 #define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
151 template <typename T1, typename T2> \
152 struct enable_move_utility_emulation_dummy_specialization<
154 #define BOOST_THREAD_DCL_MOVABLE_END > \
155 : integral_constant<bool, false> \
161 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) const TYPE&
162 #define BOOST_THREAD_RV_REF(TYPE) boost::detail::thread_move_t< TYPE >
163 #define BOOST_THREAD_RV_REF_BEG boost::detail::thread_move_t<
164 #define BOOST_THREAD_RV_REF_END >
165 #define BOOST_THREAD_RV(V) (*V)
166 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
168 #define BOOST_THREAD_DCL_MOVABLE(TYPE) \
170 struct enable_move_utility_emulation< TYPE > \
172 static const bool value = false; \
175 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
176 template <typename T> \
177 struct enable_move_utility_emulation<
179 #define BOOST_THREAD_DCL_MOVABLE_BEG2(T1, T2) \
180 template <typename T1, typename T2> \
181 struct enable_move_utility_emulation<
183 #define BOOST_THREAD_DCL_MOVABLE_END > \
185 static const bool value = false; \
194 template <typename T>
195 BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type)
196 make_rv_ref(T v) BOOST_NOEXCEPT
198 return (BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type))(v);
200 // template <typename T>
201 // BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type)
202 // make_rv_ref(T &v) BOOST_NOEXCEPT
204 // return (BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type))(v);
206 // template <typename T>
207 // const BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type)
208 // make_rv_ref(T const&v) BOOST_NOEXCEPT
210 // return (const BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type))(v);
215 #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE.move()
216 //#define BOOST_THREAD_MAKE_RV_REF(RVALUE) boost::detail::make_rv_ref(RVALUE)
220 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
222 #define BOOST_THREAD_MOVABLE(TYPE)
224 #define BOOST_THREAD_COPYABLE(TYPE)
228 #if defined BOOST_THREAD_USES_MOVE
230 #define BOOST_THREAD_MOVABLE(TYPE) \
231 ::boost::rv<TYPE>& move() BOOST_NOEXCEPT \
233 return *static_cast< ::boost::rv<TYPE>* >(this); \
235 const ::boost::rv<TYPE>& move() const BOOST_NOEXCEPT \
237 return *static_cast<const ::boost::rv<TYPE>* >(this); \
239 operator ::boost::rv<TYPE>&() \
241 return *static_cast< ::boost::rv<TYPE>* >(this); \
243 operator const ::boost::rv<TYPE>&() const \
245 return *static_cast<const ::boost::rv<TYPE>* >(this); \
248 #define BOOST_THREAD_COPYABLE(TYPE) \
249 TYPE& operator=(TYPE &t)\
250 { this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;}
255 #define BOOST_THREAD_MOVABLE(TYPE) \
256 operator ::boost::detail::thread_move_t<TYPE>() BOOST_NOEXCEPT \
260 ::boost::detail::thread_move_t<TYPE> move() BOOST_NOEXCEPT \
262 ::boost::detail::thread_move_t<TYPE> x(*this); \
266 #define BOOST_THREAD_COPYABLE(TYPE)
271 #define BOOST_THREAD_MOVABLE_ONLY(TYPE) \
272 BOOST_THREAD_NO_COPYABLE(TYPE) \
273 BOOST_THREAD_MOVABLE(TYPE) \
274 typedef int boost_move_no_copy_constructor_or_assign; \
277 #define BOOST_THREAD_COPYABLE_AND_MOVABLE(TYPE) \
278 BOOST_THREAD_COPYABLE(TYPE) \
279 BOOST_THREAD_MOVABLE(TYPE) \
285 namespace thread_detail
288 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
289 #elif defined BOOST_THREAD_USES_MOVE
292 : ::boost::move_detail::is_rv<T>
298 : ::boost::integral_constant<bool, false>
302 struct is_rv< ::boost::detail::thread_move_t<T> >
303 : ::boost::integral_constant<bool, true>
307 struct is_rv< const ::boost::detail::thread_move_t<T> >
308 : ::boost::integral_constant<bool, true>
312 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
314 struct remove_reference : boost::remove_reference<Tp> {};
316 struct decay : boost::decay<Tp> {};
319 struct remove_reference
324 struct remove_reference<Tp&>
329 struct remove_reference< rv<Tp> > {
337 typedef typename boost::move_detail::remove_rvalue_reference<Tp>::type Up0;
338 typedef typename boost::remove_reference<Up0>::type Up;
340 typedef typename conditional
343 typename remove_extent<Up>::type*,
346 is_function<Up>::value,
347 typename add_pointer<Up>::type,
348 typename remove_cv<Up>::type
354 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
356 typename decay<T>::type
359 return boost::forward<T>(t);
363 typename decay<T>::type
364 decay_copy(BOOST_THREAD_FWD_REF(T) t)
366 return boost::forward<T>(t);
372 #include <boost/config/abi_suffix.hpp>