]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/libc++/include/future
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.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     broken_promise,
23     future_already_retrieved,
24     promise_already_satisfied,
25     no_state
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
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();
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();
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();
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<F(Args...)>::type>
313   async(F&& f, Args&&... args);
314
315 template <class F, class... Args>
316   future<typename result_of<F(Args...)>::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;
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         explicit 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 _LIBCPP_BEGIN_NAMESPACE_STD
378
379 //enum class future_errc
380 _LIBCPP_DECLARE_STRONG_ENUM(future_errc)
381 {
382     broken_promise,
383     future_already_retrieved,
384     promise_already_satisfied,
385     no_state
386 };
387 _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
388
389 template <>
390 struct _LIBCPP_TYPE_VIS is_error_code_enum<future_errc> : public true_type {};
391
392 #ifdef _LIBCPP_HAS_NO_STRONG_ENUMS
393 template <>
394 struct _LIBCPP_TYPE_VIS is_error_code_enum<future_errc::__lx> : public true_type { };
395 #endif
396
397 //enum class launch
398 _LIBCPP_DECLARE_STRONG_ENUM(launch)
399 {
400     async = 1,
401     deferred = 2,
402     any = async | deferred
403 };
404 _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch)
405
406 #ifndef _LIBCPP_HAS_NO_STRONG_ENUMS
407
408 #ifdef _LIBCXX_UNDERLYING_TYPE
409 typedef underlying_type<launch>::type __launch_underlying_type;
410 #else
411 typedef int __launch_underlying_type;
412 #endif
413
414 inline _LIBCPP_INLINE_VISIBILITY
415 _LIBCPP_CONSTEXPR
416 launch
417 operator&(launch __x, launch __y)
418 {
419     return static_cast<launch>(static_cast<__launch_underlying_type>(__x) &
420                                static_cast<__launch_underlying_type>(__y));
421 }
422
423 inline _LIBCPP_INLINE_VISIBILITY
424 _LIBCPP_CONSTEXPR
425 launch
426 operator|(launch __x, launch __y)
427 {
428     return static_cast<launch>(static_cast<__launch_underlying_type>(__x) |
429                                static_cast<__launch_underlying_type>(__y));
430 }
431
432 inline _LIBCPP_INLINE_VISIBILITY
433 _LIBCPP_CONSTEXPR
434 launch
435 operator^(launch __x, launch __y)
436 {
437     return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^
438                                static_cast<__launch_underlying_type>(__y));
439 }
440
441 inline _LIBCPP_INLINE_VISIBILITY
442 _LIBCPP_CONSTEXPR
443 launch
444 operator~(launch __x)
445 {
446     return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3);
447 }
448
449 inline _LIBCPP_INLINE_VISIBILITY
450 launch&
451 operator&=(launch& __x, launch __y)
452 {
453     __x = __x & __y; return __x;
454 }
455
456 inline _LIBCPP_INLINE_VISIBILITY
457 launch&
458 operator|=(launch& __x, launch __y)
459 {
460     __x = __x | __y; return __x;
461 }
462
463 inline _LIBCPP_INLINE_VISIBILITY
464 launch&
465 operator^=(launch& __x, launch __y)
466 {
467     __x = __x ^ __y; return __x;
468 }
469
470 #endif  // !_LIBCPP_HAS_NO_STRONG_ENUMS
471
472 //enum class future_status
473 _LIBCPP_DECLARE_STRONG_ENUM(future_status)
474 {
475     ready,
476     timeout,
477     deferred
478 };
479 _LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status)
480
481 _LIBCPP_FUNC_VIS
482 const error_category& future_category() _NOEXCEPT;
483
484 inline _LIBCPP_INLINE_VISIBILITY
485 error_code
486 make_error_code(future_errc __e) _NOEXCEPT
487 {
488     return error_code(static_cast<int>(__e), future_category());
489 }
490
491 inline _LIBCPP_INLINE_VISIBILITY
492 error_condition
493 make_error_condition(future_errc __e) _NOEXCEPT
494 {
495     return error_condition(static_cast<int>(__e), future_category());
496 }
497
498 class _LIBCPP_EXCEPTION_ABI future_error
499     : public logic_error
500 {
501     error_code __ec_;
502 public:
503     future_error(error_code __ec);
504
505     _LIBCPP_INLINE_VISIBILITY
506     const error_code& code() const _NOEXCEPT {return __ec_;}
507
508     virtual ~future_error() _NOEXCEPT;
509 };
510
511 class __assoc_sub_state
512     : public __shared_count
513 {
514 protected:
515     exception_ptr __exception_;
516     mutable mutex __mut_;
517     mutable condition_variable __cv_;
518     unsigned __state_;
519
520     virtual void __on_zero_shared() _NOEXCEPT;
521     void __sub_wait(unique_lock<mutex>& __lk);
522 public:
523     enum
524     {
525         __constructed = 1,
526         __future_attached = 2,
527         ready = 4,
528         deferred = 8
529     };
530
531     _LIBCPP_INLINE_VISIBILITY
532     __assoc_sub_state() : __state_(0) {}
533
534     _LIBCPP_INLINE_VISIBILITY
535     bool __has_value() const
536         {return (__state_ & __constructed) || (__exception_ != nullptr);}
537
538     _LIBCPP_INLINE_VISIBILITY
539     void __set_future_attached()
540     {
541         lock_guard<mutex> __lk(__mut_);
542         __state_ |= __future_attached;
543     }
544     _LIBCPP_INLINE_VISIBILITY
545     bool __has_future_attached() const {return __state_ & __future_attached;}
546
547     _LIBCPP_INLINE_VISIBILITY
548     void __set_deferred() {__state_ |= deferred;}
549
550     void __make_ready();
551     _LIBCPP_INLINE_VISIBILITY
552     bool __is_ready() const {return __state_ & ready;}
553
554     void set_value();
555     void set_value_at_thread_exit();
556
557     void set_exception(exception_ptr __p);
558     void set_exception_at_thread_exit(exception_ptr __p);
559
560     void copy();
561
562     void wait();
563     template <class _Rep, class _Period>
564         future_status
565         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
566     template <class _Clock, class _Duration>
567         future_status
568         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const;
569
570     virtual void __execute();
571 };
572
573 template <class _Clock, class _Duration>
574 future_status
575 __assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
576 {
577     unique_lock<mutex> __lk(__mut_);
578     if (__state_ & deferred)
579         return future_status::deferred;
580     while (!(__state_ & ready) && _Clock::now() < __abs_time)
581         __cv_.wait_until(__lk, __abs_time);
582     if (__state_ & ready)
583         return future_status::ready;
584     return future_status::timeout;
585 }
586
587 template <class _Rep, class _Period>
588 inline _LIBCPP_INLINE_VISIBILITY
589 future_status
590 __assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
591 {
592     return wait_until(chrono::steady_clock::now() + __rel_time);
593 }
594
595 template <class _Rp>
596 class __assoc_state
597     : public __assoc_sub_state
598 {
599     typedef __assoc_sub_state base;
600     typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up;
601 protected:
602     _Up __value_;
603
604     virtual void __on_zero_shared() _NOEXCEPT;
605 public:
606
607     template <class _Arg>
608 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
609         void set_value(_Arg&& __arg);
610 #else
611         void set_value(_Arg& __arg);
612 #endif
613
614     template <class _Arg>
615 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
616         void set_value_at_thread_exit(_Arg&& __arg);
617 #else
618         void set_value_at_thread_exit(_Arg& __arg);
619 #endif
620
621     _Rp move();
622     typename add_lvalue_reference<_Rp>::type copy();
623 };
624
625 template <class _Rp>
626 void
627 __assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT
628 {
629     if (this->__state_ & base::__constructed)
630         reinterpret_cast<_Rp*>(&__value_)->~_Rp();
631     delete this;
632 }
633
634 template <class _Rp>
635 template <class _Arg>
636 void
637 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
638 __assoc_state<_Rp>::set_value(_Arg&& __arg)
639 #else
640 __assoc_state<_Rp>::set_value(_Arg& __arg)
641 #endif
642 {
643     unique_lock<mutex> __lk(this->__mut_);
644 #ifndef _LIBCPP_NO_EXCEPTIONS
645     if (this->__has_value())
646         throw future_error(make_error_code(future_errc::promise_already_satisfied));
647 #endif
648     ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
649     this->__state_ |= base::__constructed | base::ready;
650     __lk.unlock();
651     __cv_.notify_all();
652 }
653
654 template <class _Rp>
655 template <class _Arg>
656 void
657 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
658 __assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg)
659 #else
660 __assoc_state<_Rp>::set_value_at_thread_exit(_Arg& __arg)
661 #endif
662 {
663     unique_lock<mutex> __lk(this->__mut_);
664 #ifndef _LIBCPP_NO_EXCEPTIONS
665     if (this->__has_value())
666         throw future_error(make_error_code(future_errc::promise_already_satisfied));
667 #endif
668     ::new(&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
669     this->__state_ |= base::__constructed;
670     __thread_local_data()->__make_ready_at_thread_exit(this);
671     __lk.unlock();
672 }
673
674 template <class _Rp>
675 _Rp
676 __assoc_state<_Rp>::move()
677 {
678     unique_lock<mutex> __lk(this->__mut_);
679     this->__sub_wait(__lk);
680     if (this->__exception_ != nullptr)
681         rethrow_exception(this->__exception_);
682     return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_));
683 }
684
685 template <class _Rp>
686 typename add_lvalue_reference<_Rp>::type
687 __assoc_state<_Rp>::copy()
688 {
689     unique_lock<mutex> __lk(this->__mut_);
690     this->__sub_wait(__lk);
691     if (this->__exception_ != nullptr)
692         rethrow_exception(this->__exception_);
693     return *reinterpret_cast<_Rp*>(&__value_);
694 }
695
696 template <class _Rp>
697 class __assoc_state<_Rp&>
698     : public __assoc_sub_state
699 {
700     typedef __assoc_sub_state base;
701     typedef _Rp* _Up;
702 protected:
703     _Up __value_;
704
705     virtual void __on_zero_shared() _NOEXCEPT;
706 public:
707
708     void set_value(_Rp& __arg);
709     void set_value_at_thread_exit(_Rp& __arg);
710
711     _Rp& copy();
712 };
713
714 template <class _Rp>
715 void
716 __assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT
717 {
718     delete this;
719 }
720
721 template <class _Rp>
722 void
723 __assoc_state<_Rp&>::set_value(_Rp& __arg)
724 {
725     unique_lock<mutex> __lk(this->__mut_);
726 #ifndef _LIBCPP_NO_EXCEPTIONS
727     if (this->__has_value())
728         throw future_error(make_error_code(future_errc::promise_already_satisfied));
729 #endif
730     __value_ = &__arg;
731     this->__state_ |= base::__constructed | base::ready;
732     __lk.unlock();
733     __cv_.notify_all();
734 }
735
736 template <class _Rp>
737 void
738 __assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
739 {
740     unique_lock<mutex> __lk(this->__mut_);
741 #ifndef _LIBCPP_NO_EXCEPTIONS
742     if (this->__has_value())
743         throw future_error(make_error_code(future_errc::promise_already_satisfied));
744 #endif
745     __value_ = &__arg;
746     this->__state_ |= base::__constructed;
747     __thread_local_data()->__make_ready_at_thread_exit(this);
748     __lk.unlock();
749 }
750
751 template <class _Rp>
752 _Rp&
753 __assoc_state<_Rp&>::copy()
754 {
755     unique_lock<mutex> __lk(this->__mut_);
756     this->__sub_wait(__lk);
757     if (this->__exception_ != nullptr)
758         rethrow_exception(this->__exception_);
759     return *__value_;
760 }
761
762 template <class _Rp, class _Alloc>
763 class __assoc_state_alloc
764     : public __assoc_state<_Rp>
765 {
766     typedef __assoc_state<_Rp> base;
767     _Alloc __alloc_;
768
769     virtual void __on_zero_shared() _NOEXCEPT;
770 public:
771     _LIBCPP_INLINE_VISIBILITY
772     explicit __assoc_state_alloc(const _Alloc& __a)
773         : __alloc_(__a) {}
774 };
775
776 template <class _Rp, class _Alloc>
777 void
778 __assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT
779 {
780     if (this->__state_ & base::__constructed)
781         reinterpret_cast<_Rp*>(&this->__value_)->~_Rp();
782     typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
783     this->~__assoc_state_alloc();
784     __a.deallocate(this, 1);
785 }
786
787 template <class _Rp, class _Alloc>
788 class __assoc_state_alloc<_Rp&, _Alloc>
789     : public __assoc_state<_Rp&>
790 {
791     typedef __assoc_state<_Rp&> base;
792     _Alloc __alloc_;
793
794     virtual void __on_zero_shared() _NOEXCEPT;
795 public:
796     _LIBCPP_INLINE_VISIBILITY
797     explicit __assoc_state_alloc(const _Alloc& __a)
798         : __alloc_(__a) {}
799 };
800
801 template <class _Rp, class _Alloc>
802 void
803 __assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT
804 {
805     typename _Alloc::template rebind<__assoc_state_alloc>::other __a(__alloc_);
806     this->~__assoc_state_alloc();
807     __a.deallocate(this, 1);
808 }
809
810 template <class _Alloc>
811 class __assoc_sub_state_alloc
812     : public __assoc_sub_state
813 {
814     typedef __assoc_sub_state base;
815     _Alloc __alloc_;
816
817     virtual void __on_zero_shared() _NOEXCEPT;
818 public:
819     _LIBCPP_INLINE_VISIBILITY
820     explicit __assoc_sub_state_alloc(const _Alloc& __a)
821         : __alloc_(__a) {}
822 };
823
824 template <class _Alloc>
825 void
826 __assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
827 {
828     typename _Alloc::template rebind<__assoc_sub_state_alloc>::other __a(__alloc_);
829     this->~__assoc_sub_state_alloc();
830     __a.deallocate(this, 1);
831 }
832
833 template <class _Rp, class _Fp>
834 class __deferred_assoc_state
835     : public __assoc_state<_Rp>
836 {
837     typedef __assoc_state<_Rp> base;
838
839     _Fp __func_;
840
841 public:
842 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
843     explicit __deferred_assoc_state(_Fp&& __f);
844 #endif
845
846     virtual void __execute();
847 };
848
849 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
850
851 template <class _Rp, class _Fp>
852 inline _LIBCPP_INLINE_VISIBILITY
853 __deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
854     : __func_(_VSTD::forward<_Fp>(__f))
855 {
856     this->__set_deferred();
857 }
858
859 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
860
861 template <class _Rp, class _Fp>
862 void
863 __deferred_assoc_state<_Rp, _Fp>::__execute()
864 {
865 #ifndef _LIBCPP_NO_EXCEPTIONS
866     try
867     {
868 #endif  // _LIBCPP_NO_EXCEPTIONS
869         this->set_value(__func_());
870 #ifndef _LIBCPP_NO_EXCEPTIONS
871     }
872     catch (...)
873     {
874         this->set_exception(current_exception());
875     }
876 #endif  // _LIBCPP_NO_EXCEPTIONS
877 }
878
879 template <class _Fp>
880 class __deferred_assoc_state<void, _Fp>
881     : public __assoc_sub_state
882 {
883     typedef __assoc_sub_state base;
884
885     _Fp __func_;
886
887 public:
888 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
889     explicit __deferred_assoc_state(_Fp&& __f);
890 #endif
891
892     virtual void __execute();
893 };
894
895 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
896
897 template <class _Fp>
898 inline _LIBCPP_INLINE_VISIBILITY
899 __deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
900     : __func_(_VSTD::forward<_Fp>(__f))
901 {
902     this->__set_deferred();
903 }
904
905 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
906
907 template <class _Fp>
908 void
909 __deferred_assoc_state<void, _Fp>::__execute()
910 {
911 #ifndef _LIBCPP_NO_EXCEPTIONS
912     try
913     {
914 #endif  // _LIBCPP_NO_EXCEPTIONS
915         __func_();
916         this->set_value();
917 #ifndef _LIBCPP_NO_EXCEPTIONS
918     }
919     catch (...)
920     {
921         this->set_exception(current_exception());
922     }
923 #endif  // _LIBCPP_NO_EXCEPTIONS
924 }
925
926 template <class _Rp, class _Fp>
927 class __async_assoc_state
928     : public __assoc_state<_Rp>
929 {
930     typedef __assoc_state<_Rp> base;
931
932     _Fp __func_;
933
934     virtual void __on_zero_shared() _NOEXCEPT;
935 public:
936 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
937     explicit __async_assoc_state(_Fp&& __f);
938 #endif
939
940     virtual void __execute();
941 };
942
943 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
944
945 template <class _Rp, class _Fp>
946 inline _LIBCPP_INLINE_VISIBILITY
947 __async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
948     : __func_(_VSTD::forward<_Fp>(__f))
949 {
950 }
951
952 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
953
954 template <class _Rp, class _Fp>
955 void
956 __async_assoc_state<_Rp, _Fp>::__execute()
957 {
958 #ifndef _LIBCPP_NO_EXCEPTIONS
959     try
960     {
961 #endif  // _LIBCPP_NO_EXCEPTIONS
962         this->set_value(__func_());
963 #ifndef _LIBCPP_NO_EXCEPTIONS
964     }
965     catch (...)
966     {
967         this->set_exception(current_exception());
968     }
969 #endif  // _LIBCPP_NO_EXCEPTIONS
970 }
971
972 template <class _Rp, class _Fp>
973 void
974 __async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT
975 {
976     this->wait();
977     base::__on_zero_shared();
978 }
979
980 template <class _Fp>
981 class __async_assoc_state<void, _Fp>
982     : public __assoc_sub_state
983 {
984     typedef __assoc_sub_state base;
985
986     _Fp __func_;
987
988     virtual void __on_zero_shared() _NOEXCEPT;
989 public:
990 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
991     explicit __async_assoc_state(_Fp&& __f);
992 #endif
993
994     virtual void __execute();
995 };
996
997 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
998
999 template <class _Fp>
1000 inline _LIBCPP_INLINE_VISIBILITY
1001 __async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
1002     : __func_(_VSTD::forward<_Fp>(__f))
1003 {
1004 }
1005
1006 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1007
1008 template <class _Fp>
1009 void
1010 __async_assoc_state<void, _Fp>::__execute()
1011 {
1012 #ifndef _LIBCPP_NO_EXCEPTIONS
1013     try
1014     {
1015 #endif  // _LIBCPP_NO_EXCEPTIONS
1016         __func_();
1017         this->set_value();
1018 #ifndef _LIBCPP_NO_EXCEPTIONS
1019     }
1020     catch (...)
1021     {
1022         this->set_exception(current_exception());
1023     }
1024 #endif  // _LIBCPP_NO_EXCEPTIONS
1025 }
1026
1027 template <class _Fp>
1028 void
1029 __async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT
1030 {
1031     this->wait();
1032     base::__on_zero_shared();
1033 }
1034
1035 template <class _Rp> class _LIBCPP_TYPE_VIS promise;
1036 template <class _Rp> class _LIBCPP_TYPE_VIS shared_future;
1037
1038 // future
1039
1040 template <class _Rp> class _LIBCPP_TYPE_VIS future;
1041
1042 template <class _Rp, class _Fp>
1043 future<_Rp>
1044 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1045 __make_deferred_assoc_state(_Fp&& __f);
1046 #else
1047 __make_deferred_assoc_state(_Fp __f);
1048 #endif
1049
1050 template <class _Rp, class _Fp>
1051 future<_Rp>
1052 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1053 __make_async_assoc_state(_Fp&& __f);
1054 #else
1055 __make_async_assoc_state(_Fp __f);
1056 #endif
1057
1058 template <class _Rp>
1059 class _LIBCPP_TYPE_VIS future
1060 {
1061     __assoc_state<_Rp>* __state_;
1062
1063     explicit future(__assoc_state<_Rp>* __state);
1064
1065     template <class> friend class promise;
1066     template <class> friend class shared_future;
1067
1068 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1069     template <class _R1, class _Fp>
1070         friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1071     template <class _R1, class _Fp>
1072         friend future<_R1> __make_async_assoc_state(_Fp&& __f);
1073 #else
1074     template <class _R1, class _Fp>
1075         friend future<_R1> __make_deferred_assoc_state(_Fp __f);
1076     template <class _R1, class _Fp>
1077         friend future<_R1> __make_async_assoc_state(_Fp __f);
1078 #endif
1079
1080 public:
1081     _LIBCPP_INLINE_VISIBILITY
1082     future() _NOEXCEPT : __state_(nullptr) {}
1083 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1084     _LIBCPP_INLINE_VISIBILITY
1085     future(future&& __rhs) _NOEXCEPT
1086         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1087     future(const future&) = delete;
1088     future& operator=(const future&) = delete;
1089     _LIBCPP_INLINE_VISIBILITY
1090     future& operator=(future&& __rhs) _NOEXCEPT
1091         {
1092             future(std::move(__rhs)).swap(*this);
1093             return *this;
1094         }
1095 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1096 private:
1097     future(const future&);
1098     future& operator=(const future&);
1099 public:
1100 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1101     ~future();
1102     shared_future<_Rp> share();
1103
1104     // retrieving the value
1105     _Rp get();
1106
1107     _LIBCPP_INLINE_VISIBILITY
1108     void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1109
1110     // functions to check state
1111     _LIBCPP_INLINE_VISIBILITY
1112     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1113
1114     _LIBCPP_INLINE_VISIBILITY
1115     void wait() const {__state_->wait();}
1116     template <class _Rep, class _Period>
1117         _LIBCPP_INLINE_VISIBILITY
1118         future_status
1119         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1120             {return __state_->wait_for(__rel_time);}
1121     template <class _Clock, class _Duration>
1122         _LIBCPP_INLINE_VISIBILITY
1123         future_status
1124         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1125             {return __state_->wait_until(__abs_time);}
1126 };
1127
1128 template <class _Rp>
1129 future<_Rp>::future(__assoc_state<_Rp>* __state)
1130     : __state_(__state)
1131 {
1132 #ifndef _LIBCPP_NO_EXCEPTIONS
1133     if (__state_->__has_future_attached())
1134         throw future_error(make_error_code(future_errc::future_already_retrieved));
1135 #endif
1136     __state_->__add_shared();
1137     __state_->__set_future_attached();
1138 }
1139
1140 struct __release_shared_count
1141 {
1142     void operator()(__shared_count* p) {p->__release_shared();}
1143 };
1144
1145 template <class _Rp>
1146 future<_Rp>::~future()
1147 {
1148     if (__state_)
1149         __state_->__release_shared();
1150 }
1151
1152 template <class _Rp>
1153 _Rp
1154 future<_Rp>::get()
1155 {
1156     unique_ptr<__shared_count, __release_shared_count> __(__state_);
1157     __assoc_state<_Rp>* __s = __state_;
1158     __state_ = nullptr;
1159     return __s->move();
1160 }
1161
1162 template <class _Rp>
1163 class _LIBCPP_TYPE_VIS future<_Rp&>
1164 {
1165     __assoc_state<_Rp&>* __state_;
1166
1167     explicit future(__assoc_state<_Rp&>* __state);
1168
1169     template <class> friend class promise;
1170     template <class> friend class shared_future;
1171
1172 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1173     template <class _R1, class _Fp>
1174         friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1175     template <class _R1, class _Fp>
1176         friend future<_R1> __make_async_assoc_state(_Fp&& __f);
1177 #else
1178     template <class _R1, class _Fp>
1179         friend future<_R1> __make_deferred_assoc_state(_Fp __f);
1180     template <class _R1, class _Fp>
1181         friend future<_R1> __make_async_assoc_state(_Fp __f);
1182 #endif
1183
1184 public:
1185     _LIBCPP_INLINE_VISIBILITY
1186     future() _NOEXCEPT : __state_(nullptr) {}
1187 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1188     _LIBCPP_INLINE_VISIBILITY
1189     future(future&& __rhs) _NOEXCEPT
1190         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1191     future(const future&) = delete;
1192     future& operator=(const future&) = delete;
1193     _LIBCPP_INLINE_VISIBILITY
1194     future& operator=(future&& __rhs) _NOEXCEPT
1195         {
1196             future(std::move(__rhs)).swap(*this);
1197             return *this;
1198         }
1199 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1200 private:
1201     future(const future&);
1202     future& operator=(const future&);
1203 public:
1204 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1205     ~future();
1206     shared_future<_Rp&> share();
1207
1208     // retrieving the value
1209     _Rp& get();
1210
1211     _LIBCPP_INLINE_VISIBILITY
1212     void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1213
1214     // functions to check state
1215     _LIBCPP_INLINE_VISIBILITY
1216     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1217
1218     _LIBCPP_INLINE_VISIBILITY
1219     void wait() const {__state_->wait();}
1220     template <class _Rep, class _Period>
1221         _LIBCPP_INLINE_VISIBILITY
1222         future_status
1223         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1224             {return __state_->wait_for(__rel_time);}
1225     template <class _Clock, class _Duration>
1226         _LIBCPP_INLINE_VISIBILITY
1227         future_status
1228         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1229             {return __state_->wait_until(__abs_time);}
1230 };
1231
1232 template <class _Rp>
1233 future<_Rp&>::future(__assoc_state<_Rp&>* __state)
1234     : __state_(__state)
1235 {
1236 #ifndef _LIBCPP_NO_EXCEPTIONS
1237     if (__state_->__has_future_attached())
1238         throw future_error(make_error_code(future_errc::future_already_retrieved));
1239 #endif
1240     __state_->__add_shared();
1241     __state_->__set_future_attached();
1242 }
1243
1244 template <class _Rp>
1245 future<_Rp&>::~future()
1246 {
1247     if (__state_)
1248         __state_->__release_shared();
1249 }
1250
1251 template <class _Rp>
1252 _Rp&
1253 future<_Rp&>::get()
1254 {
1255     unique_ptr<__shared_count, __release_shared_count> __(__state_);
1256     __assoc_state<_Rp&>* __s = __state_;
1257     __state_ = nullptr;
1258     return __s->copy();
1259 }
1260
1261 template <>
1262 class _LIBCPP_TYPE_VIS future<void>
1263 {
1264     __assoc_sub_state* __state_;
1265
1266     explicit future(__assoc_sub_state* __state);
1267
1268     template <class> friend class promise;
1269     template <class> friend class shared_future;
1270
1271 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1272     template <class _R1, class _Fp>
1273         friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1274     template <class _R1, class _Fp>
1275         friend future<_R1> __make_async_assoc_state(_Fp&& __f);
1276 #else
1277     template <class _R1, class _Fp>
1278         friend future<_R1> __make_deferred_assoc_state(_Fp __f);
1279     template <class _R1, class _Fp>
1280         friend future<_R1> __make_async_assoc_state(_Fp __f);
1281 #endif
1282
1283 public:
1284     _LIBCPP_INLINE_VISIBILITY
1285     future() _NOEXCEPT : __state_(nullptr) {}
1286 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1287     _LIBCPP_INLINE_VISIBILITY
1288     future(future&& __rhs) _NOEXCEPT
1289         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1290     future(const future&) = delete;
1291     future& operator=(const future&) = delete;
1292     _LIBCPP_INLINE_VISIBILITY
1293     future& operator=(future&& __rhs) _NOEXCEPT
1294         {
1295             future(std::move(__rhs)).swap(*this);
1296             return *this;
1297         }
1298 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1299 private:
1300     future(const future&);
1301     future& operator=(const future&);
1302 public:
1303 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1304     ~future();
1305     shared_future<void> share();
1306
1307     // retrieving the value
1308     void get();
1309
1310     _LIBCPP_INLINE_VISIBILITY
1311     void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1312
1313     // functions to check state
1314     _LIBCPP_INLINE_VISIBILITY
1315     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1316
1317     _LIBCPP_INLINE_VISIBILITY
1318     void wait() const {__state_->wait();}
1319     template <class _Rep, class _Period>
1320         _LIBCPP_INLINE_VISIBILITY
1321         future_status
1322         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1323             {return __state_->wait_for(__rel_time);}
1324     template <class _Clock, class _Duration>
1325         _LIBCPP_INLINE_VISIBILITY
1326         future_status
1327         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1328             {return __state_->wait_until(__abs_time);}
1329 };
1330
1331 template <class _Rp>
1332 inline _LIBCPP_INLINE_VISIBILITY
1333 void
1334 swap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT
1335 {
1336     __x.swap(__y);
1337 }
1338
1339 // promise<R>
1340
1341 template <class _Callable> class packaged_task;
1342
1343 template <class _Rp>
1344 class _LIBCPP_TYPE_VIS promise
1345 {
1346     __assoc_state<_Rp>* __state_;
1347
1348     _LIBCPP_INLINE_VISIBILITY
1349     explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
1350
1351     template <class> friend class packaged_task;
1352 public:
1353     promise();
1354     template <class _Alloc>
1355         promise(allocator_arg_t, const _Alloc& __a);
1356 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1357     _LIBCPP_INLINE_VISIBILITY
1358     promise(promise&& __rhs) _NOEXCEPT
1359         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1360     promise(const promise& __rhs) = delete;
1361 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1362 private:
1363     promise(const promise& __rhs);
1364 public:
1365 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1366     ~promise();
1367
1368     // assignment
1369 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1370     _LIBCPP_INLINE_VISIBILITY
1371     promise& operator=(promise&& __rhs) _NOEXCEPT
1372         {
1373             promise(std::move(__rhs)).swap(*this);
1374             return *this;
1375         }
1376     promise& operator=(const promise& __rhs) = delete;
1377 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1378 private:
1379     promise& operator=(const promise& __rhs);
1380 public:
1381 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1382     _LIBCPP_INLINE_VISIBILITY
1383     void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1384
1385     // retrieving the result
1386     future<_Rp> get_future();
1387
1388     // setting the result
1389     void set_value(const _Rp& __r);
1390 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1391     void set_value(_Rp&& __r);
1392 #endif
1393     void set_exception(exception_ptr __p);
1394
1395     // setting the result with deferred notification
1396     void set_value_at_thread_exit(const _Rp& __r);
1397 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1398     void set_value_at_thread_exit(_Rp&& __r);
1399 #endif
1400     void set_exception_at_thread_exit(exception_ptr __p);
1401 };
1402
1403 template <class _Rp>
1404 promise<_Rp>::promise()
1405     : __state_(new __assoc_state<_Rp>)
1406 {
1407 }
1408
1409 template <class _Rp>
1410 template <class _Alloc>
1411 promise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0)
1412 {
1413     typedef typename _Alloc::template rebind<__assoc_state_alloc<_Rp, _Alloc> >::other _A2;
1414     typedef __allocator_destructor<_A2> _D2;
1415     _A2 __a(__a0);
1416     unique_ptr<__assoc_state_alloc<_Rp, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1417     ::new(__hold.get()) __assoc_state_alloc<_Rp, _Alloc>(__a0);
1418     __state_ = __hold.release();
1419 }
1420
1421 template <class _Rp>
1422 promise<_Rp>::~promise()
1423 {
1424     if (__state_)
1425     {
1426         if (!__state_->__has_value() && __state_->use_count() > 1)
1427             __state_->set_exception(make_exception_ptr(
1428                       future_error(make_error_code(future_errc::broken_promise))
1429                                                       ));
1430         __state_->__release_shared();
1431     }
1432 }
1433
1434 template <class _Rp>
1435 future<_Rp>
1436 promise<_Rp>::get_future()
1437 {
1438 #ifndef _LIBCPP_NO_EXCEPTIONS
1439     if (__state_ == nullptr)
1440         throw future_error(make_error_code(future_errc::no_state));
1441 #endif
1442     return future<_Rp>(__state_);
1443 }
1444
1445 template <class _Rp>
1446 void
1447 promise<_Rp>::set_value(const _Rp& __r)
1448 {
1449 #ifndef _LIBCPP_NO_EXCEPTIONS
1450     if (__state_ == nullptr)
1451         throw future_error(make_error_code(future_errc::no_state));
1452 #endif
1453     __state_->set_value(__r);
1454 }
1455
1456 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1457
1458 template <class _Rp>
1459 void
1460 promise<_Rp>::set_value(_Rp&& __r)
1461 {
1462 #ifndef _LIBCPP_NO_EXCEPTIONS
1463     if (__state_ == nullptr)
1464         throw future_error(make_error_code(future_errc::no_state));
1465 #endif
1466     __state_->set_value(_VSTD::move(__r));
1467 }
1468
1469 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1470
1471 template <class _Rp>
1472 void
1473 promise<_Rp>::set_exception(exception_ptr __p)
1474 {
1475 #ifndef _LIBCPP_NO_EXCEPTIONS
1476     if (__state_ == nullptr)
1477         throw future_error(make_error_code(future_errc::no_state));
1478 #endif
1479     __state_->set_exception(__p);
1480 }
1481
1482 template <class _Rp>
1483 void
1484 promise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
1485 {
1486 #ifndef _LIBCPP_NO_EXCEPTIONS
1487     if (__state_ == nullptr)
1488         throw future_error(make_error_code(future_errc::no_state));
1489 #endif
1490     __state_->set_value_at_thread_exit(__r);
1491 }
1492
1493 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1494
1495 template <class _Rp>
1496 void
1497 promise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
1498 {
1499 #ifndef _LIBCPP_NO_EXCEPTIONS
1500     if (__state_ == nullptr)
1501         throw future_error(make_error_code(future_errc::no_state));
1502 #endif
1503     __state_->set_value_at_thread_exit(_VSTD::move(__r));
1504 }
1505
1506 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1507
1508 template <class _Rp>
1509 void
1510 promise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
1511 {
1512 #ifndef _LIBCPP_NO_EXCEPTIONS
1513     if (__state_ == nullptr)
1514         throw future_error(make_error_code(future_errc::no_state));
1515 #endif
1516     __state_->set_exception_at_thread_exit(__p);
1517 }
1518
1519 // promise<R&>
1520
1521 template <class _Rp>
1522 class _LIBCPP_TYPE_VIS promise<_Rp&>
1523 {
1524     __assoc_state<_Rp&>* __state_;
1525
1526     _LIBCPP_INLINE_VISIBILITY
1527     explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
1528
1529     template <class> friend class packaged_task;
1530
1531 public:
1532     promise();
1533     template <class _Allocator>
1534         promise(allocator_arg_t, const _Allocator& __a);
1535 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1536     _LIBCPP_INLINE_VISIBILITY
1537     promise(promise&& __rhs) _NOEXCEPT
1538         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1539     promise(const promise& __rhs) = delete;
1540 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1541 private:
1542     promise(const promise& __rhs);
1543 public:
1544 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1545     ~promise();
1546
1547     // assignment
1548 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1549     _LIBCPP_INLINE_VISIBILITY
1550     promise& operator=(promise&& __rhs) _NOEXCEPT
1551         {
1552             promise(std::move(__rhs)).swap(*this);
1553             return *this;
1554         }
1555     promise& operator=(const promise& __rhs) = delete;
1556 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1557 private:
1558     promise& operator=(const promise& __rhs);
1559 public:
1560 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1561     _LIBCPP_INLINE_VISIBILITY
1562     void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1563
1564     // retrieving the result
1565     future<_Rp&> get_future();
1566
1567     // setting the result
1568     void set_value(_Rp& __r);
1569     void set_exception(exception_ptr __p);
1570
1571     // setting the result with deferred notification
1572     void set_value_at_thread_exit(_Rp&);
1573     void set_exception_at_thread_exit(exception_ptr __p);
1574 };
1575
1576 template <class _Rp>
1577 promise<_Rp&>::promise()
1578     : __state_(new __assoc_state<_Rp&>)
1579 {
1580 }
1581
1582 template <class _Rp>
1583 template <class _Alloc>
1584 promise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0)
1585 {
1586     typedef typename _Alloc::template rebind<__assoc_state_alloc<_Rp&, _Alloc> >::other _A2;
1587     typedef __allocator_destructor<_A2> _D2;
1588     _A2 __a(__a0);
1589     unique_ptr<__assoc_state_alloc<_Rp&, _Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1590     ::new(__hold.get()) __assoc_state_alloc<_Rp&, _Alloc>(__a0);
1591     __state_ = __hold.release();
1592 }
1593
1594 template <class _Rp>
1595 promise<_Rp&>::~promise()
1596 {
1597     if (__state_)
1598     {
1599         if (!__state_->__has_value() && __state_->use_count() > 1)
1600             __state_->set_exception(make_exception_ptr(
1601                       future_error(make_error_code(future_errc::broken_promise))
1602                                                       ));
1603         __state_->__release_shared();
1604     }
1605 }
1606
1607 template <class _Rp>
1608 future<_Rp&>
1609 promise<_Rp&>::get_future()
1610 {
1611 #ifndef _LIBCPP_NO_EXCEPTIONS
1612     if (__state_ == nullptr)
1613         throw future_error(make_error_code(future_errc::no_state));
1614 #endif
1615     return future<_Rp&>(__state_);
1616 }
1617
1618 template <class _Rp>
1619 void
1620 promise<_Rp&>::set_value(_Rp& __r)
1621 {
1622 #ifndef _LIBCPP_NO_EXCEPTIONS
1623     if (__state_ == nullptr)
1624         throw future_error(make_error_code(future_errc::no_state));
1625 #endif
1626     __state_->set_value(__r);
1627 }
1628
1629 template <class _Rp>
1630 void
1631 promise<_Rp&>::set_exception(exception_ptr __p)
1632 {
1633 #ifndef _LIBCPP_NO_EXCEPTIONS
1634     if (__state_ == nullptr)
1635         throw future_error(make_error_code(future_errc::no_state));
1636 #endif
1637     __state_->set_exception(__p);
1638 }
1639
1640 template <class _Rp>
1641 void
1642 promise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
1643 {
1644 #ifndef _LIBCPP_NO_EXCEPTIONS
1645     if (__state_ == nullptr)
1646         throw future_error(make_error_code(future_errc::no_state));
1647 #endif
1648     __state_->set_value_at_thread_exit(__r);
1649 }
1650
1651 template <class _Rp>
1652 void
1653 promise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
1654 {
1655 #ifndef _LIBCPP_NO_EXCEPTIONS
1656     if (__state_ == nullptr)
1657         throw future_error(make_error_code(future_errc::no_state));
1658 #endif
1659     __state_->set_exception_at_thread_exit(__p);
1660 }
1661
1662 // promise<void>
1663
1664 template <>
1665 class _LIBCPP_TYPE_VIS 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         promise(allocator_arg_t, const _Allocator& __a);
1678 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1679     _LIBCPP_INLINE_VISIBILITY
1680     promise(promise&& __rhs) _NOEXCEPT
1681         : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1682     promise(const promise& __rhs) = delete;
1683 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1684 private:
1685     promise(const promise& __rhs);
1686 public:
1687 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1688     ~promise();
1689
1690     // assignment
1691 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
1692     _LIBCPP_INLINE_VISIBILITY
1693     promise& operator=(promise&& __rhs) _NOEXCEPT
1694         {
1695             promise(std::move(__rhs)).swap(*this);
1696             return *this;
1697         }
1698     promise& operator=(const promise& __rhs) = delete;
1699 #else  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1700 private:
1701     promise& operator=(const promise& __rhs);
1702 public:
1703 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
1704     _LIBCPP_INLINE_VISIBILITY
1705     void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1706
1707     // retrieving the result
1708     future<void> get_future();
1709
1710     // setting the result
1711     void set_value();
1712     void set_exception(exception_ptr __p);
1713
1714     // setting the result with deferred notification
1715     void set_value_at_thread_exit();
1716     void set_exception_at_thread_exit(exception_ptr __p);
1717 };
1718
1719 template <class _Alloc>
1720 promise<void>::promise(allocator_arg_t, const _Alloc& __a0)
1721 {
1722     typedef typename _Alloc::template rebind<__assoc_sub_state_alloc<_Alloc> >::other _A2;
1723     typedef __allocator_destructor<_A2> _D2;
1724     _A2 __a(__a0);
1725     unique_ptr<__assoc_sub_state_alloc<_Alloc>, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1726     ::new(__hold.get()) __assoc_sub_state_alloc<_Alloc>(__a0);
1727     __state_ = __hold.release();
1728 }
1729
1730 template <class _Rp>
1731 inline _LIBCPP_INLINE_VISIBILITY
1732 void
1733 swap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT
1734 {
1735     __x.swap(__y);
1736 }
1737
1738 template <class _Rp, class _Alloc>
1739     struct _LIBCPP_TYPE_VIS uses_allocator<promise<_Rp>, _Alloc>
1740         : public true_type {};
1741
1742 #ifndef _LIBCPP_HAS_NO_VARIADICS
1743
1744 // packaged_task
1745
1746 template<class _Fp> class __packaged_task_base;
1747
1748 template<class _Rp, class ..._ArgTypes>
1749 class __packaged_task_base<_Rp(_ArgTypes...)>
1750 {
1751     __packaged_task_base(const __packaged_task_base&);
1752     __packaged_task_base& operator=(const __packaged_task_base&);
1753 public:
1754     _LIBCPP_INLINE_VISIBILITY
1755     __packaged_task_base() {}
1756     _LIBCPP_INLINE_VISIBILITY
1757     virtual ~__packaged_task_base() {}
1758     virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0;
1759     virtual void destroy() = 0;
1760     virtual void destroy_deallocate() = 0;
1761     virtual _Rp operator()(_ArgTypes&& ...) = 0;
1762 };
1763
1764 template<class _FD, class _Alloc, class _FB> class __packaged_task_func;
1765
1766 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1767 class __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1768     : public  __packaged_task_base<_Rp(_ArgTypes...)>
1769 {
1770     __compressed_pair<_Fp, _Alloc> __f_;
1771 public:
1772     _LIBCPP_INLINE_VISIBILITY
1773     explicit __packaged_task_func(const _Fp& __f) : __f_(__f) {}
1774     _LIBCPP_INLINE_VISIBILITY
1775     explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f)) {}
1776     _LIBCPP_INLINE_VISIBILITY
1777     __packaged_task_func(const _Fp& __f, const _Alloc& __a)
1778         : __f_(__f, __a) {}
1779     _LIBCPP_INLINE_VISIBILITY
1780     __packaged_task_func(_Fp&& __f, const _Alloc& __a)
1781         : __f_(_VSTD::move(__f), __a) {}
1782     virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT;
1783     virtual void destroy();
1784     virtual void destroy_deallocate();
1785     virtual _Rp operator()(_ArgTypes&& ... __args);
1786 };
1787
1788 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1789 void
1790 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to(
1791                               __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT
1792 {
1793     ::new (__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second()));
1794 }
1795
1796 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1797 void
1798 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy()
1799 {
1800     __f_.~__compressed_pair<_Fp, _Alloc>();
1801 }
1802
1803 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1804 void
1805 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate()
1806 {
1807     typedef typename _Alloc::template rebind<__packaged_task_func>::other _Ap;
1808     _Ap __a(__f_.second());
1809     __f_.~__compressed_pair<_Fp, _Alloc>();
1810     __a.deallocate(this, 1);
1811 }
1812
1813 template<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1814 _Rp
1815 __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
1816 {
1817     return __invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
1818 }
1819
1820 template <class _Callable> class __packaged_task_function;
1821
1822 template<class _Rp, class ..._ArgTypes>
1823 class __packaged_task_function<_Rp(_ArgTypes...)>
1824 {
1825     typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
1826     typename aligned_storage<3*sizeof(void*)>::type __buf_;
1827     __base* __f_;
1828
1829 public:
1830     typedef _Rp result_type;
1831
1832     // construct/copy/destroy:
1833     _LIBCPP_INLINE_VISIBILITY
1834     __packaged_task_function() _NOEXCEPT : __f_(nullptr) {}
1835     template<class _Fp>
1836       __packaged_task_function(_Fp&& __f);
1837     template<class _Fp, class _Alloc>
1838       __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f);
1839
1840     __packaged_task_function(__packaged_task_function&&) _NOEXCEPT;
1841     __packaged_task_function& operator=(__packaged_task_function&&) _NOEXCEPT;
1842
1843     __packaged_task_function(const __packaged_task_function&) =  delete;
1844     __packaged_task_function& operator=(const __packaged_task_function&) =  delete;
1845
1846     ~__packaged_task_function();
1847
1848     void swap(__packaged_task_function&) _NOEXCEPT;
1849
1850     _Rp operator()(_ArgTypes...) const;
1851 };
1852
1853 template<class _Rp, class ..._ArgTypes>
1854 __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) _NOEXCEPT
1855 {
1856     if (__f.__f_ == nullptr)
1857         __f_ = nullptr;
1858     else if (__f.__f_ == (__base*)&__f.__buf_)
1859     {
1860         __f_ = (__base*)&__buf_;
1861         __f.__f_->__move_to(__f_);
1862     }
1863     else
1864     {
1865         __f_ = __f.__f_;
1866         __f.__f_ = nullptr;
1867     }
1868 }
1869
1870 template<class _Rp, class ..._ArgTypes>
1871 template <class _Fp>
1872 __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
1873     : __f_(nullptr)
1874 {
1875     typedef typename remove_reference<_Fp>::type _FR;
1876     typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
1877     if (sizeof(_FF) <= sizeof(__buf_))
1878     {
1879         __f_ = (__base*)&__buf_;
1880         ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
1881     }
1882     else
1883     {
1884         typedef allocator<_FF> _Ap;
1885         _Ap __a;
1886         typedef __allocator_destructor<_Ap> _Dp;
1887         unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1888         ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a));
1889         __f_ = __hold.release();
1890     }
1891 }
1892
1893 template<class _Rp, class ..._ArgTypes>
1894 template <class _Fp, class _Alloc>
1895 __packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(
1896                                   allocator_arg_t, const _Alloc& __a0, _Fp&& __f)
1897     : __f_(nullptr)
1898 {
1899     typedef allocator_traits<_Alloc> __alloc_traits;
1900     typedef typename remove_reference<_Fp>::type _FR;
1901     typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
1902     if (sizeof(_FF) <= sizeof(__buf_))
1903     {
1904         __f_ = (__base*)&__buf_;
1905         ::new (__f_) _FF(_VSTD::forward<_Fp>(__f));
1906     }
1907     else
1908     {
1909         typedef typename __alloc_traits::template
1910 #ifndef _LIBCPP_HAS_NO_TEMPLATE_ALIASES
1911             rebind_alloc<_FF>
1912 #else
1913             rebind_alloc<_FF>::other
1914 #endif
1915                                                      _Ap;
1916         _Ap __a(__a0);
1917         typedef __allocator_destructor<_Ap> _Dp;
1918         unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1919         ::new (__hold.get()) _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
1920         __f_ = __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 _LIBCPP_INLINE_VISIBILITY
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_TYPE_VIS packaged_task<_Rp(_ArgTypes...)>
2004 {
2005 public:
2006     typedef _Rp result_type;
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         _LIBCPP_INLINE_VISIBILITY
2018         explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
2019     template <class _Fp, class _Allocator>
2020         _LIBCPP_INLINE_VISIBILITY
2021         explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
2022              : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
2023                __p_(allocator_arg, __a) {}
2024     // ~packaged_task() = default;
2025
2026     // no copy
2027     packaged_task(const packaged_task&) = delete;
2028     packaged_task& operator=(const packaged_task&) = delete;
2029
2030     // move support
2031     _LIBCPP_INLINE_VISIBILITY
2032     packaged_task(packaged_task&& __other) _NOEXCEPT
2033         : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
2034     _LIBCPP_INLINE_VISIBILITY
2035     packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
2036     {
2037         __f_ = _VSTD::move(__other.__f_);
2038         __p_ = _VSTD::move(__other.__p_);
2039         return *this;
2040     }
2041     _LIBCPP_INLINE_VISIBILITY
2042     void swap(packaged_task& __other) _NOEXCEPT
2043     {
2044         __f_.swap(__other.__f_);
2045         __p_.swap(__other.__p_);
2046     }
2047
2048     _LIBCPP_INLINE_VISIBILITY
2049     bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
2050
2051     // result retrieval
2052     _LIBCPP_INLINE_VISIBILITY
2053     future<result_type> get_future() {return __p_.get_future();}
2054
2055     // execution
2056     void operator()(_ArgTypes... __args);
2057     void make_ready_at_thread_exit(_ArgTypes... __args);
2058
2059     void reset();
2060 };
2061
2062 template<class _Rp, class ..._ArgTypes>
2063 void
2064 packaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
2065 {
2066 #ifndef _LIBCPP_NO_EXCEPTIONS
2067     if (__p_.__state_ == nullptr)
2068         throw future_error(make_error_code(future_errc::no_state));
2069     if (__p_.__state_->__has_value())
2070         throw future_error(make_error_code(future_errc::promise_already_satisfied));
2071     try
2072     {
2073 #endif  // _LIBCPP_NO_EXCEPTIONS
2074         __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...));
2075 #ifndef _LIBCPP_NO_EXCEPTIONS
2076     }
2077     catch (...)
2078     {
2079         __p_.set_exception(current_exception());
2080     }
2081 #endif  // _LIBCPP_NO_EXCEPTIONS
2082 }
2083
2084 template<class _Rp, class ..._ArgTypes>
2085 void
2086 packaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
2087 {
2088 #ifndef _LIBCPP_NO_EXCEPTIONS
2089     if (__p_.__state_ == nullptr)
2090         throw future_error(make_error_code(future_errc::no_state));
2091     if (__p_.__state_->__has_value())
2092         throw future_error(make_error_code(future_errc::promise_already_satisfied));
2093     try
2094     {
2095 #endif  // _LIBCPP_NO_EXCEPTIONS
2096         __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...));
2097 #ifndef _LIBCPP_NO_EXCEPTIONS
2098     }
2099     catch (...)
2100     {
2101         __p_.set_exception_at_thread_exit(current_exception());
2102     }
2103 #endif  // _LIBCPP_NO_EXCEPTIONS
2104 }
2105
2106 template<class _Rp, class ..._ArgTypes>
2107 void
2108 packaged_task<_Rp(_ArgTypes...)>::reset()
2109 {
2110 #ifndef _LIBCPP_NO_EXCEPTIONS
2111     if (!valid())
2112         throw future_error(make_error_code(future_errc::no_state));
2113 #endif  // _LIBCPP_NO_EXCEPTIONS
2114     __p_ = promise<result_type>();
2115 }
2116
2117 template<class ..._ArgTypes>
2118 class _LIBCPP_TYPE_VIS packaged_task<void(_ArgTypes...)>
2119 {
2120 public:
2121     typedef void result_type;
2122
2123 private:
2124     __packaged_task_function<result_type(_ArgTypes...)> __f_;
2125     promise<result_type>                                __p_;
2126
2127 public:
2128     // construction and destruction
2129     _LIBCPP_INLINE_VISIBILITY
2130     packaged_task() _NOEXCEPT : __p_(nullptr) {}
2131     template <class _Fp>
2132         _LIBCPP_INLINE_VISIBILITY
2133         explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
2134     template <class _Fp, class _Allocator>
2135         _LIBCPP_INLINE_VISIBILITY
2136         explicit packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
2137              : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
2138                __p_(allocator_arg, __a) {}
2139     // ~packaged_task() = default;
2140
2141     // no copy
2142     packaged_task(const packaged_task&) = delete;
2143     packaged_task& operator=(const packaged_task&) = delete;
2144
2145     // move support
2146     _LIBCPP_INLINE_VISIBILITY
2147     packaged_task(packaged_task&& __other) _NOEXCEPT
2148         : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
2149     _LIBCPP_INLINE_VISIBILITY
2150     packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
2151     {
2152         __f_ = _VSTD::move(__other.__f_);
2153         __p_ = _VSTD::move(__other.__p_);
2154         return *this;
2155     }
2156     _LIBCPP_INLINE_VISIBILITY
2157     void swap(packaged_task& __other) _NOEXCEPT
2158     {
2159         __f_.swap(__other.__f_);
2160         __p_.swap(__other.__p_);
2161     }
2162
2163     _LIBCPP_INLINE_VISIBILITY
2164     bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
2165
2166     // result retrieval
2167     _LIBCPP_INLINE_VISIBILITY
2168     future<result_type> get_future() {return __p_.get_future();}
2169
2170     // execution
2171     void operator()(_ArgTypes... __args);
2172     void make_ready_at_thread_exit(_ArgTypes... __args);
2173
2174     void reset();
2175 };
2176
2177 template<class ..._ArgTypes>
2178 void
2179 packaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
2180 {
2181 #ifndef _LIBCPP_NO_EXCEPTIONS
2182     if (__p_.__state_ == nullptr)
2183         throw future_error(make_error_code(future_errc::no_state));
2184     if (__p_.__state_->__has_value())
2185         throw future_error(make_error_code(future_errc::promise_already_satisfied));
2186     try
2187     {
2188 #endif  // _LIBCPP_NO_EXCEPTIONS
2189         __f_(_VSTD::forward<_ArgTypes>(__args)...);
2190         __p_.set_value();
2191 #ifndef _LIBCPP_NO_EXCEPTIONS
2192     }
2193     catch (...)
2194     {
2195         __p_.set_exception(current_exception());
2196     }
2197 #endif  // _LIBCPP_NO_EXCEPTIONS
2198 }
2199
2200 template<class ..._ArgTypes>
2201 void
2202 packaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
2203 {
2204 #ifndef _LIBCPP_NO_EXCEPTIONS
2205     if (__p_.__state_ == nullptr)
2206         throw future_error(make_error_code(future_errc::no_state));
2207     if (__p_.__state_->__has_value())
2208         throw future_error(make_error_code(future_errc::promise_already_satisfied));
2209     try
2210     {
2211 #endif  // _LIBCPP_NO_EXCEPTIONS
2212         __f_(_VSTD::forward<_ArgTypes>(__args)...);
2213         __p_.set_value_at_thread_exit();
2214 #ifndef _LIBCPP_NO_EXCEPTIONS
2215     }
2216     catch (...)
2217     {
2218         __p_.set_exception_at_thread_exit(current_exception());
2219     }
2220 #endif  // _LIBCPP_NO_EXCEPTIONS
2221 }
2222
2223 template<class ..._ArgTypes>
2224 void
2225 packaged_task<void(_ArgTypes...)>::reset()
2226 {
2227 #ifndef _LIBCPP_NO_EXCEPTIONS
2228     if (!valid())
2229         throw future_error(make_error_code(future_errc::no_state));
2230 #endif  // _LIBCPP_NO_EXCEPTIONS
2231     __p_ = promise<result_type>();
2232 }
2233
2234 template <class _Callable>
2235 inline _LIBCPP_INLINE_VISIBILITY
2236 void
2237 swap(packaged_task<_Callable>& __x, packaged_task<_Callable>& __y) _NOEXCEPT
2238 {
2239     __x.swap(__y);
2240 }
2241
2242 template <class _Callable, class _Alloc>
2243 struct _LIBCPP_TYPE_VIS uses_allocator<packaged_task<_Callable>, _Alloc>
2244     : public true_type {};
2245
2246 template <class _Rp, class _Fp>
2247 future<_Rp>
2248 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2249 __make_deferred_assoc_state(_Fp&& __f)
2250 #else
2251 __make_deferred_assoc_state(_Fp __f)
2252 #endif
2253 {
2254     unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count>
2255         __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
2256     return future<_Rp>(__h.get());
2257 }
2258
2259 template <class _Rp, class _Fp>
2260 future<_Rp>
2261 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2262 __make_async_assoc_state(_Fp&& __f)
2263 #else
2264 __make_async_assoc_state(_Fp __f)
2265 #endif
2266 {
2267     unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count>
2268         __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
2269     _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach();
2270     return future<_Rp>(__h.get());
2271 }
2272
2273 template <class _Fp, class... _Args>
2274 class __async_func
2275 {
2276     tuple<_Fp, _Args...> __f_;
2277
2278 public:
2279     typedef typename __invoke_of<_Fp, _Args...>::type _Rp;
2280
2281     _LIBCPP_INLINE_VISIBILITY
2282     explicit __async_func(_Fp&& __f, _Args&&... __args)
2283         : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {}
2284
2285     _LIBCPP_INLINE_VISIBILITY
2286     __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {}
2287
2288     _Rp operator()()
2289     {
2290         typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index;
2291         return __execute(_Index());
2292     }
2293 private:
2294     template <size_t ..._Indices>
2295     _Rp
2296     __execute(__tuple_indices<_Indices...>)
2297     {
2298         return __invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
2299     }
2300 };
2301
2302 template <class _Fp, class... _Args>
2303 future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
2304 async(launch __policy, _Fp&& __f, _Args&&... __args)
2305 {
2306     typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF;
2307     typedef typename _BF::_Rp _Rp;
2308     future<_Rp> __r;
2309     if (int(__policy) & int(launch::async))
2310         __r = _VSTD::__make_async_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
2311                                                      __decay_copy(_VSTD::forward<_Args>(__args))...));
2312     else if (int(__policy) & int(launch::deferred))
2313         __r = _VSTD::__make_deferred_assoc_state<_Rp>(_BF(__decay_copy(_VSTD::forward<_Fp>(__f)),
2314                                                         __decay_copy(_VSTD::forward<_Args>(__args))...));
2315     return __r;
2316 }
2317
2318 template <class _Fp, class... _Args>
2319 inline _LIBCPP_INLINE_VISIBILITY
2320 future<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
2321 async(_Fp&& __f, _Args&&... __args)
2322 {
2323     return _VSTD::async(launch::any, _VSTD::forward<_Fp>(__f),
2324                                     _VSTD::forward<_Args>(__args)...);
2325 }
2326
2327 #endif  // _LIBCPP_HAS_NO_VARIADICS
2328
2329 // shared_future
2330
2331 template <class _Rp>
2332 class _LIBCPP_TYPE_VIS shared_future
2333 {
2334     __assoc_state<_Rp>* __state_;
2335
2336 public:
2337     _LIBCPP_INLINE_VISIBILITY
2338     shared_future() _NOEXCEPT : __state_(nullptr) {}
2339     _LIBCPP_INLINE_VISIBILITY
2340     shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
2341         {if (__state_) __state_->__add_shared();}
2342 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2343     _LIBCPP_INLINE_VISIBILITY
2344     shared_future(future<_Rp>&& __f) _NOEXCEPT : __state_(__f.__state_)
2345         {__f.__state_ = nullptr;}
2346     _LIBCPP_INLINE_VISIBILITY
2347     shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
2348         {__rhs.__state_ = nullptr;}
2349 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2350     ~shared_future();
2351     shared_future& operator=(const shared_future& __rhs);
2352 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2353     _LIBCPP_INLINE_VISIBILITY
2354     shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
2355         {
2356             shared_future(std::move(__rhs)).swap(*this);
2357             return *this;
2358         }
2359 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2360
2361     // retrieving the value
2362     _LIBCPP_INLINE_VISIBILITY
2363     const _Rp& get() const {return __state_->copy();}
2364
2365     _LIBCPP_INLINE_VISIBILITY
2366     void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
2367
2368     // functions to check state
2369     _LIBCPP_INLINE_VISIBILITY
2370     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
2371
2372     _LIBCPP_INLINE_VISIBILITY
2373     void wait() const {__state_->wait();}
2374     template <class _Rep, class _Period>
2375         _LIBCPP_INLINE_VISIBILITY
2376         future_status
2377         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
2378             {return __state_->wait_for(__rel_time);}
2379     template <class _Clock, class _Duration>
2380         _LIBCPP_INLINE_VISIBILITY
2381         future_status
2382         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
2383             {return __state_->wait_until(__abs_time);}
2384 };
2385
2386 template <class _Rp>
2387 shared_future<_Rp>::~shared_future()
2388 {
2389     if (__state_)
2390         __state_->__release_shared();
2391 }
2392
2393 template <class _Rp>
2394 shared_future<_Rp>&
2395 shared_future<_Rp>::operator=(const shared_future& __rhs)
2396 {
2397     if (__rhs.__state_)
2398         __rhs.__state_->__add_shared();
2399     if (__state_)
2400         __state_->__release_shared();
2401     __state_ = __rhs.__state_;
2402     return *this;
2403 }
2404
2405 template <class _Rp>
2406 class _LIBCPP_TYPE_VIS shared_future<_Rp&>
2407 {
2408     __assoc_state<_Rp&>* __state_;
2409
2410 public:
2411     _LIBCPP_INLINE_VISIBILITY
2412     shared_future() _NOEXCEPT : __state_(nullptr) {}
2413     _LIBCPP_INLINE_VISIBILITY
2414     shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
2415         {if (__state_) __state_->__add_shared();}
2416 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2417     _LIBCPP_INLINE_VISIBILITY
2418     shared_future(future<_Rp&>&& __f) _NOEXCEPT : __state_(__f.__state_)
2419         {__f.__state_ = nullptr;}
2420     _LIBCPP_INLINE_VISIBILITY
2421     shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
2422         {__rhs.__state_ = nullptr;}
2423 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2424     ~shared_future();
2425     shared_future& operator=(const shared_future& __rhs);
2426 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2427     _LIBCPP_INLINE_VISIBILITY
2428     shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
2429         {
2430             shared_future(std::move(__rhs)).swap(*this);
2431             return *this;
2432         }
2433 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2434
2435     // retrieving the value
2436     _LIBCPP_INLINE_VISIBILITY
2437     _Rp& get() const {return __state_->copy();}
2438
2439     _LIBCPP_INLINE_VISIBILITY
2440     void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
2441
2442     // functions to check state
2443     _LIBCPP_INLINE_VISIBILITY
2444     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
2445
2446     _LIBCPP_INLINE_VISIBILITY
2447     void wait() const {__state_->wait();}
2448     template <class _Rep, class _Period>
2449         _LIBCPP_INLINE_VISIBILITY
2450         future_status
2451         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
2452             {return __state_->wait_for(__rel_time);}
2453     template <class _Clock, class _Duration>
2454         _LIBCPP_INLINE_VISIBILITY
2455         future_status
2456         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
2457             {return __state_->wait_until(__abs_time);}
2458 };
2459
2460 template <class _Rp>
2461 shared_future<_Rp&>::~shared_future()
2462 {
2463     if (__state_)
2464         __state_->__release_shared();
2465 }
2466
2467 template <class _Rp>
2468 shared_future<_Rp&>&
2469 shared_future<_Rp&>::operator=(const shared_future& __rhs)
2470 {
2471     if (__rhs.__state_)
2472         __rhs.__state_->__add_shared();
2473     if (__state_)
2474         __state_->__release_shared();
2475     __state_ = __rhs.__state_;
2476     return *this;
2477 }
2478
2479 template <>
2480 class _LIBCPP_TYPE_VIS shared_future<void>
2481 {
2482     __assoc_sub_state* __state_;
2483
2484 public:
2485     _LIBCPP_INLINE_VISIBILITY
2486     shared_future() _NOEXCEPT : __state_(nullptr) {}
2487     _LIBCPP_INLINE_VISIBILITY
2488     shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
2489         {if (__state_) __state_->__add_shared();}
2490 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2491     _LIBCPP_INLINE_VISIBILITY
2492     shared_future(future<void>&& __f) _NOEXCEPT : __state_(__f.__state_)
2493         {__f.__state_ = nullptr;}
2494     _LIBCPP_INLINE_VISIBILITY
2495     shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
2496         {__rhs.__state_ = nullptr;}
2497 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2498     ~shared_future();
2499     shared_future& operator=(const shared_future& __rhs);
2500 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2501     _LIBCPP_INLINE_VISIBILITY
2502     shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
2503         {
2504             shared_future(std::move(__rhs)).swap(*this);
2505             return *this;
2506         }
2507 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2508
2509     // retrieving the value
2510     _LIBCPP_INLINE_VISIBILITY
2511     void get() const {__state_->copy();}
2512
2513     _LIBCPP_INLINE_VISIBILITY
2514     void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
2515
2516     // functions to check state
2517     _LIBCPP_INLINE_VISIBILITY
2518     bool valid() const _NOEXCEPT {return __state_ != nullptr;}
2519
2520     _LIBCPP_INLINE_VISIBILITY
2521     void wait() const {__state_->wait();}
2522     template <class _Rep, class _Period>
2523         _LIBCPP_INLINE_VISIBILITY
2524         future_status
2525         wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
2526             {return __state_->wait_for(__rel_time);}
2527     template <class _Clock, class _Duration>
2528         _LIBCPP_INLINE_VISIBILITY
2529         future_status
2530         wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
2531             {return __state_->wait_until(__abs_time);}
2532 };
2533
2534 template <class _Rp>
2535 inline _LIBCPP_INLINE_VISIBILITY
2536 void
2537 swap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) _NOEXCEPT
2538 {
2539     __x.swap(__y);
2540 }
2541
2542 template <class _Rp>
2543 inline _LIBCPP_INLINE_VISIBILITY
2544 shared_future<_Rp>
2545 future<_Rp>::share()
2546 {
2547     return shared_future<_Rp>(_VSTD::move(*this));
2548 }
2549
2550 template <class _Rp>
2551 inline _LIBCPP_INLINE_VISIBILITY
2552 shared_future<_Rp&>
2553 future<_Rp&>::share()
2554 {
2555     return shared_future<_Rp&>(_VSTD::move(*this));
2556 }
2557
2558 #ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
2559
2560 inline _LIBCPP_INLINE_VISIBILITY
2561 shared_future<void>
2562 future<void>::share()
2563 {
2564     return shared_future<void>(_VSTD::move(*this));
2565 }
2566
2567 #endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
2568
2569 _LIBCPP_END_NAMESPACE_STD
2570
2571 #endif  // _LIBCPP_FUTURE