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