]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libc++/include/future
Merge libc++ trunk r300890, and update build glue.
[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 _LIBCXX_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 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_ALWAYS_INLINE
518 void __throw_future_error(future_errc _Ev)
519 {
520 #ifndef _LIBCPP_NO_EXCEPTIONS
521     throw future_error(make_error_code(_Ev));
522 #else
523     ((void)_Ev);
524     _VSTD::abort();
525 #endif
526 }
527
528 class _LIBCPP_TYPE_VIS __assoc_sub_state
529     : public __shared_count
530 {
531 protected:
532     exception_ptr __exception_;
533     mutable mutex __mut_;
534     mutable condition_variable __cv_;
535     unsigned __state_;
536
537     virtual void __on_zero_shared() _NOEXCEPT;
538     void __sub_wait(unique_lock<mutex>& __lk);
539 public:
540     enum
541     {
542         __constructed = 1,
543         __future_attached = 2,
544         ready = 4,
545         deferred = 8
546     };
547
548     _LIBCPP_INLINE_VISIBILITY
549     __assoc_sub_state() : __state_(0) {}
550
551     _LIBCPP_INLINE_VISIBILITY
552     bool __has_value() const
553         {return (__state_ & __constructed) || (__exception_ != nullptr);}
554
555     _LIBCPP_INLINE_VISIBILITY
556     void __set_future_attached()
557     {
558         lock_guard<mutex> __lk(__mut_);
559         __state_ |= __future_attached;
560     }
561     _LIBCPP_INLINE_VISIBILITY
562     bool __has_future_attached() const {return (__state_ & __future_attached) != 0;}
563
564     _LIBCPP_INLINE_VISIBILITY
565     void __set_deferred() {__state_ |= deferred;}
566
567     void __make_ready();
568     _LIBCPP_INLINE_VISIBILITY
569     bool __is_ready() const {return (__state_ & ready) != 0;}
570
571     void set_value();
572     void set_value_at_thread_exit();
573
574     void set_exception(exception_ptr __p);
575     void set_exception_at_thread_exit(exception_ptr __p);
576
577     void copy();
578
579     void wait();
580     template <class _Rep, class _Period>
581         future_status
582         _LIBCPP_INLINE_VISIBILITY
583         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
584     template <class _Clock, class _Duration>
585         _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
586         future_status
587         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const;
588
589     virtual void __execute();
590 };
591
592 template <class _Clock, class _Duration>
593 future_status
594 __assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
595 {
596     unique_lock<mutex> __lk(__mut_);
597     if (__state_ & deferred)
598         return future_status::deferred;
599     while (!(__state_ & ready) && _Clock::now() < __abs_time)
600         __cv_.wait_until(__lk, __abs_time);
601     if (__state_ & ready)
602         return future_status::ready;
603     return future_status::timeout;
604 }
605
606 template <class _Rep, class _Period>
607 inline
608 future_status
609 __assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
610 {
611     return wait_until(chrono::steady_clock::now() + __rel_time);
612 }
613
614 template <class _Rp>
615 class __assoc_state
616     : public __assoc_sub_state
617 {
618     typedef __assoc_sub_state base;
619     typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up;
620 protected:
621     _Up __value_;
622
623     virtual void __on_zero_shared() _NOEXCEPT;
624 public:
625
626     template <class _Arg>
627 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
628         void set_value(_Arg&& __arg);
629 #else
630         void set_value(_Arg& __arg);
631 #endif
632
633     template <class _Arg>
634 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
635         void set_value_at_thread_exit(_Arg&& __arg);
636 #else
637         void set_value_at_thread_exit(_Arg& __arg);
638 #endif
639
640     _Rp move();
641     typename add_lvalue_reference<_Rp>::type copy();
642 };
643
644 template <class _Rp>
645 void
646 __assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT
647 {
648     if (this->__state_ & base::__constructed)
649         reinterpret_cast<_Rp*>(&__value_)->~_Rp();
650     delete this;
651 }
652
653 template <class _Rp>
654 template <class _Arg>
655 void
656 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
657 __assoc_state<_Rp>::set_value(_Arg&& __arg)
658 #else
659 __assoc_state<_Rp>::set_value(_Arg& __arg)
660 #endif
661 {
662     unique_lock<mutex> __lk(this->__mut_);
663     if (this->__has_value())
664         __throw_future_error(future_errc::promise_already_satisfied);
665     ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
666     this->__state_ |= base::__constructed | base::ready;
667     __cv_.notify_all();
668 }
669
670 template <class _Rp>
671 template <class _Arg>
672 void
673 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
674 __assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg)
675 #else
676 __assoc_state<_Rp>::set_value_at_thread_exit(_Arg& __arg)
677 #endif
678 {
679     unique_lock<mutex> __lk(this->__mut_);
680     if (this->__has_value())
681         __throw_future_error(future_errc::promise_already_satisfied);
682     ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
683     this->__state_ |= base::__constructed;
684     __thread_local_data()->__make_ready_at_thread_exit(this);
685 }
686
687 template <class _Rp>
688 _Rp
689 __assoc_state<_Rp>::move()
690 {
691     unique_lock<mutex> __lk(this->__mut_);
692     this->__sub_wait(__lk);
693     if (this->__exception_ != nullptr)
694         rethrow_exception(this->__exception_);
695     return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_));
696 }
697
698 template <class _Rp>
699 typename add_lvalue_reference<_Rp>::type
700 __assoc_state<_Rp>::copy()
701 {
702     unique_lock<mutex> __lk(this->__mut_);
703     this->__sub_wait(__lk);
704     if (this->__exception_ != nullptr)
705         rethrow_exception(this->__exception_);
706     return *reinterpret_cast<_Rp*>(&__value_);
707 }
708
709 template <class _Rp>
710 class __assoc_state<_Rp&>
711     : public __assoc_sub_state
712 {
713     typedef __assoc_sub_state base;
714     typedef _Rp* _Up;
715 protected:
716     _Up __value_;
717
718     virtual void __on_zero_shared() _NOEXCEPT;
719 public:
720
721     void set_value(_Rp& __arg);
722     void set_value_at_thread_exit(_Rp& __arg);
723
724     _Rp& copy();
725 };
726
727 template <class _Rp>
728 void
729 __assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT
730 {
731     delete this;
732 }
733
734 template <class _Rp>
735 void
736 __assoc_state<_Rp&>::set_value(_Rp& __arg)
737 {
738     unique_lock<mutex> __lk(this->__mut_);
739     if (this->__has_value())
740         __throw_future_error(future_errc::promise_already_satisfied);
741     __value_ = _VSTD::addressof(__arg);
742     this->__state_ |= base::__constructed | base::ready;
743     __cv_.notify_all();
744 }
745
746 template <class _Rp>
747 void
748 __assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
749 {
750     unique_lock<mutex> __lk(this->__mut_);
751     if (this->__has_value())
752         __throw_future_error(future_errc::promise_already_satisfied);
753     __value_ = _VSTD::addressof(__arg);
754     this->__state_ |= base::__constructed;
755     __thread_local_data()->__make_ready_at_thread_exit(this);
756 }
757
758 template <class _Rp>
759 _Rp&
760 __assoc_state<_Rp&>::copy()
761 {
762     unique_lock<mutex> __lk(this->__mut_);
763     this->__sub_wait(__lk);
764     if (this->__exception_ != nullptr)
765         rethrow_exception(this->__exception_);
766     return *__value_;
767 }
768
769 template <class _Rp, class _Alloc>
770 class __assoc_state_alloc
771     : public __assoc_state<_Rp>
772 {
773     typedef __assoc_state<_Rp> base;
774     _Alloc __alloc_;
775
776     virtual void __on_zero_shared() _NOEXCEPT;
777 public:
778     _LIBCPP_INLINE_VISIBILITY
779     explicit __assoc_state_alloc(const _Alloc& __a)
780         : __alloc_(__a) {}
781 };
782
783 template <class _Rp, class _Alloc>
784 void
785 __assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT
786 {
787     if (this->__state_ & base::__constructed)
788         reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp();
789     typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
790     typedef allocator_traits<_Al> _ATraits;
791     typedef pointer_traits<typename _ATraits::pointer> _PTraits;
792     _Al __a(__alloc_);
793     this->~__assoc_state_alloc();
794     __a.deallocate(_PTraits::pointer_to(*this), 1);
795 }
796
797 template <class _Rp, class _Alloc>
798 class __assoc_state_alloc<_Rp&, _Alloc>
799     : public __assoc_state<_Rp&>
800 {
801     typedef __assoc_state<_Rp&> base;
802     _Alloc __alloc_;
803
804     virtual void __on_zero_shared() _NOEXCEPT;
805 public:
806     _LIBCPP_INLINE_VISIBILITY
807     explicit __assoc_state_alloc(const _Alloc& __a)
808         : __alloc_(__a) {}
809 };
810
811 template <class _Rp, class _Alloc>
812 void
813 __assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT
814 {
815     typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
816     typedef allocator_traits<_Al> _ATraits;
817     typedef pointer_traits<typename _ATraits::pointer> _PTraits;
818     _Al __a(__alloc_);
819     this->~__assoc_state_alloc();
820     __a.deallocate(_PTraits::pointer_to(*this), 1);
821 }
822
823 template <class _Alloc>
824 class __assoc_sub_state_alloc
825     : public __assoc_sub_state
826 {
827     typedef __assoc_sub_state base;
828     _Alloc __alloc_;
829
830     virtual void __on_zero_shared() _NOEXCEPT;
831 public:
832     _LIBCPP_INLINE_VISIBILITY
833     explicit __assoc_sub_state_alloc(const _Alloc& __a)
834         : __alloc_(__a) {}
835 };
836
837 template <class _Alloc>
838 void
839 __assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
840 {
841     typedef typename __allocator_traits_rebind<_Alloc, __assoc_sub_state_alloc>::type _Al;
842     typedef allocator_traits<_Al> _ATraits;
843     typedef pointer_traits<typename _ATraits::pointer> _PTraits;
844     _Al __a(__alloc_);
845     this->~__assoc_sub_state_alloc();
846     __a.deallocate(_PTraits::pointer_to(*this), 1);
847 }
848
849 template <class _Rp, class _Fp>
850 class __deferred_assoc_state
851     : public __assoc_state<_Rp>
852 {
853     typedef __assoc_state<_Rp> base;
854
855     _Fp __func_;
856
857 public:
858 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
859     _LIBCPP_INLINE_VISIBILITY
860     explicit __deferred_assoc_state(_Fp&& __f);
861 #endif
862
863     virtual void __execute();
864 };
865
866 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
867
868 template <class _Rp, class _Fp>
869 inline
870 __deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
871     : __func_(_VSTD::forward<_Fp>(__f))
872 {
873     this->__set_deferred();
874 }
875
876 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
877
878 template <class _Rp, class _Fp>
879 void
880 __deferred_assoc_state<_Rp, _Fp>::__execute()
881 {
882 #ifndef _LIBCPP_NO_EXCEPTIONS
883     try
884     {
885 #endif  // _LIBCPP_NO_EXCEPTIONS
886         this->set_value(__func_());
887 #ifndef _LIBCPP_NO_EXCEPTIONS
888     }
889     catch (...)
890     {
891         this->set_exception(current_exception());
892     }
893 #endif  // _LIBCPP_NO_EXCEPTIONS
894 }
895
896 template <class _Fp>
897 class __deferred_assoc_state<void, _Fp>
898     : public __assoc_sub_state
899 {
900     typedef __assoc_sub_state base;
901
902     _Fp __func_;
903
904 public:
905 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
906     _LIBCPP_INLINE_VISIBILITY
907     explicit __deferred_assoc_state(_Fp&& __f);
908 #endif
909
910     virtual void __execute();
911 };
912
913 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
914
915 template <class _Fp>
916 inline
917 __deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
918     : __func_(_VSTD::forward<_Fp>(__f))
919 {
920     this->__set_deferred();
921 }
922
923 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
924
925 template <class _Fp>
926 void
927 __deferred_assoc_state<void, _Fp>::__execute()
928 {
929 #ifndef _LIBCPP_NO_EXCEPTIONS
930     try
931     {
932 #endif  // _LIBCPP_NO_EXCEPTIONS
933         __func_();
934         this->set_value();
935 #ifndef _LIBCPP_NO_EXCEPTIONS
936     }
937     catch (...)
938     {
939         this->set_exception(current_exception());
940     }
941 #endif  // _LIBCPP_NO_EXCEPTIONS
942 }
943
944 template <class _Rp, class _Fp>
945 class __async_assoc_state
946     : public __assoc_state<_Rp>
947 {
948     typedef __assoc_state<_Rp> base;
949
950     _Fp __func_;
951
952     virtual void __on_zero_shared() _NOEXCEPT;
953 public:
954 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
955     _LIBCPP_INLINE_VISIBILITY
956     explicit __async_assoc_state(_Fp&& __f);
957 #endif
958
959     virtual void __execute();
960 };
961
962 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
963
964 template <class _Rp, class _Fp>
965 inline
966 __async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
967     : __func_(_VSTD::forward<_Fp>(__f))
968 {
969 }
970
971 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
972
973 template <class _Rp, class _Fp>
974 void
975 __async_assoc_state<_Rp, _Fp>::__execute()
976 {
977 #ifndef _LIBCPP_NO_EXCEPTIONS
978     try
979     {
980 #endif  // _LIBCPP_NO_EXCEPTIONS
981         this->set_value(__func_());
982 #ifndef _LIBCPP_NO_EXCEPTIONS
983     }
984     catch (...)
985     {
986         this->set_exception(current_exception());
987     }
988 #endif  // _LIBCPP_NO_EXCEPTIONS
989 }
990
991 template <class _Rp, class _Fp>
992 void
993 __async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT
994 {
995     this->wait();
996     base::__on_zero_shared();
997 }
998
999 template <class _Fp>
1000 class __async_assoc_state<void, _Fp>
1001     : public __assoc_sub_state
1002 {
1003     typedef __assoc_sub_state base;
1004
1005     _Fp __func_;
1006
1007     virtual void __on_zero_shared() _NOEXCEPT;
1008 public:
1009 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1010     _LIBCPP_INLINE_VISIBILITY
1011     explicit __async_assoc_state(_Fp&& __f);
1012 #endif
1013
1014     virtual void __execute();
1015 };
1016
1017 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1018
1019 template <class _Fp>
1020 inline
1021 __async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
1022     : __func_(_VSTD::forward<_Fp>(__f))
1023 {
1024 }
1025
1026 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1027
1028 template <class _Fp>
1029 void
1030 __async_assoc_state<void, _Fp>::__execute()
1031 {
1032 #ifndef _LIBCPP_NO_EXCEPTIONS
1033     try
1034     {
1035 #endif  // _LIBCPP_NO_EXCEPTIONS
1036         __func_();
1037         this->set_value();
1038 #ifndef _LIBCPP_NO_EXCEPTIONS
1039     }
1040     catch (...)
1041     {
1042         this->set_exception(current_exception());
1043     }
1044 #endif  // _LIBCPP_NO_EXCEPTIONS
1045 }
1046
1047 template <class _Fp>
1048 void
1049 __async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT
1050 {
1051     this->wait();
1052     base::__on_zero_shared();
1053 }
1054
1055 template <class _Rp> class _LIBCPP_TEMPLATE_VIS promise;
1056 template <class _Rp> class _LIBCPP_TEMPLATE_VIS shared_future;
1057
1058 // future
1059
1060 template <class _Rp> class _LIBCPP_TEMPLATE_VIS future;
1061
1062 template <class _Rp, class _Fp>
1063 future<_Rp>
1064 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1065 __make_deferred_assoc_state(_Fp&& __f);
1066 #else
1067 __make_deferred_assoc_state(_Fp __f);
1068 #endif
1069
1070 template <class _Rp, class _Fp>
1071 future<_Rp>
1072 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1073 __make_async_assoc_state(_Fp&& __f);
1074 #else
1075 __make_async_assoc_state(_Fp __f);
1076 #endif
1077
1078 template <class _Rp>
1079 class _LIBCPP_TEMPLATE_VIS future
1080 {
1081     __assoc_state<_Rp>* __state_;
1082
1083     explicit future(__assoc_state<_Rp>* __state);
1084
1085     template <class> friend class promise;
1086     template <class> friend class shared_future;
1087
1088 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1089     template <class _R1, class _Fp>
1090         friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1091     template <class _R1, class _Fp>
1092         friend future<_R1> __make_async_assoc_state(_Fp&& __f);
1093 #else
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 #endif
1099
1100 public:
1101     _LIBCPP_INLINE_VISIBILITY
1102     future() _NOEXCEPT : __state_(nullptr) {}
1103 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1104     _LIBCPP_INLINE_VISIBILITY
1105     future(future&& __rhs) _NOEXCEPT
1106         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1107     future(const future&) = delete;
1108     future& operator=(const future&) = delete;
1109     _LIBCPP_INLINE_VISIBILITY
1110     future& operator=(future&& __rhs) _NOEXCEPT
1111         {
1112             future(std::move(__rhs)).swap(*this);
1113             return *this;
1114         }
1115 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1116 private:
1117     future(const future&);
1118     future& operator=(const future&);
1119 public:
1120 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1121     ~future();
1122     _LIBCPP_INLINE_VISIBILITY
1123     shared_future<_Rp> share() _NOEXCEPT;
1124
1125     // retrieving the value
1126     _Rp get();
1127
1128     _LIBCPP_INLINE_VISIBILITY
1129     void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1130
1131     // functions to check state
1132     _LIBCPP_INLINE_VISIBILITY
1133     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1134
1135     _LIBCPP_INLINE_VISIBILITY
1136     void wait() const {__state_->wait();}
1137     template <class _Rep, class _Period>
1138         _LIBCPP_INLINE_VISIBILITY
1139         future_status
1140         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1141             {return __state_->wait_for(__rel_time);}
1142     template <class _Clock, class _Duration>
1143         _LIBCPP_INLINE_VISIBILITY
1144         future_status
1145         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1146             {return __state_->wait_until(__abs_time);}
1147 };
1148
1149 template <class _Rp>
1150 future<_Rp>::future(__assoc_state<_Rp>* __state)
1151     : __state_(__state)
1152 {
1153     if (__state_->__has_future_attached())
1154         __throw_future_error(future_errc::future_already_retrieved);
1155     __state_->__add_shared();
1156     __state_->__set_future_attached();
1157 }
1158
1159 struct __release_shared_count
1160 {
1161     void operator()(__shared_count* p) {p->__release_shared();}
1162 };
1163
1164 template <class _Rp>
1165 future<_Rp>::~future()
1166 {
1167     if (__state_)
1168         __state_->__release_shared();
1169 }
1170
1171 template <class _Rp>
1172 _Rp
1173 future<_Rp>::get()
1174 {
1175     unique_ptr<__shared_count, __release_shared_count> __(__state_);
1176     __assoc_state<_Rp>* __s = __state_;
1177     __state_ = nullptr;
1178     return __s->move();
1179 }
1180
1181 template <class _Rp>
1182 class _LIBCPP_TEMPLATE_VIS future<_Rp&>
1183 {
1184     __assoc_state<_Rp&>* __state_;
1185
1186     explicit future(__assoc_state<_Rp&>* __state);
1187
1188     template <class> friend class promise;
1189     template <class> friend class shared_future;
1190
1191 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1192     template <class _R1, class _Fp>
1193         friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1194     template <class _R1, class _Fp>
1195         friend future<_R1> __make_async_assoc_state(_Fp&& __f);
1196 #else
1197     template <class _R1, class _Fp>
1198         friend future<_R1> __make_deferred_assoc_state(_Fp __f);
1199     template <class _R1, class _Fp>
1200         friend future<_R1> __make_async_assoc_state(_Fp __f);
1201 #endif
1202
1203 public:
1204     _LIBCPP_INLINE_VISIBILITY
1205     future() _NOEXCEPT : __state_(nullptr) {}
1206 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1207     _LIBCPP_INLINE_VISIBILITY
1208     future(future&& __rhs) _NOEXCEPT
1209         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1210     future(const future&) = delete;
1211     future& operator=(const future&) = delete;
1212     _LIBCPP_INLINE_VISIBILITY
1213     future& operator=(future&& __rhs) _NOEXCEPT
1214         {
1215             future(std::move(__rhs)).swap(*this);
1216             return *this;
1217         }
1218 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1219 private:
1220     future(const future&);
1221     future& operator=(const future&);
1222 public:
1223 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1224     ~future();
1225     _LIBCPP_INLINE_VISIBILITY
1226     shared_future<_Rp&> share() _NOEXCEPT;
1227
1228     // retrieving the value
1229     _Rp& get();
1230
1231     _LIBCPP_INLINE_VISIBILITY
1232     void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1233
1234     // functions to check state
1235     _LIBCPP_INLINE_VISIBILITY
1236     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1237
1238     _LIBCPP_INLINE_VISIBILITY
1239     void wait() const {__state_->wait();}
1240     template <class _Rep, class _Period>
1241         _LIBCPP_INLINE_VISIBILITY
1242         future_status
1243         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1244             {return __state_->wait_for(__rel_time);}
1245     template <class _Clock, class _Duration>
1246         _LIBCPP_INLINE_VISIBILITY
1247         future_status
1248         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1249             {return __state_->wait_until(__abs_time);}
1250 };
1251
1252 template <class _Rp>
1253 future<_Rp&>::future(__assoc_state<_Rp&>* __state)
1254     : __state_(__state)
1255 {
1256     if (__state_->__has_future_attached())
1257         __throw_future_error(future_errc::future_already_retrieved);
1258     __state_->__add_shared();
1259     __state_->__set_future_attached();
1260 }
1261
1262 template <class _Rp>
1263 future<_Rp&>::~future()
1264 {
1265     if (__state_)
1266         __state_->__release_shared();
1267 }
1268
1269 template <class _Rp>
1270 _Rp&
1271 future<_Rp&>::get()
1272 {
1273     unique_ptr<__shared_count, __release_shared_count> __(__state_);
1274     __assoc_state<_Rp&>* __s = __state_;
1275     __state_ = nullptr;
1276     return __s->copy();
1277 }
1278
1279 template <>
1280 class _LIBCPP_TYPE_VIS future<void>
1281 {
1282     __assoc_sub_state* __state_;
1283
1284     explicit future(__assoc_sub_state* __state);
1285
1286     template <class> friend class promise;
1287     template <class> friend class shared_future;
1288
1289 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1290     template <class _R1, class _Fp>
1291         friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1292     template <class _R1, class _Fp>
1293         friend future<_R1> __make_async_assoc_state(_Fp&& __f);
1294 #else
1295     template <class _R1, class _Fp>
1296         friend future<_R1> __make_deferred_assoc_state(_Fp __f);
1297     template <class _R1, class _Fp>
1298         friend future<_R1> __make_async_assoc_state(_Fp __f);
1299 #endif
1300
1301 public:
1302     _LIBCPP_INLINE_VISIBILITY
1303     future() _NOEXCEPT : __state_(nullptr) {}
1304 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1305     _LIBCPP_INLINE_VISIBILITY
1306     future(future&& __rhs) _NOEXCEPT
1307         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1308     future(const future&) = delete;
1309     future& operator=(const future&) = delete;
1310     _LIBCPP_INLINE_VISIBILITY
1311     future& operator=(future&& __rhs) _NOEXCEPT
1312         {
1313             future(std::move(__rhs)).swap(*this);
1314             return *this;
1315         }
1316 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1317 private:
1318     future(const future&);
1319     future& operator=(const future&);
1320 public:
1321 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1322     ~future();
1323     _LIBCPP_INLINE_VISIBILITY
1324     shared_future<void> share() _NOEXCEPT;
1325
1326     // retrieving the value
1327     void get();
1328
1329     _LIBCPP_INLINE_VISIBILITY
1330     void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1331
1332     // functions to check state
1333     _LIBCPP_INLINE_VISIBILITY
1334     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1335
1336     _LIBCPP_INLINE_VISIBILITY
1337     void wait() const {__state_->wait();}
1338     template <class _Rep, class _Period>
1339         _LIBCPP_INLINE_VISIBILITY
1340         future_status
1341         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1342             {return __state_->wait_for(__rel_time);}
1343     template <class _Clock, class _Duration>
1344         _LIBCPP_INLINE_VISIBILITY
1345         future_status
1346         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1347             {return __state_->wait_until(__abs_time);}
1348 };
1349
1350 template <class _Rp>
1351 inline _LIBCPP_INLINE_VISIBILITY
1352 void
1353 swap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT
1354 {
1355     __x.swap(__y);
1356 }
1357
1358 // promise<R>
1359
1360 template <class _Callable> class packaged_task;
1361
1362 template <class _Rp>
1363 class _LIBCPP_TEMPLATE_VIS promise
1364 {
1365     __assoc_state<_Rp>* __state_;
1366
1367     _LIBCPP_INLINE_VISIBILITY
1368     explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
1369
1370     template <class> friend class packaged_task;
1371 public:
1372     promise();
1373     template <class _Alloc>
1374         promise(allocator_arg_t, const _Alloc& __a);
1375 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1376     _LIBCPP_INLINE_VISIBILITY
1377     promise(promise&& __rhs) _NOEXCEPT
1378         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1379     promise(const promise& __rhs) = delete;
1380 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1381 private:
1382     promise(const promise& __rhs);
1383 public:
1384 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1385     ~promise();
1386
1387     // assignment
1388 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1389     _LIBCPP_INLINE_VISIBILITY
1390     promise& operator=(promise&& __rhs) _NOEXCEPT
1391         {
1392             promise(std::move(__rhs)).swap(*this);
1393             return *this;
1394         }
1395     promise& operator=(const promise& __rhs) = delete;
1396 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1397 private:
1398     promise& operator=(const promise& __rhs);
1399 public:
1400 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1401     _LIBCPP_INLINE_VISIBILITY
1402     void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1403
1404     // retrieving the result
1405     future<_Rp> get_future();
1406
1407     // setting the result
1408     void set_value(const _Rp& __r);
1409 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1410     void set_value(_Rp&& __r);
1411 #endif
1412     void set_exception(exception_ptr __p);
1413
1414     // setting the result with deferred notification
1415     void set_value_at_thread_exit(const _Rp& __r);
1416 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1417     void set_value_at_thread_exit(_Rp&& __r);
1418 #endif
1419     void set_exception_at_thread_exit(exception_ptr __p);
1420 };
1421
1422 template <class _Rp>
1423 promise<_Rp>::promise()
1424     : __state_(new __assoc_state<_Rp>)
1425 {
1426 }
1427
1428 template <class _Rp>
1429 template <class _Alloc>
1430 promise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0)
1431 {
1432     typedef __assoc_state_alloc<_Rp, _Alloc> _State;
1433     typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
1434     typedef __allocator_destructor<_A2> _D2;
1435     _A2 __a(__a0);
1436     unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1437     ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
1438     __state_ = _VSTD::addressof(*__hold.release());
1439 }
1440
1441 template <class _Rp>
1442 promise<_Rp>::~promise()
1443 {
1444     if (__state_)
1445     {
1446         if (!__state_->__has_value() && __state_->use_count() > 1)
1447             __state_->set_exception(make_exception_ptr(
1448                       future_error(make_error_code(future_errc::broken_promise))
1449                                                       ));
1450         __state_->__release_shared();
1451     }
1452 }
1453
1454 template <class _Rp>
1455 future<_Rp>
1456 promise<_Rp>::get_future()
1457 {
1458     if (__state_ == nullptr)
1459         __throw_future_error(future_errc::no_state);
1460     return future<_Rp>(__state_);
1461 }
1462
1463 template <class _Rp>
1464 void
1465 promise<_Rp>::set_value(const _Rp& __r)
1466 {
1467     if (__state_ == nullptr)
1468         __throw_future_error(future_errc::no_state);
1469     __state_->set_value(__r);
1470 }
1471
1472 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1473
1474 template <class _Rp>
1475 void
1476 promise<_Rp>::set_value(_Rp&& __r)
1477 {
1478     if (__state_ == nullptr)
1479         __throw_future_error(future_errc::no_state);
1480     __state_->set_value(_VSTD::move(__r));
1481 }
1482
1483 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1484
1485 template <class _Rp>
1486 void
1487 promise<_Rp>::set_exception(exception_ptr __p)
1488 {
1489     _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
1490     if (__state_ == nullptr)
1491         __throw_future_error(future_errc::no_state);
1492     __state_->set_exception(__p);
1493 }
1494
1495 template <class _Rp>
1496 void
1497 promise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
1498 {
1499     if (__state_ == nullptr)
1500         __throw_future_error(future_errc::no_state);
1501     __state_->set_value_at_thread_exit(__r);
1502 }
1503
1504 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1505
1506 template <class _Rp>
1507 void
1508 promise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
1509 {
1510     if (__state_ == nullptr)
1511         __throw_future_error(future_errc::no_state);
1512     __state_->set_value_at_thread_exit(_VSTD::move(__r));
1513 }
1514
1515 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1516
1517 template <class _Rp>
1518 void
1519 promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
1520 {
1521     _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
1522     if (__state_ == nullptr)
1523         __throw_future_error(future_errc::no_state);
1524     __state_->set_exception_at_thread_exit(__p);
1525 }
1526
1527 // promise<R&>
1528
1529 template <class _Rp>
1530 class _LIBCPP_TEMPLATE_VIS promise<_Rp&>
1531 {
1532     __assoc_state<_Rp&>* __state_;
1533
1534     _LIBCPP_INLINE_VISIBILITY
1535     explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
1536
1537     template <class> friend class packaged_task;
1538
1539 public:
1540     promise();
1541     template <class _Allocator>
1542         promise(allocator_arg_t, const _Allocator& __a);
1543 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1544     _LIBCPP_INLINE_VISIBILITY
1545     promise(promise&& __rhs) _NOEXCEPT
1546         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1547     promise(const promise& __rhs) = delete;
1548 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1549 private:
1550     promise(const promise& __rhs);
1551 public:
1552 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1553     ~promise();
1554
1555     // assignment
1556 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1557     _LIBCPP_INLINE_VISIBILITY
1558     promise& operator=(promise&& __rhs) _NOEXCEPT
1559         {
1560             promise(std::move(__rhs)).swap(*this);
1561             return *this;
1562         }
1563     promise& operator=(const promise& __rhs) = delete;
1564 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1565 private:
1566     promise& operator=(const promise& __rhs);
1567 public:
1568 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1569     _LIBCPP_INLINE_VISIBILITY
1570     void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1571
1572     // retrieving the result
1573     future<_Rp&> get_future();
1574
1575     // setting the result
1576     void set_value(_Rp& __r);
1577     void set_exception(exception_ptr __p);
1578
1579     // setting the result with deferred notification
1580     void set_value_at_thread_exit(_Rp&);
1581     void set_exception_at_thread_exit(exception_ptr __p);
1582 };
1583
1584 template <class _Rp>
1585 promise<_Rp&>::promise()
1586     : __state_(new __assoc_state<_Rp&>)
1587 {
1588 }
1589
1590 template <class _Rp>
1591 template <class _Alloc>
1592 promise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0)
1593 {
1594     typedef __assoc_state_alloc<_Rp&, _Alloc> _State;
1595     typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
1596     typedef __allocator_destructor<_A2> _D2;
1597     _A2 __a(__a0);
1598     unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1599     ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
1600     __state_ = _VSTD::addressof(*__hold.release());
1601 }
1602
1603 template <class _Rp>
1604 promise<_Rp&>::~promise()
1605 {
1606     if (__state_)
1607     {
1608         if (!__state_->__has_value() && __state_->use_count() > 1)
1609             __state_->set_exception(make_exception_ptr(
1610                       future_error(make_error_code(future_errc::broken_promise))
1611                                                       ));
1612         __state_->__release_shared();
1613     }
1614 }
1615
1616 template <class _Rp>
1617 future<_Rp&>
1618 promise<_Rp&>::get_future()
1619 {
1620     if (__state_ == nullptr)
1621         __throw_future_error(future_errc::no_state);
1622     return future<_Rp&>(__state_);
1623 }
1624
1625 template <class _Rp>
1626 void
1627 promise<_Rp&>::set_value(_Rp& __r)
1628 {
1629     if (__state_ == nullptr)
1630         __throw_future_error(future_errc::no_state);
1631     __state_->set_value(__r);
1632 }
1633
1634 template <class _Rp>
1635 void
1636 promise<_Rp&>::set_exception(exception_ptr __p)
1637 {
1638     _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
1639     if (__state_ == nullptr)
1640         __throw_future_error(future_errc::no_state);
1641     __state_->set_exception(__p);
1642 }
1643
1644 template <class _Rp>
1645 void
1646 promise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
1647 {
1648     if (__state_ == nullptr)
1649         __throw_future_error(future_errc::no_state);
1650     __state_->set_value_at_thread_exit(__r);
1651 }
1652
1653 template <class _Rp>
1654 void
1655 promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
1656 {
1657     _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
1658     if (__state_ == nullptr)
1659         __throw_future_error(future_errc::no_state);
1660     __state_->set_exception_at_thread_exit(__p);
1661 }
1662
1663 // promise<void>
1664
1665 template <>
1666 class _LIBCPP_TYPE_VIS promise<void>
1667 {
1668     __assoc_sub_state* __state_;
1669
1670     _LIBCPP_INLINE_VISIBILITY
1671     explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
1672
1673     template <class> friend class packaged_task;
1674
1675 public:
1676     promise();
1677     template <class _Allocator>
1678         _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
1679         promise(allocator_arg_t, const _Allocator& __a);
1680 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1681     _LIBCPP_INLINE_VISIBILITY
1682     promise(promise&& __rhs) _NOEXCEPT
1683         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1684     promise(const promise& __rhs) = delete;
1685 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1686 private:
1687     promise(const promise& __rhs);
1688 public:
1689 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1690     ~promise();
1691
1692     // assignment
1693 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1694     _LIBCPP_INLINE_VISIBILITY
1695     promise& operator=(promise&& __rhs) _NOEXCEPT
1696         {
1697             promise(std::move(__rhs)).swap(*this);
1698             return *this;
1699         }
1700     promise& operator=(const promise& __rhs) = delete;
1701 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1702 private:
1703     promise& operator=(const promise& __rhs);
1704 public:
1705 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1706     _LIBCPP_INLINE_VISIBILITY
1707     void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1708
1709     // retrieving the result
1710     future<void> get_future();
1711
1712     // setting the result
1713     void set_value();
1714     void set_exception(exception_ptr __p);
1715
1716     // setting the result with deferred notification
1717     void set_value_at_thread_exit();
1718     void set_exception_at_thread_exit(exception_ptr __p);
1719 };
1720
1721 template <class _Alloc>
1722 promise<void>::promise(allocator_arg_t, const _Alloc& __a0)
1723 {
1724     typedef __assoc_sub_state_alloc<_Alloc> _State;
1725     typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
1726     typedef __allocator_destructor<_A2> _D2;
1727     _A2 __a(__a0);
1728     unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1729     ::new(static_cast<void*>(_VSTD::addressof(*__hold.get()))) _State(__a0);
1730     __state_ = _VSTD::addressof(*__hold.release());
1731 }
1732
1733 template <class _Rp>
1734 inline _LIBCPP_INLINE_VISIBILITY
1735 void
1736 swap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT
1737 {
1738     __x.swap(__y);
1739 }
1740
1741 template <class _Rp, class _Alloc>
1742     struct _LIBCPP_TEMPLATE_VIS uses_allocator<promise<_Rp>, _Alloc>
1743         : public true_type {};
1744
1745 #ifndef _LIBCPP_HAS_NO_VARIADICS
1746
1747 // packaged_task
1748
1749 template<class _Fp> class __packaged_task_base;
1750
1751 template<class _Rp, class ..._ArgTypes>
1752 class __packaged_task_base<_Rp(_ArgTypes...)>
1753 {
1754     __packaged_task_base(const __packaged_task_base&);
1755     __packaged_task_base& operator=(const __packaged_task_base&);
1756 public:
1757     _LIBCPP_INLINE_VISIBILITY
1758     __packaged_task_base() {}
1759     _LIBCPP_INLINE_VISIBILITY
1760     virtual ~__packaged_task_base() {}
1761     virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0;
1762     virtual void destroy() = 0;
1763     virtual void destroy_deallocate() = 0;
1764     virtual _Rp operator()(_ArgTypes&& ...) = 0;
1765 };
1766
1767 template<class _FD, class _Alloc, class _FB> class __packaged_task_func;
1768
1769 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1770 class __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1771     : public  __packaged_task_base<_Rp(_ArgTypes...)>
1772 {
1773     __compressed_pair<_Fp, _Alloc> __f_;
1774 public:
1775     _LIBCPP_INLINE_VISIBILITY
1776     explicit __packaged_task_func(const _Fp& __f) : __f_(__f) {}
1777     _LIBCPP_INLINE_VISIBILITY
1778     explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f)) {}
1779     _LIBCPP_INLINE_VISIBILITY
1780     __packaged_task_func(const _Fp& __f, const _Alloc& __a)
1781         : __f_(__f, __a) {}
1782     _LIBCPP_INLINE_VISIBILITY
1783     __packaged_task_func(_Fp&& __f, const _Alloc& __a)
1784         : __f_(_VSTD::move(__f), __a) {}
1785     virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT;
1786     virtual void destroy();
1787     virtual void destroy_deallocate();
1788     virtual _Rp operator()(_ArgTypes&& ... __args);
1789 };
1790
1791 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1792 void
1793 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to(
1794                               __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT
1795 {
1796     ::new (__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second()));
1797 }
1798
1799 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1800 void
1801 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy()
1802 {
1803     __f_.~__compressed_pair<_Fp, _Alloc>();
1804 }
1805
1806 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1807 void
1808 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate()
1809 {
1810     typedef typename __allocator_traits_rebind<_Alloc, __packaged_task_func>::type _Ap;
1811     typedef allocator_traits<_Ap> _ATraits;
1812     typedef pointer_traits<typename _ATraits::pointer> _PTraits;
1813     _Ap __a(__f_.second());
1814     __f_.~__compressed_pair<_Fp, _Alloc>();
1815     __a.deallocate(_PTraits::pointer_to(*this), 1);
1816 }
1817
1818 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1819 _Rp
1820 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
1821 {
1822     return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
1823 }
1824
1825 template <class _Callable> class __packaged_task_function;
1826
1827 template<class _Rp, class ..._ArgTypes>
1828 class __packaged_task_function<_Rp(_ArgTypes...)>
1829 {
1830     typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
1831     typename aligned_storage<3*sizeof(void*)>::type __buf_;
1832     __base* __f_;
1833
1834 public:
1835     typedef _Rp result_type;
1836
1837     // construct/copy/destroy:
1838     _LIBCPP_INLINE_VISIBILITY
1839     __packaged_task_function() _NOEXCEPT : __f_(nullptr) {}
1840     template<class _Fp>
1841       __packaged_task_function(_Fp&& __f);
1842     template<class _Fp, class _Alloc>
1843       __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f);
1844
1845     __packaged_task_function(__packaged_task_function&&) _NOEXCEPT;
1846     __packaged_task_function& operator=(__packaged_task_function&&) _NOEXCEPT;
1847
1848     __packaged_task_function(const __packaged_task_function&) =  delete;
1849     __packaged_task_function& operator=(const __packaged_task_function&) =  delete;
1850
1851     ~__packaged_task_function();
1852
1853     void swap(__packaged_task_function&) _NOEXCEPT;
1854
1855     _LIBCPP_INLINE_VISIBILITY
1856     _Rp operator()(_ArgTypes...) const;
1857 };
1858
1859 template<class _Rp, class ..._ArgTypes>
1860 __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) _NOEXCEPT
1861 {
1862     if (__f.__f_ == nullptr)
1863         __f_ = nullptr;
1864     else if (__f.__f_ == (__base*)&__f.__buf_)
1865     {
1866         __f_ = (__base*)&__buf_;
1867         __f.__f_->__move_to(__f_);
1868     }
1869     else
1870     {
1871         __f_ = __f.__f_;
1872         __f.__f_ = nullptr;
1873     }
1874 }
1875
1876 template<class _Rp, class ..._ArgTypes>
1877 template <class _Fp>
1878 __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
1879     : __f_(nullptr)
1880 {
1881     typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
1882     typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
1883     if (sizeof(_FF) <= sizeof(__buf_))
1884     {
1885         __f_ = (__base*)&__buf_;
1886         ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
1887     }
1888     else
1889     {
1890         typedef allocator<_FF> _Ap;
1891         _Ap __a;
1892         typedef __allocator_destructor<_Ap> _Dp;
1893         unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1894         ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a));
1895         __f_ = __hold.release();
1896     }
1897 }
1898
1899 template<class _Rp, class ..._ArgTypes>
1900 template <class _Fp, class _Alloc>
1901 __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(
1902                                   allocator_arg_t, const _Alloc& __a0, _Fp&& __f)
1903     : __f_(nullptr)
1904 {
1905     typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
1906     typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
1907     if (sizeof(_FF) <= sizeof(__buf_))
1908     {
1909         __f_ = (__base*)&__buf_;
1910         ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
1911     }
1912     else
1913     {
1914         typedef typename __allocator_traits_rebind<_Alloc, _FF>::type _Ap;
1915         _Ap __a(__a0);
1916         typedef __allocator_destructor<_Ap> _Dp;
1917         unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1918         ::new (static_cast<void*>(_VSTD::addressof(*__hold.get())))
1919             _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
1920         __f_ = _VSTD::addressof(*__hold.release());
1921     }
1922 }
1923
1924 template<class _Rp, class ..._ArgTypes>
1925 __packaged_task_function<_Rp(_ArgTypes...)>&
1926 __packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT
1927 {
1928     if (__f_ == (__base*)&__buf_)
1929         __f_->destroy();
1930     else if (__f_)
1931         __f_->destroy_deallocate();
1932     __f_ = nullptr;
1933     if (__f.__f_ == nullptr)
1934         __f_ = nullptr;
1935     else if (__f.__f_ == (__base*)&__f.__buf_)
1936     {
1937         __f_ = (__base*)&__buf_;
1938         __f.__f_->__move_to(__f_);
1939     }
1940     else
1941     {
1942         __f_ = __f.__f_;
1943         __f.__f_ = nullptr;
1944     }
1945     return *this;
1946 }
1947
1948 template<class _Rp, class ..._ArgTypes>
1949 __packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function()
1950 {
1951     if (__f_ == (__base*)&__buf_)
1952         __f_->destroy();
1953     else if (__f_)
1954         __f_->destroy_deallocate();
1955 }
1956
1957 template<class _Rp, class ..._ArgTypes>
1958 void
1959 __packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT
1960 {
1961     if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
1962     {
1963         typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1964         __base* __t = (__base*)&__tempbuf;
1965         __f_->__move_to(__t);
1966         __f_->destroy();
1967         __f_ = nullptr;
1968         __f.__f_->__move_to((__base*)&__buf_);
1969         __f.__f_->destroy();
1970         __f.__f_ = nullptr;
1971         __f_ = (__base*)&__buf_;
1972         __t->__move_to((__base*)&__f.__buf_);
1973         __t->destroy();
1974         __f.__f_ = (__base*)&__f.__buf_;
1975     }
1976     else if (__f_ == (__base*)&__buf_)
1977     {
1978         __f_->__move_to((__base*)&__f.__buf_);
1979         __f_->destroy();
1980         __f_ = __f.__f_;
1981         __f.__f_ = (__base*)&__f.__buf_;
1982     }
1983     else if (__f.__f_ == (__base*)&__f.__buf_)
1984     {
1985         __f.__f_->__move_to((__base*)&__buf_);
1986         __f.__f_->destroy();
1987         __f.__f_ = __f_;
1988         __f_ = (__base*)&__buf_;
1989     }
1990     else
1991         _VSTD::swap(__f_, __f.__f_);
1992 }
1993
1994 template<class _Rp, class ..._ArgTypes>
1995 inline
1996 _Rp
1997 __packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
1998 {
1999     return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
2000 }
2001
2002 template<class _Rp, class ..._ArgTypes>
2003 class _LIBCPP_TEMPLATE_VIS packaged_task<_Rp(_ArgTypes...)>
2004 {
2005 public:
2006     typedef _Rp result_type; // extension
2007
2008 private:
2009     __packaged_task_function<result_type(_ArgTypes...)> __f_;
2010     promise<result_type>                                __p_;
2011
2012 public:
2013     // construction and destruction
2014     _LIBCPP_INLINE_VISIBILITY
2015     packaged_task() _NOEXCEPT : __p_(nullptr) {}
2016     template <class _Fp,
2017               class = typename enable_if
2018               <
2019                   !is_same<
2020                       typename decay<_Fp>::type, 
2021                       packaged_task
2022                       >::value
2023                   >::type
2024              >
2025         _LIBCPP_INLINE_VISIBILITY
2026         explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
2027     template <class _Fp, class _Allocator,
2028               class = typename enable_if
2029               <
2030                   !is_same<
2031                       typename decay<_Fp>::type, 
2032                       packaged_task
2033                       >::value
2034                   >::type
2035               >
2036         _LIBCPP_INLINE_VISIBILITY
2037         packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
2038              : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
2039                __p_(allocator_arg, __a) {}
2040     // ~packaged_task() = default;
2041
2042     // no copy
2043     packaged_task(const packaged_task&) = delete;
2044     packaged_task& operator=(const packaged_task&) = delete;
2045
2046     // move support
2047     _LIBCPP_INLINE_VISIBILITY
2048     packaged_task(packaged_task&& __other) _NOEXCEPT
2049         : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
2050     _LIBCPP_INLINE_VISIBILITY
2051     packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
2052     {
2053         __f_ = _VSTD::move(__other.__f_);
2054         __p_ = _VSTD::move(__other.__p_);
2055         return *this;
2056     }
2057     _LIBCPP_INLINE_VISIBILITY
2058     void swap(packaged_task& __other) _NOEXCEPT
2059     {
2060         __f_.swap(__other.__f_);
2061         __p_.swap(__other.__p_);
2062     }
2063
2064     _LIBCPP_INLINE_VISIBILITY
2065     bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
2066
2067     // result retrieval
2068     _LIBCPP_INLINE_VISIBILITY
2069     future<result_type> get_future() {return __p_.get_future();}
2070
2071     // execution
2072     void operator()(_ArgTypes... __args);
2073     void make_ready_at_thread_exit(_ArgTypes... __args);
2074
2075     void reset();
2076 };
2077
2078 template<class _Rp, class ..._ArgTypes>
2079 void
2080 packaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
2081 {
2082     if (__p_.__state_ == nullptr)
2083         __throw_future_error(future_errc::no_state);
2084     if (__p_.__state_->__has_value())
2085         __throw_future_error(future_errc::promise_already_satisfied);
2086 #ifndef _LIBCPP_NO_EXCEPTIONS
2087     try
2088     {
2089 #endif  // _LIBCPP_NO_EXCEPTIONS
2090         __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...));
2091 #ifndef _LIBCPP_NO_EXCEPTIONS
2092     }
2093     catch (...)
2094     {
2095         __p_.set_exception(current_exception());
2096     }
2097 #endif  // _LIBCPP_NO_EXCEPTIONS
2098 }
2099
2100 template<class _Rp, class ..._ArgTypes>
2101 void
2102 packaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
2103 {
2104     if (__p_.__state_ == nullptr)
2105         __throw_future_error(future_errc::no_state);
2106     if (__p_.__state_->__has_value())
2107         __throw_future_error(future_errc::promise_already_satisfied);
2108 #ifndef _LIBCPP_NO_EXCEPTIONS
2109     try
2110     {
2111 #endif  // _LIBCPP_NO_EXCEPTIONS
2112         __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...));
2113 #ifndef _LIBCPP_NO_EXCEPTIONS
2114     }
2115     catch (...)
2116     {
2117         __p_.set_exception_at_thread_exit(current_exception());
2118     }
2119 #endif  // _LIBCPP_NO_EXCEPTIONS
2120 }
2121
2122 template<class _Rp, class ..._ArgTypes>
2123 void
2124 packaged_task<_Rp(_ArgTypes...)>::reset()
2125 {
2126     if (!valid())
2127         __throw_future_error(future_errc::no_state);
2128     __p_ = promise<result_type>();
2129 }
2130
2131 template<class ..._ArgTypes>
2132 class _LIBCPP_TEMPLATE_VIS packaged_task<void(_ArgTypes...)>
2133 {
2134 public:
2135     typedef void result_type; // extension
2136
2137 private:
2138     __packaged_task_function<result_type(_ArgTypes...)> __f_;
2139     promise<result_type>                                __p_;
2140
2141 public:
2142     // construction and destruction
2143     _LIBCPP_INLINE_VISIBILITY
2144     packaged_task() _NOEXCEPT : __p_(nullptr) {}
2145     template <class _Fp,
2146               class = typename enable_if
2147               <
2148                   !is_same<
2149                       typename decay<_Fp>::type, 
2150                       packaged_task
2151                       >::value
2152                   >::type
2153               >
2154         _LIBCPP_INLINE_VISIBILITY
2155         explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
2156     template <class _Fp, class _Allocator,
2157               class = typename enable_if
2158               <
2159                   !is_same<
2160                       typename decay<_Fp>::type, 
2161                       packaged_task
2162                       >::value
2163                   >::type
2164               >    
2165         _LIBCPP_INLINE_VISIBILITY
2166         packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
2167              : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
2168                __p_(allocator_arg, __a) {}
2169     // ~packaged_task() = default;
2170
2171     // no copy
2172     packaged_task(const packaged_task&) = delete;
2173     packaged_task& operator=(const packaged_task&) = delete;
2174
2175     // move support
2176     _LIBCPP_INLINE_VISIBILITY
2177     packaged_task(packaged_task&& __other) _NOEXCEPT
2178         : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
2179     _LIBCPP_INLINE_VISIBILITY
2180     packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
2181     {
2182         __f_ = _VSTD::move(__other.__f_);
2183         __p_ = _VSTD::move(__other.__p_);
2184         return *this;
2185     }
2186     _LIBCPP_INLINE_VISIBILITY
2187     void swap(packaged_task& __other) _NOEXCEPT
2188     {
2189         __f_.swap(__other.__f_);
2190         __p_.swap(__other.__p_);
2191     }
2192
2193     _LIBCPP_INLINE_VISIBILITY
2194     bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
2195
2196     // result retrieval
2197     _LIBCPP_INLINE_VISIBILITY
2198     future<result_type> get_future() {return __p_.get_future();}
2199
2200     // execution
2201     void operator()(_ArgTypes... __args);
2202     void make_ready_at_thread_exit(_ArgTypes... __args);
2203
2204     void reset();
2205 };
2206
2207 template<class ..._ArgTypes>
2208 void
2209 packaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
2210 {
2211     if (__p_.__state_ == nullptr)
2212         __throw_future_error(future_errc::no_state);
2213     if (__p_.__state_->__has_value())
2214         __throw_future_error(future_errc::promise_already_satisfied);
2215 #ifndef _LIBCPP_NO_EXCEPTIONS
2216     try
2217     {
2218 #endif  // _LIBCPP_NO_EXCEPTIONS
2219         __f_(_VSTD::forward<_ArgTypes>(__args)...);
2220         __p_.set_value();
2221 #ifndef _LIBCPP_NO_EXCEPTIONS
2222     }
2223     catch (...)
2224     {
2225         __p_.set_exception(current_exception());
2226     }
2227 #endif  // _LIBCPP_NO_EXCEPTIONS
2228 }
2229
2230 template<class ..._ArgTypes>
2231 void
2232 packaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
2233 {
2234     if (__p_.__state_ == nullptr)
2235         __throw_future_error(future_errc::no_state);
2236     if (__p_.__state_->__has_value())
2237         __throw_future_error(future_errc::promise_already_satisfied);
2238 #ifndef _LIBCPP_NO_EXCEPTIONS
2239     try
2240     {
2241 #endif  // _LIBCPP_NO_EXCEPTIONS
2242         __f_(_VSTD::forward<_ArgTypes>(__args)...);
2243         __p_.set_value_at_thread_exit();
2244 #ifndef _LIBCPP_NO_EXCEPTIONS
2245     }
2246     catch (...)
2247     {
2248         __p_.set_exception_at_thread_exit(current_exception());
2249     }
2250 #endif  // _LIBCPP_NO_EXCEPTIONS
2251 }
2252
2253 template<class ..._ArgTypes>
2254 void
2255 packaged_task<void(_ArgTypes...)>::reset()
2256 {
2257     if (!valid())
2258         __throw_future_error(future_errc::no_state);
2259     __p_ = promise<result_type>();
2260 }
2261
2262 template <class _Callable>
2263 inline _LIBCPP_INLINE_VISIBILITY
2264 void
2265 swap(packaged_task<_Callable>& __x, packaged_task<_Callable>& __y) _NOEXCEPT
2266 {
2267     __x.swap(__y);
2268 }
2269
2270 template <class _Callable, class _Alloc>
2271 struct _LIBCPP_TEMPLATE_VIS uses_allocator<packaged_task<_Callable>, _Alloc>
2272     : public true_type {};
2273
2274 template <class _Rp, class _Fp>
2275 future<_Rp>
2276 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2277 __make_deferred_assoc_state(_Fp&& __f)
2278 #else
2279 __make_deferred_assoc_state(_Fp __f)
2280 #endif
2281 {
2282     unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count>
2283         __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
2284     return future<_Rp>(__h.get());
2285 }
2286
2287 template <class _Rp, class _Fp>
2288 future<_Rp>
2289 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2290 __make_async_assoc_state(_Fp&& __f)
2291 #else
2292 __make_async_assoc_state(_Fp __f)
2293 #endif
2294 {
2295     unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count>
2296         __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
2297     _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach();
2298     return future<_Rp>(__h.get());
2299 }
2300
2301 template <class _Fp, class... _Args>
2302 class __async_func
2303 {
2304     tuple<_Fp, _Args...> __f_;
2305
2306 public:
2307     typedef typename __invoke_of<_Fp, _Args...>::type _Rp;
2308
2309     _LIBCPP_INLINE_VISIBILITY
2310     explicit __async_func(_Fp&& __f, _Args&&... __args)
2311         : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {}
2312
2313     _LIBCPP_INLINE_VISIBILITY
2314     __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {}
2315
2316     _Rp operator()()
2317     {
2318         typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index;
2319         return __execute(_Index());
2320     }
2321 private:
2322     template <size_t ..._Indices>
2323     _Rp
2324     __execute(__tuple_indices<_Indices...>)
2325     {
2326         return __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
2327     }
2328 };
2329
2330 inline _LIBCPP_INLINE_VISIBILITY bool __does_policy_contain(launch __policy, launch __value )
2331 { return (int(__policy) & int(__value)) != 0; }
2332
2333 template <class _Fp, class... _Args>
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 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 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