1*4d6fc14bSjoerg// -*- C++ -*- 2*4d6fc14bSjoerg//===--------------------------- future -----------------------------------===// 3*4d6fc14bSjoerg// 4*4d6fc14bSjoerg// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 5*4d6fc14bSjoerg// See https://llvm.org/LICENSE.txt for license information. 6*4d6fc14bSjoerg// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 7*4d6fc14bSjoerg// 8*4d6fc14bSjoerg//===----------------------------------------------------------------------===// 9*4d6fc14bSjoerg 10*4d6fc14bSjoerg#ifndef _LIBCPP_FUTURE 11*4d6fc14bSjoerg#define _LIBCPP_FUTURE 12*4d6fc14bSjoerg 13*4d6fc14bSjoerg/* 14*4d6fc14bSjoerg future synopsis 15*4d6fc14bSjoerg 16*4d6fc14bSjoergnamespace std 17*4d6fc14bSjoerg{ 18*4d6fc14bSjoerg 19*4d6fc14bSjoergenum class future_errc 20*4d6fc14bSjoerg{ 21*4d6fc14bSjoerg future_already_retrieved = 1, 22*4d6fc14bSjoerg promise_already_satisfied, 23*4d6fc14bSjoerg no_state, 24*4d6fc14bSjoerg broken_promise 25*4d6fc14bSjoerg}; 26*4d6fc14bSjoerg 27*4d6fc14bSjoergenum class launch 28*4d6fc14bSjoerg{ 29*4d6fc14bSjoerg async = 1, 30*4d6fc14bSjoerg deferred = 2, 31*4d6fc14bSjoerg any = async | deferred 32*4d6fc14bSjoerg}; 33*4d6fc14bSjoerg 34*4d6fc14bSjoergenum class future_status 35*4d6fc14bSjoerg{ 36*4d6fc14bSjoerg ready, 37*4d6fc14bSjoerg timeout, 38*4d6fc14bSjoerg deferred 39*4d6fc14bSjoerg}; 40*4d6fc14bSjoerg 41*4d6fc14bSjoergtemplate <> struct is_error_code_enum<future_errc> : public true_type { }; 42*4d6fc14bSjoergerror_code make_error_code(future_errc e) noexcept; 43*4d6fc14bSjoergerror_condition make_error_condition(future_errc e) noexcept; 44*4d6fc14bSjoerg 45*4d6fc14bSjoergconst error_category& future_category() noexcept; 46*4d6fc14bSjoerg 47*4d6fc14bSjoergclass future_error 48*4d6fc14bSjoerg : public logic_error 49*4d6fc14bSjoerg{ 50*4d6fc14bSjoergpublic: 51*4d6fc14bSjoerg future_error(error_code ec); // exposition only 52*4d6fc14bSjoerg explicit future_error(future_errc); // C++17 53*4d6fc14bSjoerg const error_code& code() const noexcept; 54*4d6fc14bSjoerg const char* what() const noexcept; 55*4d6fc14bSjoerg}; 56*4d6fc14bSjoerg 57*4d6fc14bSjoergtemplate <class R> 58*4d6fc14bSjoergclass promise 59*4d6fc14bSjoerg{ 60*4d6fc14bSjoergpublic: 61*4d6fc14bSjoerg promise(); 62*4d6fc14bSjoerg template <class Allocator> 63*4d6fc14bSjoerg promise(allocator_arg_t, const Allocator& a); 64*4d6fc14bSjoerg promise(promise&& rhs) noexcept; 65*4d6fc14bSjoerg promise(const promise& rhs) = delete; 66*4d6fc14bSjoerg ~promise(); 67*4d6fc14bSjoerg 68*4d6fc14bSjoerg // assignment 69*4d6fc14bSjoerg promise& operator=(promise&& rhs) noexcept; 70*4d6fc14bSjoerg promise& operator=(const promise& rhs) = delete; 71*4d6fc14bSjoerg void swap(promise& other) noexcept; 72*4d6fc14bSjoerg 73*4d6fc14bSjoerg // retrieving the result 74*4d6fc14bSjoerg future<R> get_future(); 75*4d6fc14bSjoerg 76*4d6fc14bSjoerg // setting the result 77*4d6fc14bSjoerg void set_value(const R& r); 78*4d6fc14bSjoerg void set_value(R&& r); 79*4d6fc14bSjoerg void set_exception(exception_ptr p); 80*4d6fc14bSjoerg 81*4d6fc14bSjoerg // setting the result with deferred notification 82*4d6fc14bSjoerg void set_value_at_thread_exit(const R& r); 83*4d6fc14bSjoerg void set_value_at_thread_exit(R&& r); 84*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr p); 85*4d6fc14bSjoerg}; 86*4d6fc14bSjoerg 87*4d6fc14bSjoergtemplate <class R> 88*4d6fc14bSjoergclass promise<R&> 89*4d6fc14bSjoerg{ 90*4d6fc14bSjoergpublic: 91*4d6fc14bSjoerg promise(); 92*4d6fc14bSjoerg template <class Allocator> 93*4d6fc14bSjoerg promise(allocator_arg_t, const Allocator& a); 94*4d6fc14bSjoerg promise(promise&& rhs) noexcept; 95*4d6fc14bSjoerg promise(const promise& rhs) = delete; 96*4d6fc14bSjoerg ~promise(); 97*4d6fc14bSjoerg 98*4d6fc14bSjoerg // assignment 99*4d6fc14bSjoerg promise& operator=(promise&& rhs) noexcept; 100*4d6fc14bSjoerg promise& operator=(const promise& rhs) = delete; 101*4d6fc14bSjoerg void swap(promise& other) noexcept; 102*4d6fc14bSjoerg 103*4d6fc14bSjoerg // retrieving the result 104*4d6fc14bSjoerg future<R&> get_future(); 105*4d6fc14bSjoerg 106*4d6fc14bSjoerg // setting the result 107*4d6fc14bSjoerg void set_value(R& r); 108*4d6fc14bSjoerg void set_exception(exception_ptr p); 109*4d6fc14bSjoerg 110*4d6fc14bSjoerg // setting the result with deferred notification 111*4d6fc14bSjoerg void set_value_at_thread_exit(R&); 112*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr p); 113*4d6fc14bSjoerg}; 114*4d6fc14bSjoerg 115*4d6fc14bSjoergtemplate <> 116*4d6fc14bSjoergclass promise<void> 117*4d6fc14bSjoerg{ 118*4d6fc14bSjoergpublic: 119*4d6fc14bSjoerg promise(); 120*4d6fc14bSjoerg template <class Allocator> 121*4d6fc14bSjoerg promise(allocator_arg_t, const Allocator& a); 122*4d6fc14bSjoerg promise(promise&& rhs) noexcept; 123*4d6fc14bSjoerg promise(const promise& rhs) = delete; 124*4d6fc14bSjoerg ~promise(); 125*4d6fc14bSjoerg 126*4d6fc14bSjoerg // assignment 127*4d6fc14bSjoerg promise& operator=(promise&& rhs) noexcept; 128*4d6fc14bSjoerg promise& operator=(const promise& rhs) = delete; 129*4d6fc14bSjoerg void swap(promise& other) noexcept; 130*4d6fc14bSjoerg 131*4d6fc14bSjoerg // retrieving the result 132*4d6fc14bSjoerg future<void> get_future(); 133*4d6fc14bSjoerg 134*4d6fc14bSjoerg // setting the result 135*4d6fc14bSjoerg void set_value(); 136*4d6fc14bSjoerg void set_exception(exception_ptr p); 137*4d6fc14bSjoerg 138*4d6fc14bSjoerg // setting the result with deferred notification 139*4d6fc14bSjoerg void set_value_at_thread_exit(); 140*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr p); 141*4d6fc14bSjoerg}; 142*4d6fc14bSjoerg 143*4d6fc14bSjoergtemplate <class R> void swap(promise<R>& x, promise<R>& y) noexcept; 144*4d6fc14bSjoerg 145*4d6fc14bSjoergtemplate <class R, class Alloc> 146*4d6fc14bSjoerg struct uses_allocator<promise<R>, Alloc> : public true_type {}; 147*4d6fc14bSjoerg 148*4d6fc14bSjoergtemplate <class R> 149*4d6fc14bSjoergclass future 150*4d6fc14bSjoerg{ 151*4d6fc14bSjoergpublic: 152*4d6fc14bSjoerg future() noexcept; 153*4d6fc14bSjoerg future(future&&) noexcept; 154*4d6fc14bSjoerg future(const future& rhs) = delete; 155*4d6fc14bSjoerg ~future(); 156*4d6fc14bSjoerg future& operator=(const future& rhs) = delete; 157*4d6fc14bSjoerg future& operator=(future&&) noexcept; 158*4d6fc14bSjoerg shared_future<R> share() noexcept; 159*4d6fc14bSjoerg 160*4d6fc14bSjoerg // retrieving the value 161*4d6fc14bSjoerg R get(); 162*4d6fc14bSjoerg 163*4d6fc14bSjoerg // functions to check state 164*4d6fc14bSjoerg bool valid() const noexcept; 165*4d6fc14bSjoerg 166*4d6fc14bSjoerg void wait() const; 167*4d6fc14bSjoerg template <class Rep, class Period> 168*4d6fc14bSjoerg future_status 169*4d6fc14bSjoerg wait_for(const chrono::duration<Rep, Period>& rel_time) const; 170*4d6fc14bSjoerg template <class Clock, class Duration> 171*4d6fc14bSjoerg future_status 172*4d6fc14bSjoerg wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; 173*4d6fc14bSjoerg}; 174*4d6fc14bSjoerg 175*4d6fc14bSjoergtemplate <class R> 176*4d6fc14bSjoergclass future<R&> 177*4d6fc14bSjoerg{ 178*4d6fc14bSjoergpublic: 179*4d6fc14bSjoerg future() noexcept; 180*4d6fc14bSjoerg future(future&&) noexcept; 181*4d6fc14bSjoerg future(const future& rhs) = delete; 182*4d6fc14bSjoerg ~future(); 183*4d6fc14bSjoerg future& operator=(const future& rhs) = delete; 184*4d6fc14bSjoerg future& operator=(future&&) noexcept; 185*4d6fc14bSjoerg shared_future<R&> share() noexcept; 186*4d6fc14bSjoerg 187*4d6fc14bSjoerg // retrieving the value 188*4d6fc14bSjoerg R& get(); 189*4d6fc14bSjoerg 190*4d6fc14bSjoerg // functions to check state 191*4d6fc14bSjoerg bool valid() const noexcept; 192*4d6fc14bSjoerg 193*4d6fc14bSjoerg void wait() const; 194*4d6fc14bSjoerg template <class Rep, class Period> 195*4d6fc14bSjoerg future_status 196*4d6fc14bSjoerg wait_for(const chrono::duration<Rep, Period>& rel_time) const; 197*4d6fc14bSjoerg template <class Clock, class Duration> 198*4d6fc14bSjoerg future_status 199*4d6fc14bSjoerg wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; 200*4d6fc14bSjoerg}; 201*4d6fc14bSjoerg 202*4d6fc14bSjoergtemplate <> 203*4d6fc14bSjoergclass future<void> 204*4d6fc14bSjoerg{ 205*4d6fc14bSjoergpublic: 206*4d6fc14bSjoerg future() noexcept; 207*4d6fc14bSjoerg future(future&&) noexcept; 208*4d6fc14bSjoerg future(const future& rhs) = delete; 209*4d6fc14bSjoerg ~future(); 210*4d6fc14bSjoerg future& operator=(const future& rhs) = delete; 211*4d6fc14bSjoerg future& operator=(future&&) noexcept; 212*4d6fc14bSjoerg shared_future<void> share() noexcept; 213*4d6fc14bSjoerg 214*4d6fc14bSjoerg // retrieving the value 215*4d6fc14bSjoerg void get(); 216*4d6fc14bSjoerg 217*4d6fc14bSjoerg // functions to check state 218*4d6fc14bSjoerg bool valid() const noexcept; 219*4d6fc14bSjoerg 220*4d6fc14bSjoerg void wait() const; 221*4d6fc14bSjoerg template <class Rep, class Period> 222*4d6fc14bSjoerg future_status 223*4d6fc14bSjoerg wait_for(const chrono::duration<Rep, Period>& rel_time) const; 224*4d6fc14bSjoerg template <class Clock, class Duration> 225*4d6fc14bSjoerg future_status 226*4d6fc14bSjoerg wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; 227*4d6fc14bSjoerg}; 228*4d6fc14bSjoerg 229*4d6fc14bSjoergtemplate <class R> 230*4d6fc14bSjoergclass shared_future 231*4d6fc14bSjoerg{ 232*4d6fc14bSjoergpublic: 233*4d6fc14bSjoerg shared_future() noexcept; 234*4d6fc14bSjoerg shared_future(const shared_future& rhs); 235*4d6fc14bSjoerg shared_future(future<R>&&) noexcept; 236*4d6fc14bSjoerg shared_future(shared_future&& rhs) noexcept; 237*4d6fc14bSjoerg ~shared_future(); 238*4d6fc14bSjoerg shared_future& operator=(const shared_future& rhs); 239*4d6fc14bSjoerg shared_future& operator=(shared_future&& rhs) noexcept; 240*4d6fc14bSjoerg 241*4d6fc14bSjoerg // retrieving the value 242*4d6fc14bSjoerg const R& get() const; 243*4d6fc14bSjoerg 244*4d6fc14bSjoerg // functions to check state 245*4d6fc14bSjoerg bool valid() const noexcept; 246*4d6fc14bSjoerg 247*4d6fc14bSjoerg void wait() const; 248*4d6fc14bSjoerg template <class Rep, class Period> 249*4d6fc14bSjoerg future_status 250*4d6fc14bSjoerg wait_for(const chrono::duration<Rep, Period>& rel_time) const; 251*4d6fc14bSjoerg template <class Clock, class Duration> 252*4d6fc14bSjoerg future_status 253*4d6fc14bSjoerg wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; 254*4d6fc14bSjoerg}; 255*4d6fc14bSjoerg 256*4d6fc14bSjoergtemplate <class R> 257*4d6fc14bSjoergclass shared_future<R&> 258*4d6fc14bSjoerg{ 259*4d6fc14bSjoergpublic: 260*4d6fc14bSjoerg shared_future() noexcept; 261*4d6fc14bSjoerg shared_future(const shared_future& rhs); 262*4d6fc14bSjoerg shared_future(future<R&>&&) noexcept; 263*4d6fc14bSjoerg shared_future(shared_future&& rhs) noexcept; 264*4d6fc14bSjoerg ~shared_future(); 265*4d6fc14bSjoerg shared_future& operator=(const shared_future& rhs); 266*4d6fc14bSjoerg shared_future& operator=(shared_future&& rhs) noexcept; 267*4d6fc14bSjoerg 268*4d6fc14bSjoerg // retrieving the value 269*4d6fc14bSjoerg R& get() const; 270*4d6fc14bSjoerg 271*4d6fc14bSjoerg // functions to check state 272*4d6fc14bSjoerg bool valid() const noexcept; 273*4d6fc14bSjoerg 274*4d6fc14bSjoerg void wait() const; 275*4d6fc14bSjoerg template <class Rep, class Period> 276*4d6fc14bSjoerg future_status 277*4d6fc14bSjoerg wait_for(const chrono::duration<Rep, Period>& rel_time) const; 278*4d6fc14bSjoerg template <class Clock, class Duration> 279*4d6fc14bSjoerg future_status 280*4d6fc14bSjoerg wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; 281*4d6fc14bSjoerg}; 282*4d6fc14bSjoerg 283*4d6fc14bSjoergtemplate <> 284*4d6fc14bSjoergclass shared_future<void> 285*4d6fc14bSjoerg{ 286*4d6fc14bSjoergpublic: 287*4d6fc14bSjoerg shared_future() noexcept; 288*4d6fc14bSjoerg shared_future(const shared_future& rhs); 289*4d6fc14bSjoerg shared_future(future<void>&&) noexcept; 290*4d6fc14bSjoerg shared_future(shared_future&& rhs) noexcept; 291*4d6fc14bSjoerg ~shared_future(); 292*4d6fc14bSjoerg shared_future& operator=(const shared_future& rhs); 293*4d6fc14bSjoerg shared_future& operator=(shared_future&& rhs) noexcept; 294*4d6fc14bSjoerg 295*4d6fc14bSjoerg // retrieving the value 296*4d6fc14bSjoerg void get() const; 297*4d6fc14bSjoerg 298*4d6fc14bSjoerg // functions to check state 299*4d6fc14bSjoerg bool valid() const noexcept; 300*4d6fc14bSjoerg 301*4d6fc14bSjoerg void wait() const; 302*4d6fc14bSjoerg template <class Rep, class Period> 303*4d6fc14bSjoerg future_status 304*4d6fc14bSjoerg wait_for(const chrono::duration<Rep, Period>& rel_time) const; 305*4d6fc14bSjoerg template <class Clock, class Duration> 306*4d6fc14bSjoerg future_status 307*4d6fc14bSjoerg wait_until(const chrono::time_point<Clock, Duration>& abs_time) const; 308*4d6fc14bSjoerg}; 309*4d6fc14bSjoerg 310*4d6fc14bSjoergtemplate <class F, class... Args> 311*4d6fc14bSjoerg future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type> 312*4d6fc14bSjoerg async(F&& f, Args&&... args); 313*4d6fc14bSjoerg 314*4d6fc14bSjoergtemplate <class F, class... Args> 315*4d6fc14bSjoerg future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type> 316*4d6fc14bSjoerg async(launch policy, F&& f, Args&&... args); 317*4d6fc14bSjoerg 318*4d6fc14bSjoergtemplate <class> class packaged_task; // undefined 319*4d6fc14bSjoerg 320*4d6fc14bSjoergtemplate <class R, class... ArgTypes> 321*4d6fc14bSjoergclass packaged_task<R(ArgTypes...)> 322*4d6fc14bSjoerg{ 323*4d6fc14bSjoergpublic: 324*4d6fc14bSjoerg typedef R result_type; // extension 325*4d6fc14bSjoerg 326*4d6fc14bSjoerg // construction and destruction 327*4d6fc14bSjoerg packaged_task() noexcept; 328*4d6fc14bSjoerg template <class F> 329*4d6fc14bSjoerg explicit packaged_task(F&& f); 330*4d6fc14bSjoerg template <class F, class Allocator> 331*4d6fc14bSjoerg packaged_task(allocator_arg_t, const Allocator& a, F&& f); 332*4d6fc14bSjoerg ~packaged_task(); 333*4d6fc14bSjoerg 334*4d6fc14bSjoerg // no copy 335*4d6fc14bSjoerg packaged_task(const packaged_task&) = delete; 336*4d6fc14bSjoerg packaged_task& operator=(const packaged_task&) = delete; 337*4d6fc14bSjoerg 338*4d6fc14bSjoerg // move support 339*4d6fc14bSjoerg packaged_task(packaged_task&& other) noexcept; 340*4d6fc14bSjoerg packaged_task& operator=(packaged_task&& other) noexcept; 341*4d6fc14bSjoerg void swap(packaged_task& other) noexcept; 342*4d6fc14bSjoerg 343*4d6fc14bSjoerg bool valid() const noexcept; 344*4d6fc14bSjoerg 345*4d6fc14bSjoerg // result retrieval 346*4d6fc14bSjoerg future<R> get_future(); 347*4d6fc14bSjoerg 348*4d6fc14bSjoerg // execution 349*4d6fc14bSjoerg void operator()(ArgTypes... ); 350*4d6fc14bSjoerg void make_ready_at_thread_exit(ArgTypes...); 351*4d6fc14bSjoerg 352*4d6fc14bSjoerg void reset(); 353*4d6fc14bSjoerg}; 354*4d6fc14bSjoerg 355*4d6fc14bSjoergtemplate <class R> 356*4d6fc14bSjoerg void swap(packaged_task<R(ArgTypes...)&, packaged_task<R(ArgTypes...)>&) noexcept; 357*4d6fc14bSjoerg 358*4d6fc14bSjoergtemplate <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>; 359*4d6fc14bSjoerg 360*4d6fc14bSjoerg} // std 361*4d6fc14bSjoerg 362*4d6fc14bSjoerg*/ 363*4d6fc14bSjoerg 364*4d6fc14bSjoerg#include <__config> 365*4d6fc14bSjoerg#include <__availability> 366*4d6fc14bSjoerg#include <__debug> 367*4d6fc14bSjoerg#include <chrono> 368*4d6fc14bSjoerg#include <exception> 369*4d6fc14bSjoerg#include <memory> 370*4d6fc14bSjoerg#include <mutex> 371*4d6fc14bSjoerg#include <system_error> 372*4d6fc14bSjoerg#include <thread> 373*4d6fc14bSjoerg 374*4d6fc14bSjoerg#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER) 375*4d6fc14bSjoerg#pragma GCC system_header 376*4d6fc14bSjoerg#endif 377*4d6fc14bSjoerg 378*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_NO_THREADS 379*4d6fc14bSjoerg#error <future> is not supported on this single threaded system 380*4d6fc14bSjoerg#else // !_LIBCPP_HAS_NO_THREADS 381*4d6fc14bSjoerg 382*4d6fc14bSjoerg_LIBCPP_BEGIN_NAMESPACE_STD 383*4d6fc14bSjoerg 384*4d6fc14bSjoerg//enum class future_errc 385*4d6fc14bSjoerg_LIBCPP_DECLARE_STRONG_ENUM(future_errc) 386*4d6fc14bSjoerg{ 387*4d6fc14bSjoerg future_already_retrieved = 1, 388*4d6fc14bSjoerg promise_already_satisfied, 389*4d6fc14bSjoerg no_state, 390*4d6fc14bSjoerg broken_promise 391*4d6fc14bSjoerg}; 392*4d6fc14bSjoerg_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc) 393*4d6fc14bSjoerg 394*4d6fc14bSjoergtemplate <> 395*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc> : public true_type {}; 396*4d6fc14bSjoerg 397*4d6fc14bSjoerg#ifdef _LIBCPP_HAS_NO_STRONG_ENUMS 398*4d6fc14bSjoergtemplate <> 399*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc::__lx> : public true_type { }; 400*4d6fc14bSjoerg#endif 401*4d6fc14bSjoerg 402*4d6fc14bSjoerg//enum class launch 403*4d6fc14bSjoerg_LIBCPP_DECLARE_STRONG_ENUM(launch) 404*4d6fc14bSjoerg{ 405*4d6fc14bSjoerg async = 1, 406*4d6fc14bSjoerg deferred = 2, 407*4d6fc14bSjoerg any = async | deferred 408*4d6fc14bSjoerg}; 409*4d6fc14bSjoerg_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch) 410*4d6fc14bSjoerg 411*4d6fc14bSjoerg#ifndef _LIBCPP_HAS_NO_STRONG_ENUMS 412*4d6fc14bSjoerg 413*4d6fc14bSjoergtypedef underlying_type<launch>::type __launch_underlying_type; 414*4d6fc14bSjoerg 415*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 416*4d6fc14bSjoerg_LIBCPP_CONSTEXPR 417*4d6fc14bSjoerglaunch 418*4d6fc14bSjoergoperator&(launch __x, launch __y) 419*4d6fc14bSjoerg{ 420*4d6fc14bSjoerg return static_cast<launch>(static_cast<__launch_underlying_type>(__x) & 421*4d6fc14bSjoerg static_cast<__launch_underlying_type>(__y)); 422*4d6fc14bSjoerg} 423*4d6fc14bSjoerg 424*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 425*4d6fc14bSjoerg_LIBCPP_CONSTEXPR 426*4d6fc14bSjoerglaunch 427*4d6fc14bSjoergoperator|(launch __x, launch __y) 428*4d6fc14bSjoerg{ 429*4d6fc14bSjoerg return static_cast<launch>(static_cast<__launch_underlying_type>(__x) | 430*4d6fc14bSjoerg static_cast<__launch_underlying_type>(__y)); 431*4d6fc14bSjoerg} 432*4d6fc14bSjoerg 433*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 434*4d6fc14bSjoerg_LIBCPP_CONSTEXPR 435*4d6fc14bSjoerglaunch 436*4d6fc14bSjoergoperator^(launch __x, launch __y) 437*4d6fc14bSjoerg{ 438*4d6fc14bSjoerg return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^ 439*4d6fc14bSjoerg static_cast<__launch_underlying_type>(__y)); 440*4d6fc14bSjoerg} 441*4d6fc14bSjoerg 442*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 443*4d6fc14bSjoerg_LIBCPP_CONSTEXPR 444*4d6fc14bSjoerglaunch 445*4d6fc14bSjoergoperator~(launch __x) 446*4d6fc14bSjoerg{ 447*4d6fc14bSjoerg return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3); 448*4d6fc14bSjoerg} 449*4d6fc14bSjoerg 450*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 451*4d6fc14bSjoerglaunch& 452*4d6fc14bSjoergoperator&=(launch& __x, launch __y) 453*4d6fc14bSjoerg{ 454*4d6fc14bSjoerg __x = __x & __y; return __x; 455*4d6fc14bSjoerg} 456*4d6fc14bSjoerg 457*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 458*4d6fc14bSjoerglaunch& 459*4d6fc14bSjoergoperator|=(launch& __x, launch __y) 460*4d6fc14bSjoerg{ 461*4d6fc14bSjoerg __x = __x | __y; return __x; 462*4d6fc14bSjoerg} 463*4d6fc14bSjoerg 464*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 465*4d6fc14bSjoerglaunch& 466*4d6fc14bSjoergoperator^=(launch& __x, launch __y) 467*4d6fc14bSjoerg{ 468*4d6fc14bSjoerg __x = __x ^ __y; return __x; 469*4d6fc14bSjoerg} 470*4d6fc14bSjoerg 471*4d6fc14bSjoerg#endif // !_LIBCPP_HAS_NO_STRONG_ENUMS 472*4d6fc14bSjoerg 473*4d6fc14bSjoerg//enum class future_status 474*4d6fc14bSjoerg_LIBCPP_DECLARE_STRONG_ENUM(future_status) 475*4d6fc14bSjoerg{ 476*4d6fc14bSjoerg ready, 477*4d6fc14bSjoerg timeout, 478*4d6fc14bSjoerg deferred 479*4d6fc14bSjoerg}; 480*4d6fc14bSjoerg_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status) 481*4d6fc14bSjoerg 482*4d6fc14bSjoerg_LIBCPP_FUNC_VIS 483*4d6fc14bSjoergconst error_category& future_category() _NOEXCEPT; 484*4d6fc14bSjoerg 485*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 486*4d6fc14bSjoergerror_code 487*4d6fc14bSjoergmake_error_code(future_errc __e) _NOEXCEPT 488*4d6fc14bSjoerg{ 489*4d6fc14bSjoerg return error_code(static_cast<int>(__e), future_category()); 490*4d6fc14bSjoerg} 491*4d6fc14bSjoerg 492*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 493*4d6fc14bSjoergerror_condition 494*4d6fc14bSjoergmake_error_condition(future_errc __e) _NOEXCEPT 495*4d6fc14bSjoerg{ 496*4d6fc14bSjoerg return error_condition(static_cast<int>(__e), future_category()); 497*4d6fc14bSjoerg} 498*4d6fc14bSjoerg 499*4d6fc14bSjoergclass _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_FUTURE_ERROR future_error 500*4d6fc14bSjoerg : public logic_error 501*4d6fc14bSjoerg{ 502*4d6fc14bSjoerg error_code __ec_; 503*4d6fc14bSjoergpublic: 504*4d6fc14bSjoerg future_error(error_code __ec); 505*4d6fc14bSjoerg 506*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 507*4d6fc14bSjoerg const error_code& code() const _NOEXCEPT {return __ec_;} 508*4d6fc14bSjoerg 509*4d6fc14bSjoerg future_error(const future_error&) _NOEXCEPT = default; 510*4d6fc14bSjoerg virtual ~future_error() _NOEXCEPT; 511*4d6fc14bSjoerg}; 512*4d6fc14bSjoerg 513*4d6fc14bSjoerg_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY 514*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 515*4d6fc14bSjoerg_LIBCPP_AVAILABILITY_FUTURE_ERROR 516*4d6fc14bSjoerg#endif 517*4d6fc14bSjoergvoid __throw_future_error(future_errc _Ev) 518*4d6fc14bSjoerg{ 519*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 520*4d6fc14bSjoerg throw future_error(make_error_code(_Ev)); 521*4d6fc14bSjoerg#else 522*4d6fc14bSjoerg ((void)_Ev); 523*4d6fc14bSjoerg _VSTD::abort(); 524*4d6fc14bSjoerg#endif 525*4d6fc14bSjoerg} 526*4d6fc14bSjoerg 527*4d6fc14bSjoergclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state 528*4d6fc14bSjoerg : public __shared_count 529*4d6fc14bSjoerg{ 530*4d6fc14bSjoergprotected: 531*4d6fc14bSjoerg exception_ptr __exception_; 532*4d6fc14bSjoerg mutable mutex __mut_; 533*4d6fc14bSjoerg mutable condition_variable __cv_; 534*4d6fc14bSjoerg unsigned __state_; 535*4d6fc14bSjoerg 536*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 537*4d6fc14bSjoerg void __sub_wait(unique_lock<mutex>& __lk); 538*4d6fc14bSjoergpublic: 539*4d6fc14bSjoerg enum 540*4d6fc14bSjoerg { 541*4d6fc14bSjoerg __constructed = 1, 542*4d6fc14bSjoerg __future_attached = 2, 543*4d6fc14bSjoerg ready = 4, 544*4d6fc14bSjoerg deferred = 8 545*4d6fc14bSjoerg }; 546*4d6fc14bSjoerg 547*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 548*4d6fc14bSjoerg __assoc_sub_state() : __state_(0) {} 549*4d6fc14bSjoerg 550*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 551*4d6fc14bSjoerg bool __has_value() const 552*4d6fc14bSjoerg {return (__state_ & __constructed) || (__exception_ != nullptr);} 553*4d6fc14bSjoerg 554*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 555*4d6fc14bSjoerg void __attach_future() { 556*4d6fc14bSjoerg lock_guard<mutex> __lk(__mut_); 557*4d6fc14bSjoerg bool __has_future_attached = (__state_ & __future_attached) != 0; 558*4d6fc14bSjoerg if (__has_future_attached) 559*4d6fc14bSjoerg __throw_future_error(future_errc::future_already_retrieved); 560*4d6fc14bSjoerg this->__add_shared(); 561*4d6fc14bSjoerg __state_ |= __future_attached; 562*4d6fc14bSjoerg } 563*4d6fc14bSjoerg 564*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 565*4d6fc14bSjoerg void __set_deferred() {__state_ |= deferred;} 566*4d6fc14bSjoerg 567*4d6fc14bSjoerg void __make_ready(); 568*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 569*4d6fc14bSjoerg bool __is_ready() const {return (__state_ & ready) != 0;} 570*4d6fc14bSjoerg 571*4d6fc14bSjoerg void set_value(); 572*4d6fc14bSjoerg void set_value_at_thread_exit(); 573*4d6fc14bSjoerg 574*4d6fc14bSjoerg void set_exception(exception_ptr __p); 575*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr __p); 576*4d6fc14bSjoerg 577*4d6fc14bSjoerg void copy(); 578*4d6fc14bSjoerg 579*4d6fc14bSjoerg void wait(); 580*4d6fc14bSjoerg template <class _Rep, class _Period> 581*4d6fc14bSjoerg future_status 582*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 583*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const; 584*4d6fc14bSjoerg template <class _Clock, class _Duration> 585*4d6fc14bSjoerg _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 586*4d6fc14bSjoerg future_status 587*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const; 588*4d6fc14bSjoerg 589*4d6fc14bSjoerg virtual void __execute(); 590*4d6fc14bSjoerg}; 591*4d6fc14bSjoerg 592*4d6fc14bSjoergtemplate <class _Clock, class _Duration> 593*4d6fc14bSjoergfuture_status 594*4d6fc14bSjoerg__assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 595*4d6fc14bSjoerg{ 596*4d6fc14bSjoerg unique_lock<mutex> __lk(__mut_); 597*4d6fc14bSjoerg if (__state_ & deferred) 598*4d6fc14bSjoerg return future_status::deferred; 599*4d6fc14bSjoerg while (!(__state_ & ready) && _Clock::now() < __abs_time) 600*4d6fc14bSjoerg __cv_.wait_until(__lk, __abs_time); 601*4d6fc14bSjoerg if (__state_ & ready) 602*4d6fc14bSjoerg return future_status::ready; 603*4d6fc14bSjoerg return future_status::timeout; 604*4d6fc14bSjoerg} 605*4d6fc14bSjoerg 606*4d6fc14bSjoergtemplate <class _Rep, class _Period> 607*4d6fc14bSjoerginline 608*4d6fc14bSjoergfuture_status 609*4d6fc14bSjoerg__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 610*4d6fc14bSjoerg{ 611*4d6fc14bSjoerg return wait_until(chrono::steady_clock::now() + __rel_time); 612*4d6fc14bSjoerg} 613*4d6fc14bSjoerg 614*4d6fc14bSjoergtemplate <class _Rp> 615*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_HIDDEN __assoc_state 616*4d6fc14bSjoerg : public __assoc_sub_state 617*4d6fc14bSjoerg{ 618*4d6fc14bSjoerg typedef __assoc_sub_state base; 619*4d6fc14bSjoerg typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up; 620*4d6fc14bSjoergprotected: 621*4d6fc14bSjoerg _Up __value_; 622*4d6fc14bSjoerg 623*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 624*4d6fc14bSjoergpublic: 625*4d6fc14bSjoerg 626*4d6fc14bSjoerg template <class _Arg> 627*4d6fc14bSjoerg void set_value(_Arg&& __arg); 628*4d6fc14bSjoerg 629*4d6fc14bSjoerg template <class _Arg> 630*4d6fc14bSjoerg void set_value_at_thread_exit(_Arg&& __arg); 631*4d6fc14bSjoerg 632*4d6fc14bSjoerg _Rp move(); 633*4d6fc14bSjoerg typename add_lvalue_reference<_Rp>::type copy(); 634*4d6fc14bSjoerg}; 635*4d6fc14bSjoerg 636*4d6fc14bSjoergtemplate <class _Rp> 637*4d6fc14bSjoergvoid 638*4d6fc14bSjoerg__assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT 639*4d6fc14bSjoerg{ 640*4d6fc14bSjoerg if (this->__state_ & base::__constructed) 641*4d6fc14bSjoerg reinterpret_cast<_Rp*>(&__value_)->~_Rp(); 642*4d6fc14bSjoerg delete this; 643*4d6fc14bSjoerg} 644*4d6fc14bSjoerg 645*4d6fc14bSjoergtemplate <class _Rp> 646*4d6fc14bSjoergtemplate <class _Arg> 647*4d6fc14bSjoerg_LIBCPP_AVAILABILITY_FUTURE 648*4d6fc14bSjoergvoid 649*4d6fc14bSjoerg__assoc_state<_Rp>::set_value(_Arg&& __arg) 650*4d6fc14bSjoerg{ 651*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 652*4d6fc14bSjoerg if (this->__has_value()) 653*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 654*4d6fc14bSjoerg ::new ((void*)&__value_) _Rp(_VSTD::forward<_Arg>(__arg)); 655*4d6fc14bSjoerg this->__state_ |= base::__constructed | base::ready; 656*4d6fc14bSjoerg __cv_.notify_all(); 657*4d6fc14bSjoerg} 658*4d6fc14bSjoerg 659*4d6fc14bSjoergtemplate <class _Rp> 660*4d6fc14bSjoergtemplate <class _Arg> 661*4d6fc14bSjoergvoid 662*4d6fc14bSjoerg__assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg) 663*4d6fc14bSjoerg{ 664*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 665*4d6fc14bSjoerg if (this->__has_value()) 666*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 667*4d6fc14bSjoerg ::new ((void*)&__value_) _Rp(_VSTD::forward<_Arg>(__arg)); 668*4d6fc14bSjoerg this->__state_ |= base::__constructed; 669*4d6fc14bSjoerg __thread_local_data()->__make_ready_at_thread_exit(this); 670*4d6fc14bSjoerg} 671*4d6fc14bSjoerg 672*4d6fc14bSjoergtemplate <class _Rp> 673*4d6fc14bSjoerg_Rp 674*4d6fc14bSjoerg__assoc_state<_Rp>::move() 675*4d6fc14bSjoerg{ 676*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 677*4d6fc14bSjoerg this->__sub_wait(__lk); 678*4d6fc14bSjoerg if (this->__exception_ != nullptr) 679*4d6fc14bSjoerg rethrow_exception(this->__exception_); 680*4d6fc14bSjoerg return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_)); 681*4d6fc14bSjoerg} 682*4d6fc14bSjoerg 683*4d6fc14bSjoergtemplate <class _Rp> 684*4d6fc14bSjoergtypename add_lvalue_reference<_Rp>::type 685*4d6fc14bSjoerg__assoc_state<_Rp>::copy() 686*4d6fc14bSjoerg{ 687*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 688*4d6fc14bSjoerg this->__sub_wait(__lk); 689*4d6fc14bSjoerg if (this->__exception_ != nullptr) 690*4d6fc14bSjoerg rethrow_exception(this->__exception_); 691*4d6fc14bSjoerg return *reinterpret_cast<_Rp*>(&__value_); 692*4d6fc14bSjoerg} 693*4d6fc14bSjoerg 694*4d6fc14bSjoergtemplate <class _Rp> 695*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state<_Rp&> 696*4d6fc14bSjoerg : public __assoc_sub_state 697*4d6fc14bSjoerg{ 698*4d6fc14bSjoerg typedef __assoc_sub_state base; 699*4d6fc14bSjoerg typedef _Rp* _Up; 700*4d6fc14bSjoergprotected: 701*4d6fc14bSjoerg _Up __value_; 702*4d6fc14bSjoerg 703*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 704*4d6fc14bSjoergpublic: 705*4d6fc14bSjoerg 706*4d6fc14bSjoerg void set_value(_Rp& __arg); 707*4d6fc14bSjoerg void set_value_at_thread_exit(_Rp& __arg); 708*4d6fc14bSjoerg 709*4d6fc14bSjoerg _Rp& copy(); 710*4d6fc14bSjoerg}; 711*4d6fc14bSjoerg 712*4d6fc14bSjoergtemplate <class _Rp> 713*4d6fc14bSjoergvoid 714*4d6fc14bSjoerg__assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT 715*4d6fc14bSjoerg{ 716*4d6fc14bSjoerg delete this; 717*4d6fc14bSjoerg} 718*4d6fc14bSjoerg 719*4d6fc14bSjoergtemplate <class _Rp> 720*4d6fc14bSjoergvoid 721*4d6fc14bSjoerg__assoc_state<_Rp&>::set_value(_Rp& __arg) 722*4d6fc14bSjoerg{ 723*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 724*4d6fc14bSjoerg if (this->__has_value()) 725*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 726*4d6fc14bSjoerg __value_ = _VSTD::addressof(__arg); 727*4d6fc14bSjoerg this->__state_ |= base::__constructed | base::ready; 728*4d6fc14bSjoerg __cv_.notify_all(); 729*4d6fc14bSjoerg} 730*4d6fc14bSjoerg 731*4d6fc14bSjoergtemplate <class _Rp> 732*4d6fc14bSjoergvoid 733*4d6fc14bSjoerg__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg) 734*4d6fc14bSjoerg{ 735*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 736*4d6fc14bSjoerg if (this->__has_value()) 737*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 738*4d6fc14bSjoerg __value_ = _VSTD::addressof(__arg); 739*4d6fc14bSjoerg this->__state_ |= base::__constructed; 740*4d6fc14bSjoerg __thread_local_data()->__make_ready_at_thread_exit(this); 741*4d6fc14bSjoerg} 742*4d6fc14bSjoerg 743*4d6fc14bSjoergtemplate <class _Rp> 744*4d6fc14bSjoerg_Rp& 745*4d6fc14bSjoerg__assoc_state<_Rp&>::copy() 746*4d6fc14bSjoerg{ 747*4d6fc14bSjoerg unique_lock<mutex> __lk(this->__mut_); 748*4d6fc14bSjoerg this->__sub_wait(__lk); 749*4d6fc14bSjoerg if (this->__exception_ != nullptr) 750*4d6fc14bSjoerg rethrow_exception(this->__exception_); 751*4d6fc14bSjoerg return *__value_; 752*4d6fc14bSjoerg} 753*4d6fc14bSjoerg 754*4d6fc14bSjoergtemplate <class _Rp, class _Alloc> 755*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc 756*4d6fc14bSjoerg : public __assoc_state<_Rp> 757*4d6fc14bSjoerg{ 758*4d6fc14bSjoerg typedef __assoc_state<_Rp> base; 759*4d6fc14bSjoerg _Alloc __alloc_; 760*4d6fc14bSjoerg 761*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 762*4d6fc14bSjoergpublic: 763*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 764*4d6fc14bSjoerg explicit __assoc_state_alloc(const _Alloc& __a) 765*4d6fc14bSjoerg : __alloc_(__a) {} 766*4d6fc14bSjoerg}; 767*4d6fc14bSjoerg 768*4d6fc14bSjoergtemplate <class _Rp, class _Alloc> 769*4d6fc14bSjoergvoid 770*4d6fc14bSjoerg__assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT 771*4d6fc14bSjoerg{ 772*4d6fc14bSjoerg if (this->__state_ & base::__constructed) 773*4d6fc14bSjoerg reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp(); 774*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al; 775*4d6fc14bSjoerg typedef allocator_traits<_Al> _ATraits; 776*4d6fc14bSjoerg typedef pointer_traits<typename _ATraits::pointer> _PTraits; 777*4d6fc14bSjoerg _Al __a(__alloc_); 778*4d6fc14bSjoerg this->~__assoc_state_alloc(); 779*4d6fc14bSjoerg __a.deallocate(_PTraits::pointer_to(*this), 1); 780*4d6fc14bSjoerg} 781*4d6fc14bSjoerg 782*4d6fc14bSjoergtemplate <class _Rp, class _Alloc> 783*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc<_Rp&, _Alloc> 784*4d6fc14bSjoerg : public __assoc_state<_Rp&> 785*4d6fc14bSjoerg{ 786*4d6fc14bSjoerg typedef __assoc_state<_Rp&> base; 787*4d6fc14bSjoerg _Alloc __alloc_; 788*4d6fc14bSjoerg 789*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 790*4d6fc14bSjoergpublic: 791*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 792*4d6fc14bSjoerg explicit __assoc_state_alloc(const _Alloc& __a) 793*4d6fc14bSjoerg : __alloc_(__a) {} 794*4d6fc14bSjoerg}; 795*4d6fc14bSjoerg 796*4d6fc14bSjoergtemplate <class _Rp, class _Alloc> 797*4d6fc14bSjoergvoid 798*4d6fc14bSjoerg__assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT 799*4d6fc14bSjoerg{ 800*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al; 801*4d6fc14bSjoerg typedef allocator_traits<_Al> _ATraits; 802*4d6fc14bSjoerg typedef pointer_traits<typename _ATraits::pointer> _PTraits; 803*4d6fc14bSjoerg _Al __a(__alloc_); 804*4d6fc14bSjoerg this->~__assoc_state_alloc(); 805*4d6fc14bSjoerg __a.deallocate(_PTraits::pointer_to(*this), 1); 806*4d6fc14bSjoerg} 807*4d6fc14bSjoerg 808*4d6fc14bSjoergtemplate <class _Alloc> 809*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state_alloc 810*4d6fc14bSjoerg : public __assoc_sub_state 811*4d6fc14bSjoerg{ 812*4d6fc14bSjoerg typedef __assoc_sub_state base; 813*4d6fc14bSjoerg _Alloc __alloc_; 814*4d6fc14bSjoerg 815*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 816*4d6fc14bSjoergpublic: 817*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 818*4d6fc14bSjoerg explicit __assoc_sub_state_alloc(const _Alloc& __a) 819*4d6fc14bSjoerg : __alloc_(__a) {} 820*4d6fc14bSjoerg}; 821*4d6fc14bSjoerg 822*4d6fc14bSjoergtemplate <class _Alloc> 823*4d6fc14bSjoergvoid 824*4d6fc14bSjoerg__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT 825*4d6fc14bSjoerg{ 826*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, __assoc_sub_state_alloc>::type _Al; 827*4d6fc14bSjoerg typedef allocator_traits<_Al> _ATraits; 828*4d6fc14bSjoerg typedef pointer_traits<typename _ATraits::pointer> _PTraits; 829*4d6fc14bSjoerg _Al __a(__alloc_); 830*4d6fc14bSjoerg this->~__assoc_sub_state_alloc(); 831*4d6fc14bSjoerg __a.deallocate(_PTraits::pointer_to(*this), 1); 832*4d6fc14bSjoerg} 833*4d6fc14bSjoerg 834*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 835*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state 836*4d6fc14bSjoerg : public __assoc_state<_Rp> 837*4d6fc14bSjoerg{ 838*4d6fc14bSjoerg typedef __assoc_state<_Rp> base; 839*4d6fc14bSjoerg 840*4d6fc14bSjoerg _Fp __func_; 841*4d6fc14bSjoerg 842*4d6fc14bSjoergpublic: 843*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 844*4d6fc14bSjoerg explicit __deferred_assoc_state(_Fp&& __f); 845*4d6fc14bSjoerg 846*4d6fc14bSjoerg virtual void __execute(); 847*4d6fc14bSjoerg}; 848*4d6fc14bSjoerg 849*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 850*4d6fc14bSjoerginline 851*4d6fc14bSjoerg__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f) 852*4d6fc14bSjoerg : __func_(_VSTD::forward<_Fp>(__f)) 853*4d6fc14bSjoerg{ 854*4d6fc14bSjoerg this->__set_deferred(); 855*4d6fc14bSjoerg} 856*4d6fc14bSjoerg 857*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 858*4d6fc14bSjoergvoid 859*4d6fc14bSjoerg__deferred_assoc_state<_Rp, _Fp>::__execute() 860*4d6fc14bSjoerg{ 861*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 862*4d6fc14bSjoerg try 863*4d6fc14bSjoerg { 864*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 865*4d6fc14bSjoerg this->set_value(__func_()); 866*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 867*4d6fc14bSjoerg } 868*4d6fc14bSjoerg catch (...) 869*4d6fc14bSjoerg { 870*4d6fc14bSjoerg this->set_exception(current_exception()); 871*4d6fc14bSjoerg } 872*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 873*4d6fc14bSjoerg} 874*4d6fc14bSjoerg 875*4d6fc14bSjoergtemplate <class _Fp> 876*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state<void, _Fp> 877*4d6fc14bSjoerg : public __assoc_sub_state 878*4d6fc14bSjoerg{ 879*4d6fc14bSjoerg typedef __assoc_sub_state base; 880*4d6fc14bSjoerg 881*4d6fc14bSjoerg _Fp __func_; 882*4d6fc14bSjoerg 883*4d6fc14bSjoergpublic: 884*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 885*4d6fc14bSjoerg explicit __deferred_assoc_state(_Fp&& __f); 886*4d6fc14bSjoerg 887*4d6fc14bSjoerg virtual void __execute(); 888*4d6fc14bSjoerg}; 889*4d6fc14bSjoerg 890*4d6fc14bSjoergtemplate <class _Fp> 891*4d6fc14bSjoerginline 892*4d6fc14bSjoerg__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f) 893*4d6fc14bSjoerg : __func_(_VSTD::forward<_Fp>(__f)) 894*4d6fc14bSjoerg{ 895*4d6fc14bSjoerg this->__set_deferred(); 896*4d6fc14bSjoerg} 897*4d6fc14bSjoerg 898*4d6fc14bSjoergtemplate <class _Fp> 899*4d6fc14bSjoergvoid 900*4d6fc14bSjoerg__deferred_assoc_state<void, _Fp>::__execute() 901*4d6fc14bSjoerg{ 902*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 903*4d6fc14bSjoerg try 904*4d6fc14bSjoerg { 905*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 906*4d6fc14bSjoerg __func_(); 907*4d6fc14bSjoerg this->set_value(); 908*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 909*4d6fc14bSjoerg } 910*4d6fc14bSjoerg catch (...) 911*4d6fc14bSjoerg { 912*4d6fc14bSjoerg this->set_exception(current_exception()); 913*4d6fc14bSjoerg } 914*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 915*4d6fc14bSjoerg} 916*4d6fc14bSjoerg 917*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 918*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state 919*4d6fc14bSjoerg : public __assoc_state<_Rp> 920*4d6fc14bSjoerg{ 921*4d6fc14bSjoerg typedef __assoc_state<_Rp> base; 922*4d6fc14bSjoerg 923*4d6fc14bSjoerg _Fp __func_; 924*4d6fc14bSjoerg 925*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 926*4d6fc14bSjoergpublic: 927*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 928*4d6fc14bSjoerg explicit __async_assoc_state(_Fp&& __f); 929*4d6fc14bSjoerg 930*4d6fc14bSjoerg virtual void __execute(); 931*4d6fc14bSjoerg}; 932*4d6fc14bSjoerg 933*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 934*4d6fc14bSjoerginline 935*4d6fc14bSjoerg__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f) 936*4d6fc14bSjoerg : __func_(_VSTD::forward<_Fp>(__f)) 937*4d6fc14bSjoerg{ 938*4d6fc14bSjoerg} 939*4d6fc14bSjoerg 940*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 941*4d6fc14bSjoergvoid 942*4d6fc14bSjoerg__async_assoc_state<_Rp, _Fp>::__execute() 943*4d6fc14bSjoerg{ 944*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 945*4d6fc14bSjoerg try 946*4d6fc14bSjoerg { 947*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 948*4d6fc14bSjoerg this->set_value(__func_()); 949*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 950*4d6fc14bSjoerg } 951*4d6fc14bSjoerg catch (...) 952*4d6fc14bSjoerg { 953*4d6fc14bSjoerg this->set_exception(current_exception()); 954*4d6fc14bSjoerg } 955*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 956*4d6fc14bSjoerg} 957*4d6fc14bSjoerg 958*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 959*4d6fc14bSjoergvoid 960*4d6fc14bSjoerg__async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT 961*4d6fc14bSjoerg{ 962*4d6fc14bSjoerg this->wait(); 963*4d6fc14bSjoerg base::__on_zero_shared(); 964*4d6fc14bSjoerg} 965*4d6fc14bSjoerg 966*4d6fc14bSjoergtemplate <class _Fp> 967*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state<void, _Fp> 968*4d6fc14bSjoerg : public __assoc_sub_state 969*4d6fc14bSjoerg{ 970*4d6fc14bSjoerg typedef __assoc_sub_state base; 971*4d6fc14bSjoerg 972*4d6fc14bSjoerg _Fp __func_; 973*4d6fc14bSjoerg 974*4d6fc14bSjoerg virtual void __on_zero_shared() _NOEXCEPT; 975*4d6fc14bSjoergpublic: 976*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 977*4d6fc14bSjoerg explicit __async_assoc_state(_Fp&& __f); 978*4d6fc14bSjoerg 979*4d6fc14bSjoerg virtual void __execute(); 980*4d6fc14bSjoerg}; 981*4d6fc14bSjoerg 982*4d6fc14bSjoergtemplate <class _Fp> 983*4d6fc14bSjoerginline 984*4d6fc14bSjoerg__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f) 985*4d6fc14bSjoerg : __func_(_VSTD::forward<_Fp>(__f)) 986*4d6fc14bSjoerg{ 987*4d6fc14bSjoerg} 988*4d6fc14bSjoerg 989*4d6fc14bSjoergtemplate <class _Fp> 990*4d6fc14bSjoergvoid 991*4d6fc14bSjoerg__async_assoc_state<void, _Fp>::__execute() 992*4d6fc14bSjoerg{ 993*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 994*4d6fc14bSjoerg try 995*4d6fc14bSjoerg { 996*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 997*4d6fc14bSjoerg __func_(); 998*4d6fc14bSjoerg this->set_value(); 999*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1000*4d6fc14bSjoerg } 1001*4d6fc14bSjoerg catch (...) 1002*4d6fc14bSjoerg { 1003*4d6fc14bSjoerg this->set_exception(current_exception()); 1004*4d6fc14bSjoerg } 1005*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1006*4d6fc14bSjoerg} 1007*4d6fc14bSjoerg 1008*4d6fc14bSjoergtemplate <class _Fp> 1009*4d6fc14bSjoergvoid 1010*4d6fc14bSjoerg__async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT 1011*4d6fc14bSjoerg{ 1012*4d6fc14bSjoerg this->wait(); 1013*4d6fc14bSjoerg base::__on_zero_shared(); 1014*4d6fc14bSjoerg} 1015*4d6fc14bSjoerg 1016*4d6fc14bSjoergtemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS promise; 1017*4d6fc14bSjoergtemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS shared_future; 1018*4d6fc14bSjoerg 1019*4d6fc14bSjoerg// future 1020*4d6fc14bSjoerg 1021*4d6fc14bSjoergtemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS future; 1022*4d6fc14bSjoerg 1023*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 1024*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY future<_Rp> 1025*4d6fc14bSjoerg__make_deferred_assoc_state(_Fp&& __f); 1026*4d6fc14bSjoerg 1027*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 1028*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY future<_Rp> 1029*4d6fc14bSjoerg__make_async_assoc_state(_Fp&& __f); 1030*4d6fc14bSjoerg 1031*4d6fc14bSjoergtemplate <class _Rp> 1032*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future 1033*4d6fc14bSjoerg{ 1034*4d6fc14bSjoerg __assoc_state<_Rp>* __state_; 1035*4d6fc14bSjoerg 1036*4d6fc14bSjoerg explicit future(__assoc_state<_Rp>* __state); 1037*4d6fc14bSjoerg 1038*4d6fc14bSjoerg template <class> friend class promise; 1039*4d6fc14bSjoerg template <class> friend class shared_future; 1040*4d6fc14bSjoerg 1041*4d6fc14bSjoerg template <class _R1, class _Fp> 1042*4d6fc14bSjoerg friend future<_R1> __make_deferred_assoc_state(_Fp&& __f); 1043*4d6fc14bSjoerg template <class _R1, class _Fp> 1044*4d6fc14bSjoerg friend future<_R1> __make_async_assoc_state(_Fp&& __f); 1045*4d6fc14bSjoerg 1046*4d6fc14bSjoergpublic: 1047*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1048*4d6fc14bSjoerg future() _NOEXCEPT : __state_(nullptr) {} 1049*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1050*4d6fc14bSjoerg future(future&& __rhs) _NOEXCEPT 1051*4d6fc14bSjoerg : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} 1052*4d6fc14bSjoerg future(const future&) = delete; 1053*4d6fc14bSjoerg future& operator=(const future&) = delete; 1054*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1055*4d6fc14bSjoerg future& operator=(future&& __rhs) _NOEXCEPT 1056*4d6fc14bSjoerg { 1057*4d6fc14bSjoerg future(_VSTD::move(__rhs)).swap(*this); 1058*4d6fc14bSjoerg return *this; 1059*4d6fc14bSjoerg } 1060*4d6fc14bSjoerg 1061*4d6fc14bSjoerg ~future(); 1062*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1063*4d6fc14bSjoerg shared_future<_Rp> share() _NOEXCEPT; 1064*4d6fc14bSjoerg 1065*4d6fc14bSjoerg // retrieving the value 1066*4d6fc14bSjoerg _Rp get(); 1067*4d6fc14bSjoerg 1068*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1069*4d6fc14bSjoerg void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 1070*4d6fc14bSjoerg 1071*4d6fc14bSjoerg // functions to check state 1072*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1073*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __state_ != nullptr;} 1074*4d6fc14bSjoerg 1075*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1076*4d6fc14bSjoerg void wait() const {__state_->wait();} 1077*4d6fc14bSjoerg template <class _Rep, class _Period> 1078*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1079*4d6fc14bSjoerg future_status 1080*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 1081*4d6fc14bSjoerg {return __state_->wait_for(__rel_time);} 1082*4d6fc14bSjoerg template <class _Clock, class _Duration> 1083*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1084*4d6fc14bSjoerg future_status 1085*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 1086*4d6fc14bSjoerg {return __state_->wait_until(__abs_time);} 1087*4d6fc14bSjoerg}; 1088*4d6fc14bSjoerg 1089*4d6fc14bSjoergtemplate <class _Rp> 1090*4d6fc14bSjoergfuture<_Rp>::future(__assoc_state<_Rp>* __state) 1091*4d6fc14bSjoerg : __state_(__state) 1092*4d6fc14bSjoerg{ 1093*4d6fc14bSjoerg __state_->__attach_future(); 1094*4d6fc14bSjoerg} 1095*4d6fc14bSjoerg 1096*4d6fc14bSjoergstruct __release_shared_count 1097*4d6fc14bSjoerg{ 1098*4d6fc14bSjoerg void operator()(__shared_count* p) {p->__release_shared();} 1099*4d6fc14bSjoerg}; 1100*4d6fc14bSjoerg 1101*4d6fc14bSjoergtemplate <class _Rp> 1102*4d6fc14bSjoergfuture<_Rp>::~future() 1103*4d6fc14bSjoerg{ 1104*4d6fc14bSjoerg if (__state_) 1105*4d6fc14bSjoerg __state_->__release_shared(); 1106*4d6fc14bSjoerg} 1107*4d6fc14bSjoerg 1108*4d6fc14bSjoergtemplate <class _Rp> 1109*4d6fc14bSjoerg_Rp 1110*4d6fc14bSjoergfuture<_Rp>::get() 1111*4d6fc14bSjoerg{ 1112*4d6fc14bSjoerg unique_ptr<__shared_count, __release_shared_count> __(__state_); 1113*4d6fc14bSjoerg __assoc_state<_Rp>* __s = __state_; 1114*4d6fc14bSjoerg __state_ = nullptr; 1115*4d6fc14bSjoerg return __s->move(); 1116*4d6fc14bSjoerg} 1117*4d6fc14bSjoerg 1118*4d6fc14bSjoergtemplate <class _Rp> 1119*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future<_Rp&> 1120*4d6fc14bSjoerg{ 1121*4d6fc14bSjoerg __assoc_state<_Rp&>* __state_; 1122*4d6fc14bSjoerg 1123*4d6fc14bSjoerg explicit future(__assoc_state<_Rp&>* __state); 1124*4d6fc14bSjoerg 1125*4d6fc14bSjoerg template <class> friend class promise; 1126*4d6fc14bSjoerg template <class> friend class shared_future; 1127*4d6fc14bSjoerg 1128*4d6fc14bSjoerg template <class _R1, class _Fp> 1129*4d6fc14bSjoerg friend future<_R1> __make_deferred_assoc_state(_Fp&& __f); 1130*4d6fc14bSjoerg template <class _R1, class _Fp> 1131*4d6fc14bSjoerg friend future<_R1> __make_async_assoc_state(_Fp&& __f); 1132*4d6fc14bSjoerg 1133*4d6fc14bSjoergpublic: 1134*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1135*4d6fc14bSjoerg future() _NOEXCEPT : __state_(nullptr) {} 1136*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1137*4d6fc14bSjoerg future(future&& __rhs) _NOEXCEPT 1138*4d6fc14bSjoerg : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} 1139*4d6fc14bSjoerg future(const future&) = delete; 1140*4d6fc14bSjoerg future& operator=(const future&) = delete; 1141*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1142*4d6fc14bSjoerg future& operator=(future&& __rhs) _NOEXCEPT 1143*4d6fc14bSjoerg { 1144*4d6fc14bSjoerg future(_VSTD::move(__rhs)).swap(*this); 1145*4d6fc14bSjoerg return *this; 1146*4d6fc14bSjoerg } 1147*4d6fc14bSjoerg 1148*4d6fc14bSjoerg ~future(); 1149*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1150*4d6fc14bSjoerg shared_future<_Rp&> share() _NOEXCEPT; 1151*4d6fc14bSjoerg 1152*4d6fc14bSjoerg // retrieving the value 1153*4d6fc14bSjoerg _Rp& get(); 1154*4d6fc14bSjoerg 1155*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1156*4d6fc14bSjoerg void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 1157*4d6fc14bSjoerg 1158*4d6fc14bSjoerg // functions to check state 1159*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1160*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __state_ != nullptr;} 1161*4d6fc14bSjoerg 1162*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1163*4d6fc14bSjoerg void wait() const {__state_->wait();} 1164*4d6fc14bSjoerg template <class _Rep, class _Period> 1165*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1166*4d6fc14bSjoerg future_status 1167*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 1168*4d6fc14bSjoerg {return __state_->wait_for(__rel_time);} 1169*4d6fc14bSjoerg template <class _Clock, class _Duration> 1170*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1171*4d6fc14bSjoerg future_status 1172*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 1173*4d6fc14bSjoerg {return __state_->wait_until(__abs_time);} 1174*4d6fc14bSjoerg}; 1175*4d6fc14bSjoerg 1176*4d6fc14bSjoergtemplate <class _Rp> 1177*4d6fc14bSjoergfuture<_Rp&>::future(__assoc_state<_Rp&>* __state) 1178*4d6fc14bSjoerg : __state_(__state) 1179*4d6fc14bSjoerg{ 1180*4d6fc14bSjoerg __state_->__attach_future(); 1181*4d6fc14bSjoerg} 1182*4d6fc14bSjoerg 1183*4d6fc14bSjoergtemplate <class _Rp> 1184*4d6fc14bSjoergfuture<_Rp&>::~future() 1185*4d6fc14bSjoerg{ 1186*4d6fc14bSjoerg if (__state_) 1187*4d6fc14bSjoerg __state_->__release_shared(); 1188*4d6fc14bSjoerg} 1189*4d6fc14bSjoerg 1190*4d6fc14bSjoergtemplate <class _Rp> 1191*4d6fc14bSjoerg_Rp& 1192*4d6fc14bSjoergfuture<_Rp&>::get() 1193*4d6fc14bSjoerg{ 1194*4d6fc14bSjoerg unique_ptr<__shared_count, __release_shared_count> __(__state_); 1195*4d6fc14bSjoerg __assoc_state<_Rp&>* __s = __state_; 1196*4d6fc14bSjoerg __state_ = nullptr; 1197*4d6fc14bSjoerg return __s->copy(); 1198*4d6fc14bSjoerg} 1199*4d6fc14bSjoerg 1200*4d6fc14bSjoergtemplate <> 1201*4d6fc14bSjoergclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE future<void> 1202*4d6fc14bSjoerg{ 1203*4d6fc14bSjoerg __assoc_sub_state* __state_; 1204*4d6fc14bSjoerg 1205*4d6fc14bSjoerg explicit future(__assoc_sub_state* __state); 1206*4d6fc14bSjoerg 1207*4d6fc14bSjoerg template <class> friend class promise; 1208*4d6fc14bSjoerg template <class> friend class shared_future; 1209*4d6fc14bSjoerg 1210*4d6fc14bSjoerg template <class _R1, class _Fp> 1211*4d6fc14bSjoerg friend future<_R1> __make_deferred_assoc_state(_Fp&& __f); 1212*4d6fc14bSjoerg template <class _R1, class _Fp> 1213*4d6fc14bSjoerg friend future<_R1> __make_async_assoc_state(_Fp&& __f); 1214*4d6fc14bSjoerg 1215*4d6fc14bSjoergpublic: 1216*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1217*4d6fc14bSjoerg future() _NOEXCEPT : __state_(nullptr) {} 1218*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1219*4d6fc14bSjoerg future(future&& __rhs) _NOEXCEPT 1220*4d6fc14bSjoerg : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} 1221*4d6fc14bSjoerg future(const future&) = delete; 1222*4d6fc14bSjoerg future& operator=(const future&) = delete; 1223*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1224*4d6fc14bSjoerg future& operator=(future&& __rhs) _NOEXCEPT 1225*4d6fc14bSjoerg { 1226*4d6fc14bSjoerg future(_VSTD::move(__rhs)).swap(*this); 1227*4d6fc14bSjoerg return *this; 1228*4d6fc14bSjoerg } 1229*4d6fc14bSjoerg 1230*4d6fc14bSjoerg ~future(); 1231*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1232*4d6fc14bSjoerg shared_future<void> share() _NOEXCEPT; 1233*4d6fc14bSjoerg 1234*4d6fc14bSjoerg // retrieving the value 1235*4d6fc14bSjoerg void get(); 1236*4d6fc14bSjoerg 1237*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1238*4d6fc14bSjoerg void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 1239*4d6fc14bSjoerg 1240*4d6fc14bSjoerg // functions to check state 1241*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1242*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __state_ != nullptr;} 1243*4d6fc14bSjoerg 1244*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1245*4d6fc14bSjoerg void wait() const {__state_->wait();} 1246*4d6fc14bSjoerg template <class _Rep, class _Period> 1247*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1248*4d6fc14bSjoerg future_status 1249*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 1250*4d6fc14bSjoerg {return __state_->wait_for(__rel_time);} 1251*4d6fc14bSjoerg template <class _Clock, class _Duration> 1252*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1253*4d6fc14bSjoerg future_status 1254*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 1255*4d6fc14bSjoerg {return __state_->wait_until(__abs_time);} 1256*4d6fc14bSjoerg}; 1257*4d6fc14bSjoerg 1258*4d6fc14bSjoergtemplate <class _Rp> 1259*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1260*4d6fc14bSjoergvoid 1261*4d6fc14bSjoergswap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT 1262*4d6fc14bSjoerg{ 1263*4d6fc14bSjoerg __x.swap(__y); 1264*4d6fc14bSjoerg} 1265*4d6fc14bSjoerg 1266*4d6fc14bSjoerg// promise<R> 1267*4d6fc14bSjoerg 1268*4d6fc14bSjoergtemplate <class _Callable> class packaged_task; 1269*4d6fc14bSjoerg 1270*4d6fc14bSjoergtemplate <class _Rp> 1271*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise 1272*4d6fc14bSjoerg{ 1273*4d6fc14bSjoerg __assoc_state<_Rp>* __state_; 1274*4d6fc14bSjoerg 1275*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1276*4d6fc14bSjoerg explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {} 1277*4d6fc14bSjoerg 1278*4d6fc14bSjoerg template <class> friend class packaged_task; 1279*4d6fc14bSjoergpublic: 1280*4d6fc14bSjoerg promise(); 1281*4d6fc14bSjoerg template <class _Alloc> 1282*4d6fc14bSjoerg promise(allocator_arg_t, const _Alloc& __a); 1283*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1284*4d6fc14bSjoerg promise(promise&& __rhs) _NOEXCEPT 1285*4d6fc14bSjoerg : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} 1286*4d6fc14bSjoerg promise(const promise& __rhs) = delete; 1287*4d6fc14bSjoerg ~promise(); 1288*4d6fc14bSjoerg 1289*4d6fc14bSjoerg // assignment 1290*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1291*4d6fc14bSjoerg promise& operator=(promise&& __rhs) _NOEXCEPT 1292*4d6fc14bSjoerg { 1293*4d6fc14bSjoerg promise(_VSTD::move(__rhs)).swap(*this); 1294*4d6fc14bSjoerg return *this; 1295*4d6fc14bSjoerg } 1296*4d6fc14bSjoerg promise& operator=(const promise& __rhs) = delete; 1297*4d6fc14bSjoerg 1298*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1299*4d6fc14bSjoerg void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 1300*4d6fc14bSjoerg 1301*4d6fc14bSjoerg // retrieving the result 1302*4d6fc14bSjoerg future<_Rp> get_future(); 1303*4d6fc14bSjoerg 1304*4d6fc14bSjoerg // setting the result 1305*4d6fc14bSjoerg void set_value(const _Rp& __r); 1306*4d6fc14bSjoerg void set_value(_Rp&& __r); 1307*4d6fc14bSjoerg void set_exception(exception_ptr __p); 1308*4d6fc14bSjoerg 1309*4d6fc14bSjoerg // setting the result with deferred notification 1310*4d6fc14bSjoerg void set_value_at_thread_exit(const _Rp& __r); 1311*4d6fc14bSjoerg void set_value_at_thread_exit(_Rp&& __r); 1312*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr __p); 1313*4d6fc14bSjoerg}; 1314*4d6fc14bSjoerg 1315*4d6fc14bSjoergtemplate <class _Rp> 1316*4d6fc14bSjoergpromise<_Rp>::promise() 1317*4d6fc14bSjoerg : __state_(new __assoc_state<_Rp>) 1318*4d6fc14bSjoerg{ 1319*4d6fc14bSjoerg} 1320*4d6fc14bSjoerg 1321*4d6fc14bSjoergtemplate <class _Rp> 1322*4d6fc14bSjoergtemplate <class _Alloc> 1323*4d6fc14bSjoergpromise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0) 1324*4d6fc14bSjoerg{ 1325*4d6fc14bSjoerg typedef __assoc_state_alloc<_Rp, _Alloc> _State; 1326*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2; 1327*4d6fc14bSjoerg typedef __allocator_destructor<_A2> _D2; 1328*4d6fc14bSjoerg _A2 __a(__a0); 1329*4d6fc14bSjoerg unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1)); 1330*4d6fc14bSjoerg ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0); 1331*4d6fc14bSjoerg __state_ = _VSTD::addressof(*__hold.release()); 1332*4d6fc14bSjoerg} 1333*4d6fc14bSjoerg 1334*4d6fc14bSjoergtemplate <class _Rp> 1335*4d6fc14bSjoergpromise<_Rp>::~promise() 1336*4d6fc14bSjoerg{ 1337*4d6fc14bSjoerg if (__state_) 1338*4d6fc14bSjoerg { 1339*4d6fc14bSjoerg if (!__state_->__has_value() && __state_->use_count() > 1) 1340*4d6fc14bSjoerg __state_->set_exception(make_exception_ptr( 1341*4d6fc14bSjoerg future_error(make_error_code(future_errc::broken_promise)) 1342*4d6fc14bSjoerg )); 1343*4d6fc14bSjoerg __state_->__release_shared(); 1344*4d6fc14bSjoerg } 1345*4d6fc14bSjoerg} 1346*4d6fc14bSjoerg 1347*4d6fc14bSjoergtemplate <class _Rp> 1348*4d6fc14bSjoergfuture<_Rp> 1349*4d6fc14bSjoergpromise<_Rp>::get_future() 1350*4d6fc14bSjoerg{ 1351*4d6fc14bSjoerg if (__state_ == nullptr) 1352*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1353*4d6fc14bSjoerg return future<_Rp>(__state_); 1354*4d6fc14bSjoerg} 1355*4d6fc14bSjoerg 1356*4d6fc14bSjoergtemplate <class _Rp> 1357*4d6fc14bSjoergvoid 1358*4d6fc14bSjoergpromise<_Rp>::set_value(const _Rp& __r) 1359*4d6fc14bSjoerg{ 1360*4d6fc14bSjoerg if (__state_ == nullptr) 1361*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1362*4d6fc14bSjoerg __state_->set_value(__r); 1363*4d6fc14bSjoerg} 1364*4d6fc14bSjoerg 1365*4d6fc14bSjoergtemplate <class _Rp> 1366*4d6fc14bSjoergvoid 1367*4d6fc14bSjoergpromise<_Rp>::set_value(_Rp&& __r) 1368*4d6fc14bSjoerg{ 1369*4d6fc14bSjoerg if (__state_ == nullptr) 1370*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1371*4d6fc14bSjoerg __state_->set_value(_VSTD::move(__r)); 1372*4d6fc14bSjoerg} 1373*4d6fc14bSjoerg 1374*4d6fc14bSjoergtemplate <class _Rp> 1375*4d6fc14bSjoergvoid 1376*4d6fc14bSjoergpromise<_Rp>::set_exception(exception_ptr __p) 1377*4d6fc14bSjoerg{ 1378*4d6fc14bSjoerg _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" ); 1379*4d6fc14bSjoerg if (__state_ == nullptr) 1380*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1381*4d6fc14bSjoerg __state_->set_exception(__p); 1382*4d6fc14bSjoerg} 1383*4d6fc14bSjoerg 1384*4d6fc14bSjoergtemplate <class _Rp> 1385*4d6fc14bSjoergvoid 1386*4d6fc14bSjoergpromise<_Rp>::set_value_at_thread_exit(const _Rp& __r) 1387*4d6fc14bSjoerg{ 1388*4d6fc14bSjoerg if (__state_ == nullptr) 1389*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1390*4d6fc14bSjoerg __state_->set_value_at_thread_exit(__r); 1391*4d6fc14bSjoerg} 1392*4d6fc14bSjoerg 1393*4d6fc14bSjoergtemplate <class _Rp> 1394*4d6fc14bSjoergvoid 1395*4d6fc14bSjoergpromise<_Rp>::set_value_at_thread_exit(_Rp&& __r) 1396*4d6fc14bSjoerg{ 1397*4d6fc14bSjoerg if (__state_ == nullptr) 1398*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1399*4d6fc14bSjoerg __state_->set_value_at_thread_exit(_VSTD::move(__r)); 1400*4d6fc14bSjoerg} 1401*4d6fc14bSjoerg 1402*4d6fc14bSjoergtemplate <class _Rp> 1403*4d6fc14bSjoergvoid 1404*4d6fc14bSjoergpromise<_Rp>::set_exception_at_thread_exit(exception_ptr __p) 1405*4d6fc14bSjoerg{ 1406*4d6fc14bSjoerg _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" ); 1407*4d6fc14bSjoerg if (__state_ == nullptr) 1408*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1409*4d6fc14bSjoerg __state_->set_exception_at_thread_exit(__p); 1410*4d6fc14bSjoerg} 1411*4d6fc14bSjoerg 1412*4d6fc14bSjoerg// promise<R&> 1413*4d6fc14bSjoerg 1414*4d6fc14bSjoergtemplate <class _Rp> 1415*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<_Rp&> 1416*4d6fc14bSjoerg{ 1417*4d6fc14bSjoerg __assoc_state<_Rp&>* __state_; 1418*4d6fc14bSjoerg 1419*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1420*4d6fc14bSjoerg explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {} 1421*4d6fc14bSjoerg 1422*4d6fc14bSjoerg template <class> friend class packaged_task; 1423*4d6fc14bSjoerg 1424*4d6fc14bSjoergpublic: 1425*4d6fc14bSjoerg promise(); 1426*4d6fc14bSjoerg template <class _Allocator> 1427*4d6fc14bSjoerg promise(allocator_arg_t, const _Allocator& __a); 1428*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1429*4d6fc14bSjoerg promise(promise&& __rhs) _NOEXCEPT 1430*4d6fc14bSjoerg : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} 1431*4d6fc14bSjoerg promise(const promise& __rhs) = delete; 1432*4d6fc14bSjoerg ~promise(); 1433*4d6fc14bSjoerg 1434*4d6fc14bSjoerg // assignment 1435*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1436*4d6fc14bSjoerg promise& operator=(promise&& __rhs) _NOEXCEPT 1437*4d6fc14bSjoerg { 1438*4d6fc14bSjoerg promise(_VSTD::move(__rhs)).swap(*this); 1439*4d6fc14bSjoerg return *this; 1440*4d6fc14bSjoerg } 1441*4d6fc14bSjoerg promise& operator=(const promise& __rhs) = delete; 1442*4d6fc14bSjoerg 1443*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1444*4d6fc14bSjoerg void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 1445*4d6fc14bSjoerg 1446*4d6fc14bSjoerg // retrieving the result 1447*4d6fc14bSjoerg future<_Rp&> get_future(); 1448*4d6fc14bSjoerg 1449*4d6fc14bSjoerg // setting the result 1450*4d6fc14bSjoerg void set_value(_Rp& __r); 1451*4d6fc14bSjoerg void set_exception(exception_ptr __p); 1452*4d6fc14bSjoerg 1453*4d6fc14bSjoerg // setting the result with deferred notification 1454*4d6fc14bSjoerg void set_value_at_thread_exit(_Rp&); 1455*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr __p); 1456*4d6fc14bSjoerg}; 1457*4d6fc14bSjoerg 1458*4d6fc14bSjoergtemplate <class _Rp> 1459*4d6fc14bSjoergpromise<_Rp&>::promise() 1460*4d6fc14bSjoerg : __state_(new __assoc_state<_Rp&>) 1461*4d6fc14bSjoerg{ 1462*4d6fc14bSjoerg} 1463*4d6fc14bSjoerg 1464*4d6fc14bSjoergtemplate <class _Rp> 1465*4d6fc14bSjoergtemplate <class _Alloc> 1466*4d6fc14bSjoergpromise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0) 1467*4d6fc14bSjoerg{ 1468*4d6fc14bSjoerg typedef __assoc_state_alloc<_Rp&, _Alloc> _State; 1469*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2; 1470*4d6fc14bSjoerg typedef __allocator_destructor<_A2> _D2; 1471*4d6fc14bSjoerg _A2 __a(__a0); 1472*4d6fc14bSjoerg unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1)); 1473*4d6fc14bSjoerg ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0); 1474*4d6fc14bSjoerg __state_ = _VSTD::addressof(*__hold.release()); 1475*4d6fc14bSjoerg} 1476*4d6fc14bSjoerg 1477*4d6fc14bSjoergtemplate <class _Rp> 1478*4d6fc14bSjoergpromise<_Rp&>::~promise() 1479*4d6fc14bSjoerg{ 1480*4d6fc14bSjoerg if (__state_) 1481*4d6fc14bSjoerg { 1482*4d6fc14bSjoerg if (!__state_->__has_value() && __state_->use_count() > 1) 1483*4d6fc14bSjoerg __state_->set_exception(make_exception_ptr( 1484*4d6fc14bSjoerg future_error(make_error_code(future_errc::broken_promise)) 1485*4d6fc14bSjoerg )); 1486*4d6fc14bSjoerg __state_->__release_shared(); 1487*4d6fc14bSjoerg } 1488*4d6fc14bSjoerg} 1489*4d6fc14bSjoerg 1490*4d6fc14bSjoergtemplate <class _Rp> 1491*4d6fc14bSjoergfuture<_Rp&> 1492*4d6fc14bSjoergpromise<_Rp&>::get_future() 1493*4d6fc14bSjoerg{ 1494*4d6fc14bSjoerg if (__state_ == nullptr) 1495*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1496*4d6fc14bSjoerg return future<_Rp&>(__state_); 1497*4d6fc14bSjoerg} 1498*4d6fc14bSjoerg 1499*4d6fc14bSjoergtemplate <class _Rp> 1500*4d6fc14bSjoergvoid 1501*4d6fc14bSjoergpromise<_Rp&>::set_value(_Rp& __r) 1502*4d6fc14bSjoerg{ 1503*4d6fc14bSjoerg if (__state_ == nullptr) 1504*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1505*4d6fc14bSjoerg __state_->set_value(__r); 1506*4d6fc14bSjoerg} 1507*4d6fc14bSjoerg 1508*4d6fc14bSjoergtemplate <class _Rp> 1509*4d6fc14bSjoergvoid 1510*4d6fc14bSjoergpromise<_Rp&>::set_exception(exception_ptr __p) 1511*4d6fc14bSjoerg{ 1512*4d6fc14bSjoerg _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" ); 1513*4d6fc14bSjoerg if (__state_ == nullptr) 1514*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1515*4d6fc14bSjoerg __state_->set_exception(__p); 1516*4d6fc14bSjoerg} 1517*4d6fc14bSjoerg 1518*4d6fc14bSjoergtemplate <class _Rp> 1519*4d6fc14bSjoergvoid 1520*4d6fc14bSjoergpromise<_Rp&>::set_value_at_thread_exit(_Rp& __r) 1521*4d6fc14bSjoerg{ 1522*4d6fc14bSjoerg if (__state_ == nullptr) 1523*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1524*4d6fc14bSjoerg __state_->set_value_at_thread_exit(__r); 1525*4d6fc14bSjoerg} 1526*4d6fc14bSjoerg 1527*4d6fc14bSjoergtemplate <class _Rp> 1528*4d6fc14bSjoergvoid 1529*4d6fc14bSjoergpromise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p) 1530*4d6fc14bSjoerg{ 1531*4d6fc14bSjoerg _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" ); 1532*4d6fc14bSjoerg if (__state_ == nullptr) 1533*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1534*4d6fc14bSjoerg __state_->set_exception_at_thread_exit(__p); 1535*4d6fc14bSjoerg} 1536*4d6fc14bSjoerg 1537*4d6fc14bSjoerg// promise<void> 1538*4d6fc14bSjoerg 1539*4d6fc14bSjoergtemplate <> 1540*4d6fc14bSjoergclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<void> 1541*4d6fc14bSjoerg{ 1542*4d6fc14bSjoerg __assoc_sub_state* __state_; 1543*4d6fc14bSjoerg 1544*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1545*4d6fc14bSjoerg explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {} 1546*4d6fc14bSjoerg 1547*4d6fc14bSjoerg template <class> friend class packaged_task; 1548*4d6fc14bSjoerg 1549*4d6fc14bSjoergpublic: 1550*4d6fc14bSjoerg promise(); 1551*4d6fc14bSjoerg template <class _Allocator> 1552*4d6fc14bSjoerg _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS 1553*4d6fc14bSjoerg promise(allocator_arg_t, const _Allocator& __a); 1554*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1555*4d6fc14bSjoerg promise(promise&& __rhs) _NOEXCEPT 1556*4d6fc14bSjoerg : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;} 1557*4d6fc14bSjoerg promise(const promise& __rhs) = delete; 1558*4d6fc14bSjoerg ~promise(); 1559*4d6fc14bSjoerg 1560*4d6fc14bSjoerg // assignment 1561*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1562*4d6fc14bSjoerg promise& operator=(promise&& __rhs) _NOEXCEPT 1563*4d6fc14bSjoerg { 1564*4d6fc14bSjoerg promise(_VSTD::move(__rhs)).swap(*this); 1565*4d6fc14bSjoerg return *this; 1566*4d6fc14bSjoerg } 1567*4d6fc14bSjoerg promise& operator=(const promise& __rhs) = delete; 1568*4d6fc14bSjoerg 1569*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1570*4d6fc14bSjoerg void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 1571*4d6fc14bSjoerg 1572*4d6fc14bSjoerg // retrieving the result 1573*4d6fc14bSjoerg future<void> get_future(); 1574*4d6fc14bSjoerg 1575*4d6fc14bSjoerg // setting the result 1576*4d6fc14bSjoerg void set_value(); 1577*4d6fc14bSjoerg void set_exception(exception_ptr __p); 1578*4d6fc14bSjoerg 1579*4d6fc14bSjoerg // setting the result with deferred notification 1580*4d6fc14bSjoerg void set_value_at_thread_exit(); 1581*4d6fc14bSjoerg void set_exception_at_thread_exit(exception_ptr __p); 1582*4d6fc14bSjoerg}; 1583*4d6fc14bSjoerg 1584*4d6fc14bSjoergtemplate <class _Alloc> 1585*4d6fc14bSjoergpromise<void>::promise(allocator_arg_t, const _Alloc& __a0) 1586*4d6fc14bSjoerg{ 1587*4d6fc14bSjoerg typedef __assoc_sub_state_alloc<_Alloc> _State; 1588*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2; 1589*4d6fc14bSjoerg typedef __allocator_destructor<_A2> _D2; 1590*4d6fc14bSjoerg _A2 __a(__a0); 1591*4d6fc14bSjoerg unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1)); 1592*4d6fc14bSjoerg ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0); 1593*4d6fc14bSjoerg __state_ = _VSTD::addressof(*__hold.release()); 1594*4d6fc14bSjoerg} 1595*4d6fc14bSjoerg 1596*4d6fc14bSjoergtemplate <class _Rp> 1597*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 1598*4d6fc14bSjoergvoid 1599*4d6fc14bSjoergswap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT 1600*4d6fc14bSjoerg{ 1601*4d6fc14bSjoerg __x.swap(__y); 1602*4d6fc14bSjoerg} 1603*4d6fc14bSjoerg 1604*4d6fc14bSjoergtemplate <class _Rp, class _Alloc> 1605*4d6fc14bSjoerg struct _LIBCPP_TEMPLATE_VIS uses_allocator<promise<_Rp>, _Alloc> 1606*4d6fc14bSjoerg : public true_type {}; 1607*4d6fc14bSjoerg 1608*4d6fc14bSjoerg// packaged_task 1609*4d6fc14bSjoerg 1610*4d6fc14bSjoergtemplate<class _Fp> class __packaged_task_base; 1611*4d6fc14bSjoerg 1612*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1613*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_base<_Rp(_ArgTypes...)> 1614*4d6fc14bSjoerg{ 1615*4d6fc14bSjoerg __packaged_task_base(const __packaged_task_base&); 1616*4d6fc14bSjoerg __packaged_task_base& operator=(const __packaged_task_base&); 1617*4d6fc14bSjoergpublic: 1618*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1619*4d6fc14bSjoerg __packaged_task_base() {} 1620*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1621*4d6fc14bSjoerg virtual ~__packaged_task_base() {} 1622*4d6fc14bSjoerg virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0; 1623*4d6fc14bSjoerg virtual void destroy() = 0; 1624*4d6fc14bSjoerg virtual void destroy_deallocate() = 0; 1625*4d6fc14bSjoerg virtual _Rp operator()(_ArgTypes&& ...) = 0; 1626*4d6fc14bSjoerg}; 1627*4d6fc14bSjoerg 1628*4d6fc14bSjoergtemplate<class _FD, class _Alloc, class _FB> class __packaged_task_func; 1629*4d6fc14bSjoerg 1630*4d6fc14bSjoergtemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1631*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)> 1632*4d6fc14bSjoerg : public __packaged_task_base<_Rp(_ArgTypes...)> 1633*4d6fc14bSjoerg{ 1634*4d6fc14bSjoerg __compressed_pair<_Fp, _Alloc> __f_; 1635*4d6fc14bSjoergpublic: 1636*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1637*4d6fc14bSjoerg explicit __packaged_task_func(const _Fp& __f) : __f_(__f, __default_init_tag()) {} 1638*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1639*4d6fc14bSjoerg explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f), __default_init_tag()) {} 1640*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1641*4d6fc14bSjoerg __packaged_task_func(const _Fp& __f, const _Alloc& __a) 1642*4d6fc14bSjoerg : __f_(__f, __a) {} 1643*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1644*4d6fc14bSjoerg __packaged_task_func(_Fp&& __f, const _Alloc& __a) 1645*4d6fc14bSjoerg : __f_(_VSTD::move(__f), __a) {} 1646*4d6fc14bSjoerg virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT; 1647*4d6fc14bSjoerg virtual void destroy(); 1648*4d6fc14bSjoerg virtual void destroy_deallocate(); 1649*4d6fc14bSjoerg virtual _Rp operator()(_ArgTypes&& ... __args); 1650*4d6fc14bSjoerg}; 1651*4d6fc14bSjoerg 1652*4d6fc14bSjoergtemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1653*4d6fc14bSjoergvoid 1654*4d6fc14bSjoerg__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to( 1655*4d6fc14bSjoerg __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT 1656*4d6fc14bSjoerg{ 1657*4d6fc14bSjoerg ::new ((void*)__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second())); 1658*4d6fc14bSjoerg} 1659*4d6fc14bSjoerg 1660*4d6fc14bSjoergtemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1661*4d6fc14bSjoergvoid 1662*4d6fc14bSjoerg__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy() 1663*4d6fc14bSjoerg{ 1664*4d6fc14bSjoerg __f_.~__compressed_pair<_Fp, _Alloc>(); 1665*4d6fc14bSjoerg} 1666*4d6fc14bSjoerg 1667*4d6fc14bSjoergtemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1668*4d6fc14bSjoergvoid 1669*4d6fc14bSjoerg__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate() 1670*4d6fc14bSjoerg{ 1671*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, __packaged_task_func>::type _Ap; 1672*4d6fc14bSjoerg typedef allocator_traits<_Ap> _ATraits; 1673*4d6fc14bSjoerg typedef pointer_traits<typename _ATraits::pointer> _PTraits; 1674*4d6fc14bSjoerg _Ap __a(__f_.second()); 1675*4d6fc14bSjoerg __f_.~__compressed_pair<_Fp, _Alloc>(); 1676*4d6fc14bSjoerg __a.deallocate(_PTraits::pointer_to(*this), 1); 1677*4d6fc14bSjoerg} 1678*4d6fc14bSjoerg 1679*4d6fc14bSjoergtemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes> 1680*4d6fc14bSjoerg_Rp 1681*4d6fc14bSjoerg__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg) 1682*4d6fc14bSjoerg{ 1683*4d6fc14bSjoerg return _VSTD::__invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...); 1684*4d6fc14bSjoerg} 1685*4d6fc14bSjoerg 1686*4d6fc14bSjoergtemplate <class _Callable> class __packaged_task_function; 1687*4d6fc14bSjoerg 1688*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1689*4d6fc14bSjoergclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_function<_Rp(_ArgTypes...)> 1690*4d6fc14bSjoerg{ 1691*4d6fc14bSjoerg typedef __packaged_task_base<_Rp(_ArgTypes...)> __base; 1692*4d6fc14bSjoerg 1693*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY _LIBCPP_NO_CFI 1694*4d6fc14bSjoerg __base* __get_buf() { return (__base*)&__buf_; } 1695*4d6fc14bSjoerg 1696*4d6fc14bSjoerg typename aligned_storage<3*sizeof(void*)>::type __buf_; 1697*4d6fc14bSjoerg __base* __f_; 1698*4d6fc14bSjoerg 1699*4d6fc14bSjoergpublic: 1700*4d6fc14bSjoerg typedef _Rp result_type; 1701*4d6fc14bSjoerg 1702*4d6fc14bSjoerg // construct/copy/destroy: 1703*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1704*4d6fc14bSjoerg __packaged_task_function() _NOEXCEPT : __f_(nullptr) {} 1705*4d6fc14bSjoerg template<class _Fp> 1706*4d6fc14bSjoerg __packaged_task_function(_Fp&& __f); 1707*4d6fc14bSjoerg template<class _Fp, class _Alloc> 1708*4d6fc14bSjoerg __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f); 1709*4d6fc14bSjoerg 1710*4d6fc14bSjoerg __packaged_task_function(__packaged_task_function&&) _NOEXCEPT; 1711*4d6fc14bSjoerg __packaged_task_function& operator=(__packaged_task_function&&) _NOEXCEPT; 1712*4d6fc14bSjoerg 1713*4d6fc14bSjoerg __packaged_task_function(const __packaged_task_function&) = delete; 1714*4d6fc14bSjoerg __packaged_task_function& operator=(const __packaged_task_function&) = delete; 1715*4d6fc14bSjoerg 1716*4d6fc14bSjoerg ~__packaged_task_function(); 1717*4d6fc14bSjoerg 1718*4d6fc14bSjoerg void swap(__packaged_task_function&) _NOEXCEPT; 1719*4d6fc14bSjoerg 1720*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1721*4d6fc14bSjoerg _Rp operator()(_ArgTypes...) const; 1722*4d6fc14bSjoerg}; 1723*4d6fc14bSjoerg 1724*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1725*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) _NOEXCEPT 1726*4d6fc14bSjoerg{ 1727*4d6fc14bSjoerg if (__f.__f_ == nullptr) 1728*4d6fc14bSjoerg __f_ = nullptr; 1729*4d6fc14bSjoerg else if (__f.__f_ == __f.__get_buf()) 1730*4d6fc14bSjoerg { 1731*4d6fc14bSjoerg __f.__f_->__move_to(__get_buf()); 1732*4d6fc14bSjoerg __f_ = (__base*)&__buf_; 1733*4d6fc14bSjoerg } 1734*4d6fc14bSjoerg else 1735*4d6fc14bSjoerg { 1736*4d6fc14bSjoerg __f_ = __f.__f_; 1737*4d6fc14bSjoerg __f.__f_ = nullptr; 1738*4d6fc14bSjoerg } 1739*4d6fc14bSjoerg} 1740*4d6fc14bSjoerg 1741*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1742*4d6fc14bSjoergtemplate <class _Fp> 1743*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f) 1744*4d6fc14bSjoerg : __f_(nullptr) 1745*4d6fc14bSjoerg{ 1746*4d6fc14bSjoerg typedef typename remove_reference<typename decay<_Fp>::type>::type _FR; 1747*4d6fc14bSjoerg typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF; 1748*4d6fc14bSjoerg if (sizeof(_FF) <= sizeof(__buf_)) 1749*4d6fc14bSjoerg { 1750*4d6fc14bSjoerg ::new ((void*)&__buf_) _FF(_VSTD::forward<_Fp>(__f)); 1751*4d6fc14bSjoerg __f_ = (__base*)&__buf_; 1752*4d6fc14bSjoerg } 1753*4d6fc14bSjoerg else 1754*4d6fc14bSjoerg { 1755*4d6fc14bSjoerg typedef allocator<_FF> _Ap; 1756*4d6fc14bSjoerg _Ap __a; 1757*4d6fc14bSjoerg typedef __allocator_destructor<_Ap> _Dp; 1758*4d6fc14bSjoerg unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); 1759*4d6fc14bSjoerg ::new ((void*)__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a)); 1760*4d6fc14bSjoerg __f_ = __hold.release(); 1761*4d6fc14bSjoerg } 1762*4d6fc14bSjoerg} 1763*4d6fc14bSjoerg 1764*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1765*4d6fc14bSjoergtemplate <class _Fp, class _Alloc> 1766*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function( 1767*4d6fc14bSjoerg allocator_arg_t, const _Alloc& __a0, _Fp&& __f) 1768*4d6fc14bSjoerg : __f_(nullptr) 1769*4d6fc14bSjoerg{ 1770*4d6fc14bSjoerg typedef typename remove_reference<typename decay<_Fp>::type>::type _FR; 1771*4d6fc14bSjoerg typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF; 1772*4d6fc14bSjoerg if (sizeof(_FF) <= sizeof(__buf_)) 1773*4d6fc14bSjoerg { 1774*4d6fc14bSjoerg __f_ = (__base*)&__buf_; 1775*4d6fc14bSjoerg ::new ((void*)__f_) _FF(_VSTD::forward<_Fp>(__f)); 1776*4d6fc14bSjoerg } 1777*4d6fc14bSjoerg else 1778*4d6fc14bSjoerg { 1779*4d6fc14bSjoerg typedef typename __allocator_traits_rebind<_Alloc, _FF>::type _Ap; 1780*4d6fc14bSjoerg _Ap __a(__a0); 1781*4d6fc14bSjoerg typedef __allocator_destructor<_Ap> _Dp; 1782*4d6fc14bSjoerg unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1)); 1783*4d6fc14bSjoerg ::new ((void*)_VSTD::addressof(*__hold.get())) 1784*4d6fc14bSjoerg _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a)); 1785*4d6fc14bSjoerg __f_ = _VSTD::addressof(*__hold.release()); 1786*4d6fc14bSjoerg } 1787*4d6fc14bSjoerg} 1788*4d6fc14bSjoerg 1789*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1790*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>& 1791*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT 1792*4d6fc14bSjoerg{ 1793*4d6fc14bSjoerg if (__f_ == __get_buf()) 1794*4d6fc14bSjoerg __f_->destroy(); 1795*4d6fc14bSjoerg else if (__f_) 1796*4d6fc14bSjoerg __f_->destroy_deallocate(); 1797*4d6fc14bSjoerg __f_ = nullptr; 1798*4d6fc14bSjoerg if (__f.__f_ == nullptr) 1799*4d6fc14bSjoerg __f_ = nullptr; 1800*4d6fc14bSjoerg else if (__f.__f_ == __f.__get_buf()) 1801*4d6fc14bSjoerg { 1802*4d6fc14bSjoerg __f.__f_->__move_to(__get_buf()); 1803*4d6fc14bSjoerg __f_ = __get_buf(); 1804*4d6fc14bSjoerg } 1805*4d6fc14bSjoerg else 1806*4d6fc14bSjoerg { 1807*4d6fc14bSjoerg __f_ = __f.__f_; 1808*4d6fc14bSjoerg __f.__f_ = nullptr; 1809*4d6fc14bSjoerg } 1810*4d6fc14bSjoerg return *this; 1811*4d6fc14bSjoerg} 1812*4d6fc14bSjoerg 1813*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1814*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function() 1815*4d6fc14bSjoerg{ 1816*4d6fc14bSjoerg if (__f_ == __get_buf()) 1817*4d6fc14bSjoerg __f_->destroy(); 1818*4d6fc14bSjoerg else if (__f_) 1819*4d6fc14bSjoerg __f_->destroy_deallocate(); 1820*4d6fc14bSjoerg} 1821*4d6fc14bSjoerg 1822*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1823*4d6fc14bSjoerg_LIBCPP_NO_CFI 1824*4d6fc14bSjoergvoid 1825*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT 1826*4d6fc14bSjoerg{ 1827*4d6fc14bSjoerg if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_) 1828*4d6fc14bSjoerg { 1829*4d6fc14bSjoerg typename aligned_storage<sizeof(__buf_)>::type __tempbuf; 1830*4d6fc14bSjoerg __base* __t = (__base*)&__tempbuf; 1831*4d6fc14bSjoerg __f_->__move_to(__t); 1832*4d6fc14bSjoerg __f_->destroy(); 1833*4d6fc14bSjoerg __f_ = nullptr; 1834*4d6fc14bSjoerg __f.__f_->__move_to((__base*)&__buf_); 1835*4d6fc14bSjoerg __f.__f_->destroy(); 1836*4d6fc14bSjoerg __f.__f_ = nullptr; 1837*4d6fc14bSjoerg __f_ = (__base*)&__buf_; 1838*4d6fc14bSjoerg __t->__move_to((__base*)&__f.__buf_); 1839*4d6fc14bSjoerg __t->destroy(); 1840*4d6fc14bSjoerg __f.__f_ = (__base*)&__f.__buf_; 1841*4d6fc14bSjoerg } 1842*4d6fc14bSjoerg else if (__f_ == (__base*)&__buf_) 1843*4d6fc14bSjoerg { 1844*4d6fc14bSjoerg __f_->__move_to((__base*)&__f.__buf_); 1845*4d6fc14bSjoerg __f_->destroy(); 1846*4d6fc14bSjoerg __f_ = __f.__f_; 1847*4d6fc14bSjoerg __f.__f_ = (__base*)&__f.__buf_; 1848*4d6fc14bSjoerg } 1849*4d6fc14bSjoerg else if (__f.__f_ == (__base*)&__f.__buf_) 1850*4d6fc14bSjoerg { 1851*4d6fc14bSjoerg __f.__f_->__move_to((__base*)&__buf_); 1852*4d6fc14bSjoerg __f.__f_->destroy(); 1853*4d6fc14bSjoerg __f.__f_ = __f_; 1854*4d6fc14bSjoerg __f_ = (__base*)&__buf_; 1855*4d6fc14bSjoerg } 1856*4d6fc14bSjoerg else 1857*4d6fc14bSjoerg _VSTD::swap(__f_, __f.__f_); 1858*4d6fc14bSjoerg} 1859*4d6fc14bSjoerg 1860*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1861*4d6fc14bSjoerginline 1862*4d6fc14bSjoerg_Rp 1863*4d6fc14bSjoerg__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const 1864*4d6fc14bSjoerg{ 1865*4d6fc14bSjoerg return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...); 1866*4d6fc14bSjoerg} 1867*4d6fc14bSjoerg 1868*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1869*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<_Rp(_ArgTypes...)> 1870*4d6fc14bSjoerg{ 1871*4d6fc14bSjoergpublic: 1872*4d6fc14bSjoerg typedef _Rp result_type; // extension 1873*4d6fc14bSjoerg 1874*4d6fc14bSjoergprivate: 1875*4d6fc14bSjoerg __packaged_task_function<result_type(_ArgTypes...)> __f_; 1876*4d6fc14bSjoerg promise<result_type> __p_; 1877*4d6fc14bSjoerg 1878*4d6fc14bSjoergpublic: 1879*4d6fc14bSjoerg // construction and destruction 1880*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1881*4d6fc14bSjoerg packaged_task() _NOEXCEPT : __p_(nullptr) {} 1882*4d6fc14bSjoerg template <class _Fp, 1883*4d6fc14bSjoerg class = typename enable_if 1884*4d6fc14bSjoerg < 1885*4d6fc14bSjoerg !is_same< 1886*4d6fc14bSjoerg typename __uncvref<_Fp>::type, 1887*4d6fc14bSjoerg packaged_task 1888*4d6fc14bSjoerg >::value 1889*4d6fc14bSjoerg >::type 1890*4d6fc14bSjoerg > 1891*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1892*4d6fc14bSjoerg explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} 1893*4d6fc14bSjoerg template <class _Fp, class _Allocator, 1894*4d6fc14bSjoerg class = typename enable_if 1895*4d6fc14bSjoerg < 1896*4d6fc14bSjoerg !is_same< 1897*4d6fc14bSjoerg typename __uncvref<_Fp>::type, 1898*4d6fc14bSjoerg packaged_task 1899*4d6fc14bSjoerg >::value 1900*4d6fc14bSjoerg >::type 1901*4d6fc14bSjoerg > 1902*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1903*4d6fc14bSjoerg packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f) 1904*4d6fc14bSjoerg : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)), 1905*4d6fc14bSjoerg __p_(allocator_arg, __a) {} 1906*4d6fc14bSjoerg // ~packaged_task() = default; 1907*4d6fc14bSjoerg 1908*4d6fc14bSjoerg // no copy 1909*4d6fc14bSjoerg packaged_task(const packaged_task&) = delete; 1910*4d6fc14bSjoerg packaged_task& operator=(const packaged_task&) = delete; 1911*4d6fc14bSjoerg 1912*4d6fc14bSjoerg // move support 1913*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1914*4d6fc14bSjoerg packaged_task(packaged_task&& __other) _NOEXCEPT 1915*4d6fc14bSjoerg : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {} 1916*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1917*4d6fc14bSjoerg packaged_task& operator=(packaged_task&& __other) _NOEXCEPT 1918*4d6fc14bSjoerg { 1919*4d6fc14bSjoerg __f_ = _VSTD::move(__other.__f_); 1920*4d6fc14bSjoerg __p_ = _VSTD::move(__other.__p_); 1921*4d6fc14bSjoerg return *this; 1922*4d6fc14bSjoerg } 1923*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1924*4d6fc14bSjoerg void swap(packaged_task& __other) _NOEXCEPT 1925*4d6fc14bSjoerg { 1926*4d6fc14bSjoerg __f_.swap(__other.__f_); 1927*4d6fc14bSjoerg __p_.swap(__other.__p_); 1928*4d6fc14bSjoerg } 1929*4d6fc14bSjoerg 1930*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1931*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;} 1932*4d6fc14bSjoerg 1933*4d6fc14bSjoerg // result retrieval 1934*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 1935*4d6fc14bSjoerg future<result_type> get_future() {return __p_.get_future();} 1936*4d6fc14bSjoerg 1937*4d6fc14bSjoerg // execution 1938*4d6fc14bSjoerg void operator()(_ArgTypes... __args); 1939*4d6fc14bSjoerg void make_ready_at_thread_exit(_ArgTypes... __args); 1940*4d6fc14bSjoerg 1941*4d6fc14bSjoerg void reset(); 1942*4d6fc14bSjoerg}; 1943*4d6fc14bSjoerg 1944*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1945*4d6fc14bSjoergvoid 1946*4d6fc14bSjoergpackaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args) 1947*4d6fc14bSjoerg{ 1948*4d6fc14bSjoerg if (__p_.__state_ == nullptr) 1949*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1950*4d6fc14bSjoerg if (__p_.__state_->__has_value()) 1951*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 1952*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1953*4d6fc14bSjoerg try 1954*4d6fc14bSjoerg { 1955*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1956*4d6fc14bSjoerg __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...)); 1957*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1958*4d6fc14bSjoerg } 1959*4d6fc14bSjoerg catch (...) 1960*4d6fc14bSjoerg { 1961*4d6fc14bSjoerg __p_.set_exception(current_exception()); 1962*4d6fc14bSjoerg } 1963*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1964*4d6fc14bSjoerg} 1965*4d6fc14bSjoerg 1966*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1967*4d6fc14bSjoergvoid 1968*4d6fc14bSjoergpackaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args) 1969*4d6fc14bSjoerg{ 1970*4d6fc14bSjoerg if (__p_.__state_ == nullptr) 1971*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1972*4d6fc14bSjoerg if (__p_.__state_->__has_value()) 1973*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 1974*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1975*4d6fc14bSjoerg try 1976*4d6fc14bSjoerg { 1977*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1978*4d6fc14bSjoerg __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...)); 1979*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 1980*4d6fc14bSjoerg } 1981*4d6fc14bSjoerg catch (...) 1982*4d6fc14bSjoerg { 1983*4d6fc14bSjoerg __p_.set_exception_at_thread_exit(current_exception()); 1984*4d6fc14bSjoerg } 1985*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 1986*4d6fc14bSjoerg} 1987*4d6fc14bSjoerg 1988*4d6fc14bSjoergtemplate<class _Rp, class ..._ArgTypes> 1989*4d6fc14bSjoergvoid 1990*4d6fc14bSjoergpackaged_task<_Rp(_ArgTypes...)>::reset() 1991*4d6fc14bSjoerg{ 1992*4d6fc14bSjoerg if (!valid()) 1993*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 1994*4d6fc14bSjoerg __p_ = promise<result_type>(); 1995*4d6fc14bSjoerg} 1996*4d6fc14bSjoerg 1997*4d6fc14bSjoergtemplate<class ..._ArgTypes> 1998*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<void(_ArgTypes...)> 1999*4d6fc14bSjoerg{ 2000*4d6fc14bSjoergpublic: 2001*4d6fc14bSjoerg typedef void result_type; // extension 2002*4d6fc14bSjoerg 2003*4d6fc14bSjoergprivate: 2004*4d6fc14bSjoerg __packaged_task_function<result_type(_ArgTypes...)> __f_; 2005*4d6fc14bSjoerg promise<result_type> __p_; 2006*4d6fc14bSjoerg 2007*4d6fc14bSjoergpublic: 2008*4d6fc14bSjoerg // construction and destruction 2009*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2010*4d6fc14bSjoerg packaged_task() _NOEXCEPT : __p_(nullptr) {} 2011*4d6fc14bSjoerg template <class _Fp, 2012*4d6fc14bSjoerg class = typename enable_if 2013*4d6fc14bSjoerg < 2014*4d6fc14bSjoerg !is_same< 2015*4d6fc14bSjoerg typename __uncvref<_Fp>::type, 2016*4d6fc14bSjoerg packaged_task 2017*4d6fc14bSjoerg >::value 2018*4d6fc14bSjoerg >::type 2019*4d6fc14bSjoerg > 2020*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2021*4d6fc14bSjoerg explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {} 2022*4d6fc14bSjoerg template <class _Fp, class _Allocator, 2023*4d6fc14bSjoerg class = typename enable_if 2024*4d6fc14bSjoerg < 2025*4d6fc14bSjoerg !is_same< 2026*4d6fc14bSjoerg typename __uncvref<_Fp>::type, 2027*4d6fc14bSjoerg packaged_task 2028*4d6fc14bSjoerg >::value 2029*4d6fc14bSjoerg >::type 2030*4d6fc14bSjoerg > 2031*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2032*4d6fc14bSjoerg packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f) 2033*4d6fc14bSjoerg : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)), 2034*4d6fc14bSjoerg __p_(allocator_arg, __a) {} 2035*4d6fc14bSjoerg // ~packaged_task() = default; 2036*4d6fc14bSjoerg 2037*4d6fc14bSjoerg // no copy 2038*4d6fc14bSjoerg packaged_task(const packaged_task&) = delete; 2039*4d6fc14bSjoerg packaged_task& operator=(const packaged_task&) = delete; 2040*4d6fc14bSjoerg 2041*4d6fc14bSjoerg // move support 2042*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2043*4d6fc14bSjoerg packaged_task(packaged_task&& __other) _NOEXCEPT 2044*4d6fc14bSjoerg : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {} 2045*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2046*4d6fc14bSjoerg packaged_task& operator=(packaged_task&& __other) _NOEXCEPT 2047*4d6fc14bSjoerg { 2048*4d6fc14bSjoerg __f_ = _VSTD::move(__other.__f_); 2049*4d6fc14bSjoerg __p_ = _VSTD::move(__other.__p_); 2050*4d6fc14bSjoerg return *this; 2051*4d6fc14bSjoerg } 2052*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2053*4d6fc14bSjoerg void swap(packaged_task& __other) _NOEXCEPT 2054*4d6fc14bSjoerg { 2055*4d6fc14bSjoerg __f_.swap(__other.__f_); 2056*4d6fc14bSjoerg __p_.swap(__other.__p_); 2057*4d6fc14bSjoerg } 2058*4d6fc14bSjoerg 2059*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2060*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;} 2061*4d6fc14bSjoerg 2062*4d6fc14bSjoerg // result retrieval 2063*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2064*4d6fc14bSjoerg future<result_type> get_future() {return __p_.get_future();} 2065*4d6fc14bSjoerg 2066*4d6fc14bSjoerg // execution 2067*4d6fc14bSjoerg void operator()(_ArgTypes... __args); 2068*4d6fc14bSjoerg void make_ready_at_thread_exit(_ArgTypes... __args); 2069*4d6fc14bSjoerg 2070*4d6fc14bSjoerg void reset(); 2071*4d6fc14bSjoerg}; 2072*4d6fc14bSjoerg 2073*4d6fc14bSjoergtemplate<class ..._ArgTypes> 2074*4d6fc14bSjoergvoid 2075*4d6fc14bSjoergpackaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args) 2076*4d6fc14bSjoerg{ 2077*4d6fc14bSjoerg if (__p_.__state_ == nullptr) 2078*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 2079*4d6fc14bSjoerg if (__p_.__state_->__has_value()) 2080*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 2081*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2082*4d6fc14bSjoerg try 2083*4d6fc14bSjoerg { 2084*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2085*4d6fc14bSjoerg __f_(_VSTD::forward<_ArgTypes>(__args)...); 2086*4d6fc14bSjoerg __p_.set_value(); 2087*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2088*4d6fc14bSjoerg } 2089*4d6fc14bSjoerg catch (...) 2090*4d6fc14bSjoerg { 2091*4d6fc14bSjoerg __p_.set_exception(current_exception()); 2092*4d6fc14bSjoerg } 2093*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2094*4d6fc14bSjoerg} 2095*4d6fc14bSjoerg 2096*4d6fc14bSjoergtemplate<class ..._ArgTypes> 2097*4d6fc14bSjoergvoid 2098*4d6fc14bSjoergpackaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args) 2099*4d6fc14bSjoerg{ 2100*4d6fc14bSjoerg if (__p_.__state_ == nullptr) 2101*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 2102*4d6fc14bSjoerg if (__p_.__state_->__has_value()) 2103*4d6fc14bSjoerg __throw_future_error(future_errc::promise_already_satisfied); 2104*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2105*4d6fc14bSjoerg try 2106*4d6fc14bSjoerg { 2107*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2108*4d6fc14bSjoerg __f_(_VSTD::forward<_ArgTypes>(__args)...); 2109*4d6fc14bSjoerg __p_.set_value_at_thread_exit(); 2110*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2111*4d6fc14bSjoerg } 2112*4d6fc14bSjoerg catch (...) 2113*4d6fc14bSjoerg { 2114*4d6fc14bSjoerg __p_.set_exception_at_thread_exit(current_exception()); 2115*4d6fc14bSjoerg } 2116*4d6fc14bSjoerg#endif // _LIBCPP_NO_EXCEPTIONS 2117*4d6fc14bSjoerg} 2118*4d6fc14bSjoerg 2119*4d6fc14bSjoergtemplate<class ..._ArgTypes> 2120*4d6fc14bSjoergvoid 2121*4d6fc14bSjoergpackaged_task<void(_ArgTypes...)>::reset() 2122*4d6fc14bSjoerg{ 2123*4d6fc14bSjoerg if (!valid()) 2124*4d6fc14bSjoerg __throw_future_error(future_errc::no_state); 2125*4d6fc14bSjoerg __p_ = promise<result_type>(); 2126*4d6fc14bSjoerg} 2127*4d6fc14bSjoerg 2128*4d6fc14bSjoergtemplate <class _Rp, class... _ArgTypes> 2129*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2130*4d6fc14bSjoergvoid 2131*4d6fc14bSjoergswap(packaged_task<_Rp(_ArgTypes...)>& __x, packaged_task<_Rp(_ArgTypes...)>& __y) _NOEXCEPT 2132*4d6fc14bSjoerg{ 2133*4d6fc14bSjoerg __x.swap(__y); 2134*4d6fc14bSjoerg} 2135*4d6fc14bSjoerg 2136*4d6fc14bSjoergtemplate <class _Callable, class _Alloc> 2137*4d6fc14bSjoergstruct _LIBCPP_TEMPLATE_VIS uses_allocator<packaged_task<_Callable>, _Alloc> 2138*4d6fc14bSjoerg : public true_type {}; 2139*4d6fc14bSjoerg 2140*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 2141*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY future<_Rp> 2142*4d6fc14bSjoerg__make_deferred_assoc_state(_Fp&& __f) 2143*4d6fc14bSjoerg{ 2144*4d6fc14bSjoerg unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count> 2145*4d6fc14bSjoerg __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f))); 2146*4d6fc14bSjoerg return future<_Rp>(__h.get()); 2147*4d6fc14bSjoerg} 2148*4d6fc14bSjoerg 2149*4d6fc14bSjoergtemplate <class _Rp, class _Fp> 2150*4d6fc14bSjoerg_LIBCPP_INLINE_VISIBILITY future<_Rp> 2151*4d6fc14bSjoerg__make_async_assoc_state(_Fp&& __f) 2152*4d6fc14bSjoerg{ 2153*4d6fc14bSjoerg unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count> 2154*4d6fc14bSjoerg __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f))); 2155*4d6fc14bSjoerg _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach(); 2156*4d6fc14bSjoerg return future<_Rp>(__h.get()); 2157*4d6fc14bSjoerg} 2158*4d6fc14bSjoerg 2159*4d6fc14bSjoerg#ifndef _LIBCPP_CXX03_LANG 2160*4d6fc14bSjoerg 2161*4d6fc14bSjoergtemplate <class _Fp, class... _Args> 2162*4d6fc14bSjoergclass _LIBCPP_HIDDEN __async_func 2163*4d6fc14bSjoerg{ 2164*4d6fc14bSjoerg tuple<_Fp, _Args...> __f_; 2165*4d6fc14bSjoerg 2166*4d6fc14bSjoergpublic: 2167*4d6fc14bSjoerg typedef typename __invoke_of<_Fp, _Args...>::type _Rp; 2168*4d6fc14bSjoerg 2169*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2170*4d6fc14bSjoerg explicit __async_func(_Fp&& __f, _Args&&... __args) 2171*4d6fc14bSjoerg : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {} 2172*4d6fc14bSjoerg 2173*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2174*4d6fc14bSjoerg __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {} 2175*4d6fc14bSjoerg 2176*4d6fc14bSjoerg _Rp operator()() 2177*4d6fc14bSjoerg { 2178*4d6fc14bSjoerg typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index; 2179*4d6fc14bSjoerg return __execute(_Index()); 2180*4d6fc14bSjoerg } 2181*4d6fc14bSjoergprivate: 2182*4d6fc14bSjoerg template <size_t ..._Indices> 2183*4d6fc14bSjoerg _Rp 2184*4d6fc14bSjoerg __execute(__tuple_indices<_Indices...>) 2185*4d6fc14bSjoerg { 2186*4d6fc14bSjoerg return _VSTD::__invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...); 2187*4d6fc14bSjoerg } 2188*4d6fc14bSjoerg}; 2189*4d6fc14bSjoerg 2190*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY bool __does_policy_contain(launch __policy, launch __value ) 2191*4d6fc14bSjoerg{ return (int(__policy) & int(__value)) != 0; } 2192*4d6fc14bSjoerg 2193*4d6fc14bSjoergtemplate <class _Fp, class... _Args> 2194*4d6fc14bSjoerg_LIBCPP_NODISCARD_AFTER_CXX17 2195*4d6fc14bSjoergfuture<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type> 2196*4d6fc14bSjoergasync(launch __policy, _Fp&& __f, _Args&&... __args) 2197*4d6fc14bSjoerg{ 2198*4d6fc14bSjoerg typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF; 2199*4d6fc14bSjoerg typedef typename _BF::_Rp _Rp; 2200*4d6fc14bSjoerg 2201*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2202*4d6fc14bSjoerg try 2203*4d6fc14bSjoerg { 2204*4d6fc14bSjoerg#endif 2205*4d6fc14bSjoerg if (__does_policy_contain(__policy, launch::async)) 2206*4d6fc14bSjoerg return _VSTD::__make_async_assoc_state<_Rp>(_BF(_VSTD::__decay_copy(_VSTD::forward<_Fp>(__f)), 2207*4d6fc14bSjoerg _VSTD::__decay_copy(_VSTD::forward<_Args>(__args))...)); 2208*4d6fc14bSjoerg#ifndef _LIBCPP_NO_EXCEPTIONS 2209*4d6fc14bSjoerg } 2210*4d6fc14bSjoerg catch ( ... ) { if (__policy == launch::async) throw ; } 2211*4d6fc14bSjoerg#endif 2212*4d6fc14bSjoerg 2213*4d6fc14bSjoerg if (__does_policy_contain(__policy, launch::deferred)) 2214*4d6fc14bSjoerg return _VSTD::__make_deferred_assoc_state<_Rp>(_BF(_VSTD::__decay_copy(_VSTD::forward<_Fp>(__f)), 2215*4d6fc14bSjoerg _VSTD::__decay_copy(_VSTD::forward<_Args>(__args))...)); 2216*4d6fc14bSjoerg return future<_Rp>{}; 2217*4d6fc14bSjoerg} 2218*4d6fc14bSjoerg 2219*4d6fc14bSjoergtemplate <class _Fp, class... _Args> 2220*4d6fc14bSjoerg_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY 2221*4d6fc14bSjoergfuture<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type> 2222*4d6fc14bSjoergasync(_Fp&& __f, _Args&&... __args) 2223*4d6fc14bSjoerg{ 2224*4d6fc14bSjoerg return _VSTD::async(launch::any, _VSTD::forward<_Fp>(__f), 2225*4d6fc14bSjoerg _VSTD::forward<_Args>(__args)...); 2226*4d6fc14bSjoerg} 2227*4d6fc14bSjoerg 2228*4d6fc14bSjoerg#endif // C++03 2229*4d6fc14bSjoerg 2230*4d6fc14bSjoerg// shared_future 2231*4d6fc14bSjoerg 2232*4d6fc14bSjoergtemplate <class _Rp> 2233*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS shared_future 2234*4d6fc14bSjoerg{ 2235*4d6fc14bSjoerg __assoc_state<_Rp>* __state_; 2236*4d6fc14bSjoerg 2237*4d6fc14bSjoergpublic: 2238*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2239*4d6fc14bSjoerg shared_future() _NOEXCEPT : __state_(nullptr) {} 2240*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2241*4d6fc14bSjoerg shared_future(const shared_future& __rhs) _NOEXCEPT : __state_(__rhs.__state_) 2242*4d6fc14bSjoerg {if (__state_) __state_->__add_shared();} 2243*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2244*4d6fc14bSjoerg shared_future(future<_Rp>&& __f) _NOEXCEPT : __state_(__f.__state_) 2245*4d6fc14bSjoerg {__f.__state_ = nullptr;} 2246*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2247*4d6fc14bSjoerg shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_) 2248*4d6fc14bSjoerg {__rhs.__state_ = nullptr;} 2249*4d6fc14bSjoerg ~shared_future(); 2250*4d6fc14bSjoerg shared_future& operator=(const shared_future& __rhs) _NOEXCEPT; 2251*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2252*4d6fc14bSjoerg shared_future& operator=(shared_future&& __rhs) _NOEXCEPT 2253*4d6fc14bSjoerg { 2254*4d6fc14bSjoerg shared_future(_VSTD::move(__rhs)).swap(*this); 2255*4d6fc14bSjoerg return *this; 2256*4d6fc14bSjoerg } 2257*4d6fc14bSjoerg 2258*4d6fc14bSjoerg // retrieving the value 2259*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2260*4d6fc14bSjoerg const _Rp& get() const {return __state_->copy();} 2261*4d6fc14bSjoerg 2262*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2263*4d6fc14bSjoerg void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 2264*4d6fc14bSjoerg 2265*4d6fc14bSjoerg // functions to check state 2266*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2267*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __state_ != nullptr;} 2268*4d6fc14bSjoerg 2269*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2270*4d6fc14bSjoerg void wait() const {__state_->wait();} 2271*4d6fc14bSjoerg template <class _Rep, class _Period> 2272*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2273*4d6fc14bSjoerg future_status 2274*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 2275*4d6fc14bSjoerg {return __state_->wait_for(__rel_time);} 2276*4d6fc14bSjoerg template <class _Clock, class _Duration> 2277*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2278*4d6fc14bSjoerg future_status 2279*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 2280*4d6fc14bSjoerg {return __state_->wait_until(__abs_time);} 2281*4d6fc14bSjoerg}; 2282*4d6fc14bSjoerg 2283*4d6fc14bSjoergtemplate <class _Rp> 2284*4d6fc14bSjoergshared_future<_Rp>::~shared_future() 2285*4d6fc14bSjoerg{ 2286*4d6fc14bSjoerg if (__state_) 2287*4d6fc14bSjoerg __state_->__release_shared(); 2288*4d6fc14bSjoerg} 2289*4d6fc14bSjoerg 2290*4d6fc14bSjoergtemplate <class _Rp> 2291*4d6fc14bSjoergshared_future<_Rp>& 2292*4d6fc14bSjoergshared_future<_Rp>::operator=(const shared_future& __rhs) _NOEXCEPT 2293*4d6fc14bSjoerg{ 2294*4d6fc14bSjoerg if (__rhs.__state_) 2295*4d6fc14bSjoerg __rhs.__state_->__add_shared(); 2296*4d6fc14bSjoerg if (__state_) 2297*4d6fc14bSjoerg __state_->__release_shared(); 2298*4d6fc14bSjoerg __state_ = __rhs.__state_; 2299*4d6fc14bSjoerg return *this; 2300*4d6fc14bSjoerg} 2301*4d6fc14bSjoerg 2302*4d6fc14bSjoergtemplate <class _Rp> 2303*4d6fc14bSjoergclass _LIBCPP_TEMPLATE_VIS shared_future<_Rp&> 2304*4d6fc14bSjoerg{ 2305*4d6fc14bSjoerg __assoc_state<_Rp&>* __state_; 2306*4d6fc14bSjoerg 2307*4d6fc14bSjoergpublic: 2308*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2309*4d6fc14bSjoerg shared_future() _NOEXCEPT : __state_(nullptr) {} 2310*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2311*4d6fc14bSjoerg shared_future(const shared_future& __rhs) : __state_(__rhs.__state_) 2312*4d6fc14bSjoerg {if (__state_) __state_->__add_shared();} 2313*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2314*4d6fc14bSjoerg shared_future(future<_Rp&>&& __f) _NOEXCEPT : __state_(__f.__state_) 2315*4d6fc14bSjoerg {__f.__state_ = nullptr;} 2316*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2317*4d6fc14bSjoerg shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_) 2318*4d6fc14bSjoerg {__rhs.__state_ = nullptr;} 2319*4d6fc14bSjoerg ~shared_future(); 2320*4d6fc14bSjoerg shared_future& operator=(const shared_future& __rhs); 2321*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2322*4d6fc14bSjoerg shared_future& operator=(shared_future&& __rhs) _NOEXCEPT 2323*4d6fc14bSjoerg { 2324*4d6fc14bSjoerg shared_future(_VSTD::move(__rhs)).swap(*this); 2325*4d6fc14bSjoerg return *this; 2326*4d6fc14bSjoerg } 2327*4d6fc14bSjoerg 2328*4d6fc14bSjoerg // retrieving the value 2329*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2330*4d6fc14bSjoerg _Rp& get() const {return __state_->copy();} 2331*4d6fc14bSjoerg 2332*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2333*4d6fc14bSjoerg void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 2334*4d6fc14bSjoerg 2335*4d6fc14bSjoerg // functions to check state 2336*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2337*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __state_ != nullptr;} 2338*4d6fc14bSjoerg 2339*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2340*4d6fc14bSjoerg void wait() const {__state_->wait();} 2341*4d6fc14bSjoerg template <class _Rep, class _Period> 2342*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2343*4d6fc14bSjoerg future_status 2344*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 2345*4d6fc14bSjoerg {return __state_->wait_for(__rel_time);} 2346*4d6fc14bSjoerg template <class _Clock, class _Duration> 2347*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2348*4d6fc14bSjoerg future_status 2349*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 2350*4d6fc14bSjoerg {return __state_->wait_until(__abs_time);} 2351*4d6fc14bSjoerg}; 2352*4d6fc14bSjoerg 2353*4d6fc14bSjoergtemplate <class _Rp> 2354*4d6fc14bSjoergshared_future<_Rp&>::~shared_future() 2355*4d6fc14bSjoerg{ 2356*4d6fc14bSjoerg if (__state_) 2357*4d6fc14bSjoerg __state_->__release_shared(); 2358*4d6fc14bSjoerg} 2359*4d6fc14bSjoerg 2360*4d6fc14bSjoergtemplate <class _Rp> 2361*4d6fc14bSjoergshared_future<_Rp&>& 2362*4d6fc14bSjoergshared_future<_Rp&>::operator=(const shared_future& __rhs) 2363*4d6fc14bSjoerg{ 2364*4d6fc14bSjoerg if (__rhs.__state_) 2365*4d6fc14bSjoerg __rhs.__state_->__add_shared(); 2366*4d6fc14bSjoerg if (__state_) 2367*4d6fc14bSjoerg __state_->__release_shared(); 2368*4d6fc14bSjoerg __state_ = __rhs.__state_; 2369*4d6fc14bSjoerg return *this; 2370*4d6fc14bSjoerg} 2371*4d6fc14bSjoerg 2372*4d6fc14bSjoergtemplate <> 2373*4d6fc14bSjoergclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE shared_future<void> 2374*4d6fc14bSjoerg{ 2375*4d6fc14bSjoerg __assoc_sub_state* __state_; 2376*4d6fc14bSjoerg 2377*4d6fc14bSjoergpublic: 2378*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2379*4d6fc14bSjoerg shared_future() _NOEXCEPT : __state_(nullptr) {} 2380*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2381*4d6fc14bSjoerg shared_future(const shared_future& __rhs) : __state_(__rhs.__state_) 2382*4d6fc14bSjoerg {if (__state_) __state_->__add_shared();} 2383*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2384*4d6fc14bSjoerg shared_future(future<void>&& __f) _NOEXCEPT : __state_(__f.__state_) 2385*4d6fc14bSjoerg {__f.__state_ = nullptr;} 2386*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2387*4d6fc14bSjoerg shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_) 2388*4d6fc14bSjoerg {__rhs.__state_ = nullptr;} 2389*4d6fc14bSjoerg ~shared_future(); 2390*4d6fc14bSjoerg shared_future& operator=(const shared_future& __rhs); 2391*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2392*4d6fc14bSjoerg shared_future& operator=(shared_future&& __rhs) _NOEXCEPT 2393*4d6fc14bSjoerg { 2394*4d6fc14bSjoerg shared_future(_VSTD::move(__rhs)).swap(*this); 2395*4d6fc14bSjoerg return *this; 2396*4d6fc14bSjoerg } 2397*4d6fc14bSjoerg 2398*4d6fc14bSjoerg // retrieving the value 2399*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2400*4d6fc14bSjoerg void get() const {__state_->copy();} 2401*4d6fc14bSjoerg 2402*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2403*4d6fc14bSjoerg void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);} 2404*4d6fc14bSjoerg 2405*4d6fc14bSjoerg // functions to check state 2406*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2407*4d6fc14bSjoerg bool valid() const _NOEXCEPT {return __state_ != nullptr;} 2408*4d6fc14bSjoerg 2409*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2410*4d6fc14bSjoerg void wait() const {__state_->wait();} 2411*4d6fc14bSjoerg template <class _Rep, class _Period> 2412*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2413*4d6fc14bSjoerg future_status 2414*4d6fc14bSjoerg wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const 2415*4d6fc14bSjoerg {return __state_->wait_for(__rel_time);} 2416*4d6fc14bSjoerg template <class _Clock, class _Duration> 2417*4d6fc14bSjoerg _LIBCPP_INLINE_VISIBILITY 2418*4d6fc14bSjoerg future_status 2419*4d6fc14bSjoerg wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const 2420*4d6fc14bSjoerg {return __state_->wait_until(__abs_time);} 2421*4d6fc14bSjoerg}; 2422*4d6fc14bSjoerg 2423*4d6fc14bSjoergtemplate <class _Rp> 2424*4d6fc14bSjoerginline _LIBCPP_INLINE_VISIBILITY 2425*4d6fc14bSjoergvoid 2426*4d6fc14bSjoergswap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) _NOEXCEPT 2427*4d6fc14bSjoerg{ 2428*4d6fc14bSjoerg __x.swap(__y); 2429*4d6fc14bSjoerg} 2430*4d6fc14bSjoerg 2431*4d6fc14bSjoergtemplate <class _Rp> 2432*4d6fc14bSjoerginline 2433*4d6fc14bSjoergshared_future<_Rp> 2434*4d6fc14bSjoergfuture<_Rp>::share() _NOEXCEPT 2435*4d6fc14bSjoerg{ 2436*4d6fc14bSjoerg return shared_future<_Rp>(_VSTD::move(*this)); 2437*4d6fc14bSjoerg} 2438*4d6fc14bSjoerg 2439*4d6fc14bSjoergtemplate <class _Rp> 2440*4d6fc14bSjoerginline 2441*4d6fc14bSjoergshared_future<_Rp&> 2442*4d6fc14bSjoergfuture<_Rp&>::share() _NOEXCEPT 2443*4d6fc14bSjoerg{ 2444*4d6fc14bSjoerg return shared_future<_Rp&>(_VSTD::move(*this)); 2445*4d6fc14bSjoerg} 2446*4d6fc14bSjoerg 2447*4d6fc14bSjoerginline 2448*4d6fc14bSjoergshared_future<void> 2449*4d6fc14bSjoergfuture<void>::share() _NOEXCEPT 2450*4d6fc14bSjoerg{ 2451*4d6fc14bSjoerg return shared_future<void>(_VSTD::move(*this)); 2452*4d6fc14bSjoerg} 2453*4d6fc14bSjoerg 2454*4d6fc14bSjoerg_LIBCPP_END_NAMESPACE_STD 2455*4d6fc14bSjoerg 2456*4d6fc14bSjoerg#endif // !_LIBCPP_HAS_NO_THREADS 2457*4d6fc14bSjoerg 2458*4d6fc14bSjoerg#endif // _LIBCPP_FUTURE 2459