]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/future
Integrate capsicum-test into the FreeBSD test suite
[FreeBSD/FreeBSD.git] / contrib / libc++ / include / future
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