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