annotate DEPENDENCIES/generic/include/boost/thread/detail/move.hpp @ 133:4acb5d8d80b6 tip

Don't fail environmental check if README.md exists (but .txt and no-suffix don't)
author Chris Cannam
date Tue, 30 Jul 2019 12:25:44 +0100
parents c530137014c0
children
rev   line source
Chris@16 1 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 2 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 3 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 4 // (C) Copyright 2007-8 Anthony Williams
Chris@16 5 // (C) Copyright 2011-2012 Vicente J. Botet Escriba
Chris@16 6
Chris@16 7 #ifndef BOOST_THREAD_MOVE_HPP
Chris@16 8 #define BOOST_THREAD_MOVE_HPP
Chris@16 9
Chris@16 10 #include <boost/thread/detail/config.hpp>
Chris@16 11 #ifndef BOOST_NO_SFINAE
Chris@101 12 #include <boost/core/enable_if.hpp>
Chris@16 13 #include <boost/type_traits/is_convertible.hpp>
Chris@16 14 #include <boost/type_traits/remove_reference.hpp>
Chris@16 15 #include <boost/type_traits/remove_cv.hpp>
Chris@16 16 #include <boost/type_traits/decay.hpp>
Chris@101 17 #include <boost/type_traits/conditional.hpp>
Chris@101 18 #include <boost/type_traits/remove_extent.hpp>
Chris@101 19 #include <boost/type_traits/is_array.hpp>
Chris@101 20 #include <boost/type_traits/is_function.hpp>
Chris@101 21 #include <boost/type_traits/remove_cv.hpp>
Chris@101 22 #include <boost/type_traits/add_pointer.hpp>
Chris@101 23 #include <boost/type_traits/decay.hpp>
Chris@16 24 #endif
Chris@16 25
Chris@16 26 #include <boost/thread/detail/delete.hpp>
Chris@16 27 #include <boost/move/utility.hpp>
Chris@16 28 #include <boost/move/traits.hpp>
Chris@16 29 #include <boost/config/abi_prefix.hpp>
Chris@101 30 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@101 31 #include <type_traits>
Chris@101 32 #endif
Chris@16 33 namespace boost
Chris@16 34 {
Chris@16 35
Chris@16 36 namespace detail
Chris@16 37 {
Chris@16 38 template <typename T>
Chris@16 39 struct enable_move_utility_emulation_dummy_specialization;
Chris@16 40 template<typename T>
Chris@16 41 struct thread_move_t
Chris@16 42 {
Chris@16 43 T& t;
Chris@16 44 explicit thread_move_t(T& t_):
Chris@16 45 t(t_)
Chris@16 46 {}
Chris@16 47
Chris@16 48 T& operator*() const
Chris@16 49 {
Chris@16 50 return t;
Chris@16 51 }
Chris@16 52
Chris@16 53 T* operator->() const
Chris@16 54 {
Chris@16 55 return &t;
Chris@16 56 }
Chris@16 57 private:
Chris@16 58 void operator=(thread_move_t&);
Chris@16 59 };
Chris@16 60 }
Chris@16 61
Chris@16 62 #if !defined BOOST_THREAD_USES_MOVE
Chris@16 63
Chris@16 64 #ifndef BOOST_NO_SFINAE
Chris@16 65 template<typename T>
Chris@16 66 typename enable_if<boost::is_convertible<T&,boost::detail::thread_move_t<T> >, boost::detail::thread_move_t<T> >::type move(T& t)
Chris@16 67 {
Chris@16 68 return boost::detail::thread_move_t<T>(t);
Chris@16 69 }
Chris@16 70 #endif
Chris@16 71
Chris@16 72 template<typename T>
Chris@16 73 boost::detail::thread_move_t<T> move(boost::detail::thread_move_t<T> t)
Chris@16 74 {
Chris@16 75 return t;
Chris@16 76 }
Chris@16 77
Chris@16 78 #endif //#if !defined BOOST_THREAD_USES_MOVE
Chris@16 79 }
Chris@16 80
Chris@16 81 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@16 82
Chris@101 83 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE)
Chris@16 84 #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE)
Chris@16 85 #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE)
Chris@16 86 #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG
Chris@16 87 #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END
Chris@16 88 #define BOOST_THREAD_RV(V) V
Chris@16 89 #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE
Chris@16 90 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
Chris@16 91 #define BOOST_THREAD_DCL_MOVABLE(TYPE)
Chris@16 92 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
Chris@16 93 namespace detail { \
Chris@16 94 template <typename T> \
Chris@16 95 struct enable_move_utility_emulation_dummy_specialization<
Chris@16 96
Chris@16 97 #define BOOST_THREAD_DCL_MOVABLE_END > \
Chris@16 98 : integral_constant<bool, false> \
Chris@16 99 {}; \
Chris@16 100 }
Chris@16 101
Chris@16 102 #elif ! defined BOOST_NO_CXX11_RVALUE_REFERENCES && defined BOOST_MSVC
Chris@16 103
Chris@101 104 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE)
Chris@16 105 #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE)
Chris@16 106 #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE)
Chris@16 107 #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG
Chris@16 108 #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END
Chris@16 109 #define BOOST_THREAD_RV(V) V
Chris@16 110 #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE
Chris@16 111 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
Chris@16 112 #define BOOST_THREAD_DCL_MOVABLE(TYPE)
Chris@16 113 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
Chris@16 114 namespace detail { \
Chris@16 115 template <typename T> \
Chris@16 116 struct enable_move_utility_emulation_dummy_specialization<
Chris@16 117
Chris@16 118 #define BOOST_THREAD_DCL_MOVABLE_END > \
Chris@16 119 : integral_constant<bool, false> \
Chris@16 120 {}; \
Chris@16 121 }
Chris@16 122
Chris@16 123 #else
Chris@16 124
Chris@16 125 #if defined BOOST_THREAD_USES_MOVE
Chris@101 126 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) BOOST_COPY_ASSIGN_REF(TYPE)
Chris@16 127 #define BOOST_THREAD_RV_REF(TYPE) BOOST_RV_REF(TYPE)
Chris@16 128 #define BOOST_THREAD_RV_REF_2_TEMPL_ARGS(TYPE) BOOST_RV_REF_2_TEMPL_ARGS(TYPE)
Chris@16 129 #define BOOST_THREAD_RV_REF_BEG BOOST_RV_REF_BEG
Chris@16 130 #define BOOST_THREAD_RV_REF_END BOOST_RV_REF_END
Chris@16 131 #define BOOST_THREAD_RV(V) V
Chris@16 132 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
Chris@16 133 #define BOOST_THREAD_DCL_MOVABLE(TYPE)
Chris@16 134 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
Chris@16 135 namespace detail { \
Chris@16 136 template <typename T> \
Chris@16 137 struct enable_move_utility_emulation_dummy_specialization<
Chris@16 138
Chris@16 139 #define BOOST_THREAD_DCL_MOVABLE_END > \
Chris@16 140 : integral_constant<bool, false> \
Chris@16 141 {}; \
Chris@16 142 }
Chris@16 143
Chris@16 144 #else
Chris@16 145
Chris@101 146 #define BOOST_THREAD_COPY_ASSIGN_REF(TYPE) const TYPE&
Chris@16 147 #define BOOST_THREAD_RV_REF(TYPE) boost::detail::thread_move_t< TYPE >
Chris@16 148 #define BOOST_THREAD_RV_REF_BEG boost::detail::thread_move_t<
Chris@16 149 #define BOOST_THREAD_RV_REF_END >
Chris@16 150 #define BOOST_THREAD_RV(V) (*V)
Chris@16 151 #define BOOST_THREAD_FWD_REF(TYPE) BOOST_FWD_REF(TYPE)
Chris@16 152
Chris@16 153 #define BOOST_THREAD_DCL_MOVABLE(TYPE) \
Chris@16 154 template <> \
Chris@16 155 struct enable_move_utility_emulation< TYPE > \
Chris@16 156 { \
Chris@16 157 static const bool value = false; \
Chris@16 158 };
Chris@16 159
Chris@16 160 #define BOOST_THREAD_DCL_MOVABLE_BEG(T) \
Chris@16 161 template <typename T> \
Chris@16 162 struct enable_move_utility_emulation<
Chris@16 163
Chris@16 164 #define BOOST_THREAD_DCL_MOVABLE_END > \
Chris@16 165 { \
Chris@16 166 static const bool value = false; \
Chris@16 167 };
Chris@16 168
Chris@16 169 #endif
Chris@16 170
Chris@16 171 namespace boost
Chris@16 172 {
Chris@16 173 namespace detail
Chris@16 174 {
Chris@16 175 template <typename T>
Chris@16 176 BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type)
Chris@16 177 make_rv_ref(T v) BOOST_NOEXCEPT
Chris@16 178 {
Chris@16 179 return (BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type))(v);
Chris@16 180 }
Chris@16 181 // template <typename T>
Chris@16 182 // BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type)
Chris@16 183 // make_rv_ref(T &v) BOOST_NOEXCEPT
Chris@16 184 // {
Chris@16 185 // return (BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type))(v);
Chris@16 186 // }
Chris@16 187 // template <typename T>
Chris@16 188 // const BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type)
Chris@16 189 // make_rv_ref(T const&v) BOOST_NOEXCEPT
Chris@16 190 // {
Chris@16 191 // return (const BOOST_THREAD_RV_REF(typename ::boost::remove_cv<typename ::boost::remove_reference<T>::type>::type))(v);
Chris@16 192 // }
Chris@16 193 }
Chris@16 194 }
Chris@16 195
Chris@16 196 #define BOOST_THREAD_MAKE_RV_REF(RVALUE) RVALUE.move()
Chris@16 197 //#define BOOST_THREAD_MAKE_RV_REF(RVALUE) boost::detail::make_rv_ref(RVALUE)
Chris@16 198 #endif
Chris@16 199
Chris@16 200
Chris@16 201 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@16 202
Chris@16 203 #define BOOST_THREAD_MOVABLE(TYPE)
Chris@16 204
Chris@101 205 #define BOOST_THREAD_COPYABLE(TYPE)
Chris@101 206
Chris@16 207 #else
Chris@16 208
Chris@16 209 #if defined BOOST_THREAD_USES_MOVE
Chris@16 210
Chris@16 211 #define BOOST_THREAD_MOVABLE(TYPE) \
Chris@16 212 ::boost::rv<TYPE>& move() BOOST_NOEXCEPT \
Chris@16 213 { \
Chris@16 214 return *static_cast< ::boost::rv<TYPE>* >(this); \
Chris@16 215 } \
Chris@16 216 const ::boost::rv<TYPE>& move() const BOOST_NOEXCEPT \
Chris@16 217 { \
Chris@16 218 return *static_cast<const ::boost::rv<TYPE>* >(this); \
Chris@16 219 } \
Chris@16 220 operator ::boost::rv<TYPE>&() \
Chris@16 221 { \
Chris@16 222 return *static_cast< ::boost::rv<TYPE>* >(this); \
Chris@16 223 } \
Chris@16 224 operator const ::boost::rv<TYPE>&() const \
Chris@16 225 { \
Chris@16 226 return *static_cast<const ::boost::rv<TYPE>* >(this); \
Chris@16 227 }\
Chris@16 228
Chris@101 229 #define BOOST_THREAD_COPYABLE(TYPE) \
Chris@101 230 TYPE& operator=(TYPE &t)\
Chris@101 231 { this->operator=(static_cast<const ::boost::rv<TYPE> &>(const_cast<const TYPE &>(t))); return *this;}
Chris@101 232
Chris@101 233
Chris@16 234 #else
Chris@16 235
Chris@16 236 #define BOOST_THREAD_MOVABLE(TYPE) \
Chris@16 237 operator ::boost::detail::thread_move_t<TYPE>() BOOST_NOEXCEPT \
Chris@16 238 { \
Chris@16 239 return move(); \
Chris@16 240 } \
Chris@16 241 ::boost::detail::thread_move_t<TYPE> move() BOOST_NOEXCEPT \
Chris@16 242 { \
Chris@16 243 ::boost::detail::thread_move_t<TYPE> x(*this); \
Chris@16 244 return x; \
Chris@16 245 } \
Chris@16 246
Chris@101 247 #define BOOST_THREAD_COPYABLE(TYPE)
Chris@101 248
Chris@16 249 #endif
Chris@16 250 #endif
Chris@16 251
Chris@16 252 #define BOOST_THREAD_MOVABLE_ONLY(TYPE) \
Chris@16 253 BOOST_THREAD_NO_COPYABLE(TYPE) \
Chris@16 254 BOOST_THREAD_MOVABLE(TYPE) \
Chris@101 255 typedef int boost_move_no_copy_constructor_or_assign; \
Chris@101 256
Chris@16 257
Chris@16 258 #define BOOST_THREAD_COPYABLE_AND_MOVABLE(TYPE) \
Chris@101 259 BOOST_THREAD_COPYABLE(TYPE) \
Chris@101 260 BOOST_THREAD_MOVABLE(TYPE) \
Chris@16 261
Chris@16 262
Chris@16 263
Chris@16 264 namespace boost
Chris@101 265 {
Chris@101 266 namespace thread_detail
Chris@16 267 {
Chris@101 268
Chris@101 269 #if ! defined BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@101 270 #elif defined BOOST_THREAD_USES_MOVE
Chris@101 271 template <class T>
Chris@101 272 struct is_rv
Chris@101 273 : ::boost::move_detail::is_rv<T>
Chris@101 274 {};
Chris@101 275
Chris@101 276 #else
Chris@101 277 template <class T>
Chris@101 278 struct is_rv
Chris@101 279 : ::boost::integral_constant<bool, false>
Chris@101 280 {};
Chris@101 281
Chris@101 282 template <class T>
Chris@101 283 struct is_rv< ::boost::detail::thread_move_t<T> >
Chris@101 284 : ::boost::integral_constant<bool, true>
Chris@101 285 {};
Chris@101 286
Chris@101 287 template <class T>
Chris@101 288 struct is_rv< const ::boost::detail::thread_move_t<T> >
Chris@101 289 : ::boost::integral_constant<bool, true>
Chris@101 290 {};
Chris@101 291 #endif
Chris@101 292
Chris@101 293 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@101 294 template <class Tp>
Chris@101 295 struct remove_reference : boost::remove_reference<Tp> {};
Chris@101 296 template <class Tp>
Chris@101 297 struct decay : boost::decay<Tp> {};
Chris@101 298 #else
Chris@101 299 template <class Tp>
Chris@101 300 struct remove_reference
Chris@101 301 {
Chris@101 302 typedef Tp type;
Chris@101 303 };
Chris@101 304 template <class Tp>
Chris@101 305 struct remove_reference<Tp&>
Chris@101 306 {
Chris@101 307 typedef Tp type;
Chris@101 308 };
Chris@101 309 template <class Tp>
Chris@101 310 struct remove_reference< rv<Tp> > {
Chris@101 311 typedef Tp type;
Chris@101 312 };
Chris@101 313
Chris@101 314 template <class Tp>
Chris@101 315 struct decay
Chris@101 316 {
Chris@101 317 private:
Chris@101 318 typedef typename boost::move_detail::remove_rvalue_reference<Tp>::type Up0;
Chris@101 319 typedef typename boost::remove_reference<Up0>::type Up;
Chris@101 320 public:
Chris@101 321 typedef typename conditional
Chris@101 322 <
Chris@101 323 is_array<Up>::value,
Chris@101 324 typename remove_extent<Up>::type*,
Chris@101 325 typename conditional
Chris@101 326 <
Chris@101 327 is_function<Up>::value,
Chris@101 328 typename add_pointer<Up>::type,
Chris@101 329 typename remove_cv<Up>::type
Chris@101 330 >::type
Chris@101 331 >::type type;
Chris@101 332 };
Chris@101 333 #endif
Chris@101 334
Chris@16 335 #ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
Chris@16 336 template <class T>
Chris@16 337 typename decay<T>::type
Chris@16 338 decay_copy(T&& t)
Chris@16 339 {
Chris@16 340 return boost::forward<T>(t);
Chris@16 341 }
Chris@16 342 #else
Chris@16 343 template <class T>
Chris@16 344 typename decay<T>::type
Chris@16 345 decay_copy(BOOST_THREAD_FWD_REF(T) t)
Chris@16 346 {
Chris@16 347 return boost::forward<T>(t);
Chris@16 348 }
Chris@16 349 #endif
Chris@16 350 }
Chris@16 351 }
Chris@16 352
Chris@16 353 #include <boost/config/abi_suffix.hpp>
Chris@16 354
Chris@16 355 #endif