xref: /llvm-project-15.0.7/libcxx/include/future (revision b48c5010)
13e519524SHoward Hinnant// -*- C++ -*-
2eb8650a7SLouis Dionne//===----------------------------------------------------------------------===//
33e519524SHoward Hinnant//
457b08b09SChandler Carruth// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
557b08b09SChandler Carruth// See https://llvm.org/LICENSE.txt for license information.
657b08b09SChandler Carruth// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
73e519524SHoward Hinnant//
83e519524SHoward Hinnant//===----------------------------------------------------------------------===//
93e519524SHoward Hinnant
103e519524SHoward Hinnant#ifndef _LIBCPP_FUTURE
113e519524SHoward Hinnant#define _LIBCPP_FUTURE
123e519524SHoward Hinnant
133e519524SHoward Hinnant/*
143e519524SHoward Hinnant    future synopsis
153e519524SHoward Hinnant
163e519524SHoward Hinnantnamespace std
173e519524SHoward Hinnant{
183e519524SHoward Hinnant
193e519524SHoward Hinnantenum class future_errc
203e519524SHoward Hinnant{
213b2d7ee1SHoward Hinnant    future_already_retrieved = 1,
223e519524SHoward Hinnant    promise_already_satisfied,
233b2d7ee1SHoward Hinnant    no_state,
243b2d7ee1SHoward Hinnant    broken_promise
253e519524SHoward Hinnant};
263e519524SHoward Hinnant
273e519524SHoward Hinnantenum class launch
283e519524SHoward Hinnant{
29e3120ed1SHoward Hinnant    async = 1,
30e3120ed1SHoward Hinnant    deferred = 2,
31e3120ed1SHoward Hinnant    any = async | deferred
323e519524SHoward Hinnant};
333e519524SHoward Hinnant
343e519524SHoward Hinnantenum class future_status
353e519524SHoward Hinnant{
363e519524SHoward Hinnant    ready,
373e519524SHoward Hinnant    timeout,
383e519524SHoward Hinnant    deferred
393e519524SHoward Hinnant};
403e519524SHoward Hinnant
413e519524SHoward Hinnanttemplate <> struct is_error_code_enum<future_errc> : public true_type { };
42a4820bc4SHoward Hinnanterror_code make_error_code(future_errc e) noexcept;
43a4820bc4SHoward Hinnanterror_condition make_error_condition(future_errc e) noexcept;
443e519524SHoward Hinnant
45a4820bc4SHoward Hinnantconst error_category& future_category() noexcept;
463e519524SHoward Hinnant
473e519524SHoward Hinnantclass future_error
483e519524SHoward Hinnant    : public logic_error
493e519524SHoward Hinnant{
503e519524SHoward Hinnantpublic:
513e519524SHoward Hinnant    future_error(error_code ec);  // exposition only
5287f2f168SMarshall Clow    explicit future_error(future_errc); // C++17
53a4820bc4SHoward Hinnant    const error_code& code() const noexcept;
54a4820bc4SHoward Hinnant    const char*       what() const noexcept;
553e519524SHoward Hinnant};
563e519524SHoward Hinnant
573e519524SHoward Hinnanttemplate <class R>
583e519524SHoward Hinnantclass promise
593e519524SHoward Hinnant{
603e519524SHoward Hinnantpublic:
613e519524SHoward Hinnant    promise();
623e519524SHoward Hinnant    template <class Allocator>
633e519524SHoward Hinnant        promise(allocator_arg_t, const Allocator& a);
64a4820bc4SHoward Hinnant    promise(promise&& rhs) noexcept;
653e519524SHoward Hinnant    promise(const promise& rhs) = delete;
663e519524SHoward Hinnant    ~promise();
673e519524SHoward Hinnant
683e519524SHoward Hinnant    // assignment
69a4820bc4SHoward Hinnant    promise& operator=(promise&& rhs) noexcept;
703e519524SHoward Hinnant    promise& operator=(const promise& rhs) = delete;
71a4820bc4SHoward Hinnant    void swap(promise& other) noexcept;
723e519524SHoward Hinnant
733e519524SHoward Hinnant    // retrieving the result
743e519524SHoward Hinnant    future<R> get_future();
753e519524SHoward Hinnant
763e519524SHoward Hinnant    // setting the result
773e519524SHoward Hinnant    void set_value(const R& r);
783e519524SHoward Hinnant    void set_value(R&& r);
793e519524SHoward Hinnant    void set_exception(exception_ptr p);
803e519524SHoward Hinnant
813e519524SHoward Hinnant    // setting the result with deferred notification
823e519524SHoward Hinnant    void set_value_at_thread_exit(const R& r);
833e519524SHoward Hinnant    void set_value_at_thread_exit(R&& r);
843e519524SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr p);
853e519524SHoward Hinnant};
863e519524SHoward Hinnant
873e519524SHoward Hinnanttemplate <class R>
883e519524SHoward Hinnantclass promise<R&>
893e519524SHoward Hinnant{
903e519524SHoward Hinnantpublic:
913e519524SHoward Hinnant    promise();
923e519524SHoward Hinnant    template <class Allocator>
933e519524SHoward Hinnant        promise(allocator_arg_t, const Allocator& a);
94a4820bc4SHoward Hinnant    promise(promise&& rhs) noexcept;
953e519524SHoward Hinnant    promise(const promise& rhs) = delete;
963e519524SHoward Hinnant    ~promise();
973e519524SHoward Hinnant
983e519524SHoward Hinnant    // assignment
99a4820bc4SHoward Hinnant    promise& operator=(promise&& rhs) noexcept;
1003e519524SHoward Hinnant    promise& operator=(const promise& rhs) = delete;
101a4820bc4SHoward Hinnant    void swap(promise& other) noexcept;
1023e519524SHoward Hinnant
1033e519524SHoward Hinnant    // retrieving the result
104167fd108SHoward Hinnant    future<R&> get_future();
1053e519524SHoward Hinnant
1063e519524SHoward Hinnant    // setting the result
1073e519524SHoward Hinnant    void set_value(R& r);
1083e519524SHoward Hinnant    void set_exception(exception_ptr p);
1093e519524SHoward Hinnant
1103e519524SHoward Hinnant    // setting the result with deferred notification
1113e519524SHoward Hinnant    void set_value_at_thread_exit(R&);
1123e519524SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr p);
1133e519524SHoward Hinnant};
1143e519524SHoward Hinnant
1153e519524SHoward Hinnanttemplate <>
1163e519524SHoward Hinnantclass promise<void>
1173e519524SHoward Hinnant{
1183e519524SHoward Hinnantpublic:
1193e519524SHoward Hinnant    promise();
1203e519524SHoward Hinnant    template <class Allocator>
1213e519524SHoward Hinnant        promise(allocator_arg_t, const Allocator& a);
122a4820bc4SHoward Hinnant    promise(promise&& rhs) noexcept;
1233e519524SHoward Hinnant    promise(const promise& rhs) = delete;
1243e519524SHoward Hinnant    ~promise();
1253e519524SHoward Hinnant
1263e519524SHoward Hinnant    // assignment
127a4820bc4SHoward Hinnant    promise& operator=(promise&& rhs) noexcept;
1283e519524SHoward Hinnant    promise& operator=(const promise& rhs) = delete;
129a4820bc4SHoward Hinnant    void swap(promise& other) noexcept;
1303e519524SHoward Hinnant
1313e519524SHoward Hinnant    // retrieving the result
132167fd108SHoward Hinnant    future<void> get_future();
1333e519524SHoward Hinnant
1343e519524SHoward Hinnant    // setting the result
1353e519524SHoward Hinnant    void set_value();
1363e519524SHoward Hinnant    void set_exception(exception_ptr p);
1373e519524SHoward Hinnant
1383e519524SHoward Hinnant    // setting the result with deferred notification
1393e519524SHoward Hinnant    void set_value_at_thread_exit();
1403e519524SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr p);
1413e519524SHoward Hinnant};
1423e519524SHoward Hinnant
143a4820bc4SHoward Hinnanttemplate <class R> void swap(promise<R>& x, promise<R>& y) noexcept;
1443e519524SHoward Hinnant
1453e519524SHoward Hinnanttemplate <class R, class Alloc>
1463e519524SHoward Hinnant    struct uses_allocator<promise<R>, Alloc> : public true_type {};
1473e519524SHoward Hinnant
1483e519524SHoward Hinnanttemplate <class R>
1493e519524SHoward Hinnantclass future
1503e519524SHoward Hinnant{
1513e519524SHoward Hinnantpublic:
152a4820bc4SHoward Hinnant    future() noexcept;
153a4820bc4SHoward Hinnant    future(future&&) noexcept;
1543e519524SHoward Hinnant    future(const future& rhs) = delete;
1553e519524SHoward Hinnant    ~future();
1563e519524SHoward Hinnant    future& operator=(const future& rhs) = delete;
157a4820bc4SHoward Hinnant    future& operator=(future&&) noexcept;
158071aded6SMarshall Clow    shared_future<R> share() noexcept;
1593e519524SHoward Hinnant
1603e519524SHoward Hinnant    // retrieving the value
1613e519524SHoward Hinnant    R get();
1623e519524SHoward Hinnant
1633e519524SHoward Hinnant    // functions to check state
164a4820bc4SHoward Hinnant    bool valid() const noexcept;
1653e519524SHoward Hinnant
1663e519524SHoward Hinnant    void wait() const;
1673e519524SHoward Hinnant    template <class Rep, class Period>
1683e519524SHoward Hinnant        future_status
1693e519524SHoward Hinnant        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
1703e519524SHoward Hinnant    template <class Clock, class Duration>
1713e519524SHoward Hinnant        future_status
1723e519524SHoward Hinnant        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
1733e519524SHoward Hinnant};
1743e519524SHoward Hinnant
1753e519524SHoward Hinnanttemplate <class R>
1763e519524SHoward Hinnantclass future<R&>
1773e519524SHoward Hinnant{
1783e519524SHoward Hinnantpublic:
179a4820bc4SHoward Hinnant    future() noexcept;
180a4820bc4SHoward Hinnant    future(future&&) noexcept;
1813e519524SHoward Hinnant    future(const future& rhs) = delete;
1823e519524SHoward Hinnant    ~future();
1833e519524SHoward Hinnant    future& operator=(const future& rhs) = delete;
184a4820bc4SHoward Hinnant    future& operator=(future&&) noexcept;
1853cd9e942SMarshall Clow    shared_future<R&> share() noexcept;
1863e519524SHoward Hinnant
1873e519524SHoward Hinnant    // retrieving the value
1883e519524SHoward Hinnant    R& get();
1893e519524SHoward Hinnant
1903e519524SHoward Hinnant    // functions to check state
191a4820bc4SHoward Hinnant    bool valid() const noexcept;
1923e519524SHoward Hinnant
1933e519524SHoward Hinnant    void wait() const;
1943e519524SHoward Hinnant    template <class Rep, class Period>
1953e519524SHoward Hinnant        future_status
1963e519524SHoward Hinnant        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
1973e519524SHoward Hinnant    template <class Clock, class Duration>
1983e519524SHoward Hinnant        future_status
1993e519524SHoward Hinnant        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
2003e519524SHoward Hinnant};
2013e519524SHoward Hinnant
2023e519524SHoward Hinnanttemplate <>
2033e519524SHoward Hinnantclass future<void>
2043e519524SHoward Hinnant{
2053e519524SHoward Hinnantpublic:
206a4820bc4SHoward Hinnant    future() noexcept;
207a4820bc4SHoward Hinnant    future(future&&) noexcept;
2083e519524SHoward Hinnant    future(const future& rhs) = delete;
2093e519524SHoward Hinnant    ~future();
2103e519524SHoward Hinnant    future& operator=(const future& rhs) = delete;
211a4820bc4SHoward Hinnant    future& operator=(future&&) noexcept;
2123cd9e942SMarshall Clow    shared_future<void> share() noexcept;
2133e519524SHoward Hinnant
2143e519524SHoward Hinnant    // retrieving the value
2153e519524SHoward Hinnant    void get();
2163e519524SHoward Hinnant
2173e519524SHoward Hinnant    // functions to check state
218a4820bc4SHoward Hinnant    bool valid() const noexcept;
2193e519524SHoward Hinnant
2203e519524SHoward Hinnant    void wait() const;
2213e519524SHoward Hinnant    template <class Rep, class Period>
2223e519524SHoward Hinnant        future_status
2233e519524SHoward Hinnant        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
2243e519524SHoward Hinnant    template <class Clock, class Duration>
2253e519524SHoward Hinnant        future_status
2263e519524SHoward Hinnant        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
2273e519524SHoward Hinnant};
2283e519524SHoward Hinnant
2293e519524SHoward Hinnanttemplate <class R>
2303e519524SHoward Hinnantclass shared_future
2313e519524SHoward Hinnant{
2323e519524SHoward Hinnantpublic:
233a4820bc4SHoward Hinnant    shared_future() noexcept;
2343e519524SHoward Hinnant    shared_future(const shared_future& rhs);
235a4820bc4SHoward Hinnant    shared_future(future<R>&&) noexcept;
236a4820bc4SHoward Hinnant    shared_future(shared_future&& rhs) noexcept;
2373e519524SHoward Hinnant    ~shared_future();
2383e519524SHoward Hinnant    shared_future& operator=(const shared_future& rhs);
239a4820bc4SHoward Hinnant    shared_future& operator=(shared_future&& rhs) noexcept;
2403e519524SHoward Hinnant
2413e519524SHoward Hinnant    // retrieving the value
2423e519524SHoward Hinnant    const R& get() const;
2433e519524SHoward Hinnant
2443e519524SHoward Hinnant    // functions to check state
245a4820bc4SHoward Hinnant    bool valid() const noexcept;
2463e519524SHoward Hinnant
2473e519524SHoward Hinnant    void wait() const;
2483e519524SHoward Hinnant    template <class Rep, class Period>
2493e519524SHoward Hinnant        future_status
2503e519524SHoward Hinnant        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
2513e519524SHoward Hinnant    template <class Clock, class Duration>
2523e519524SHoward Hinnant        future_status
2533e519524SHoward Hinnant        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
2543e519524SHoward Hinnant};
2553e519524SHoward Hinnant
2563e519524SHoward Hinnanttemplate <class R>
2573e519524SHoward Hinnantclass shared_future<R&>
2583e519524SHoward Hinnant{
2593e519524SHoward Hinnantpublic:
260a4820bc4SHoward Hinnant    shared_future() noexcept;
2613e519524SHoward Hinnant    shared_future(const shared_future& rhs);
262a4820bc4SHoward Hinnant    shared_future(future<R&>&&) noexcept;
263a4820bc4SHoward Hinnant    shared_future(shared_future&& rhs) noexcept;
2643e519524SHoward Hinnant    ~shared_future();
2653e519524SHoward Hinnant    shared_future& operator=(const shared_future& rhs);
266a4820bc4SHoward Hinnant    shared_future& operator=(shared_future&& rhs) noexcept;
2673e519524SHoward Hinnant
2683e519524SHoward Hinnant    // retrieving the value
2693e519524SHoward Hinnant    R& get() const;
2703e519524SHoward Hinnant
2713e519524SHoward Hinnant    // functions to check state
272a4820bc4SHoward Hinnant    bool valid() const noexcept;
2733e519524SHoward Hinnant
2743e519524SHoward Hinnant    void wait() const;
2753e519524SHoward Hinnant    template <class Rep, class Period>
2763e519524SHoward Hinnant        future_status
2773e519524SHoward Hinnant        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
2783e519524SHoward Hinnant    template <class Clock, class Duration>
2793e519524SHoward Hinnant        future_status
2803e519524SHoward Hinnant        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
2813e519524SHoward Hinnant};
2823e519524SHoward Hinnant
2833e519524SHoward Hinnanttemplate <>
2843e519524SHoward Hinnantclass shared_future<void>
2853e519524SHoward Hinnant{
2863e519524SHoward Hinnantpublic:
287a4820bc4SHoward Hinnant    shared_future() noexcept;
2883e519524SHoward Hinnant    shared_future(const shared_future& rhs);
289a4820bc4SHoward Hinnant    shared_future(future<void>&&) noexcept;
290a4820bc4SHoward Hinnant    shared_future(shared_future&& rhs) noexcept;
2913e519524SHoward Hinnant    ~shared_future();
2923e519524SHoward Hinnant    shared_future& operator=(const shared_future& rhs);
293a4820bc4SHoward Hinnant    shared_future& operator=(shared_future&& rhs) noexcept;
2943e519524SHoward Hinnant
2953e519524SHoward Hinnant    // retrieving the value
2963e519524SHoward Hinnant    void get() const;
2973e519524SHoward Hinnant
2983e519524SHoward Hinnant    // functions to check state
299a4820bc4SHoward Hinnant    bool valid() const noexcept;
3003e519524SHoward Hinnant
3013e519524SHoward Hinnant    void wait() const;
3023e519524SHoward Hinnant    template <class Rep, class Period>
3033e519524SHoward Hinnant        future_status
3043e519524SHoward Hinnant        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
3053e519524SHoward Hinnant    template <class Clock, class Duration>
3063e519524SHoward Hinnant        future_status
3073e519524SHoward Hinnant        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
3083e519524SHoward Hinnant};
3093e519524SHoward Hinnant
3103e519524SHoward Hinnanttemplate <class F, class... Args>
311f13cf89dSHoward Hinnant  future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
3123e519524SHoward Hinnant  async(F&& f, Args&&... args);
3133e519524SHoward Hinnant
3143e519524SHoward Hinnanttemplate <class F, class... Args>
315f13cf89dSHoward Hinnant  future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
3163e519524SHoward Hinnant  async(launch policy, F&& f, Args&&... args);
3173e519524SHoward Hinnant
3183e519524SHoward Hinnanttemplate <class> class packaged_task; // undefined
3193e519524SHoward Hinnant
3203e519524SHoward Hinnanttemplate <class R, class... ArgTypes>
3213e519524SHoward Hinnantclass packaged_task<R(ArgTypes...)>
3223e519524SHoward Hinnant{
3233e519524SHoward Hinnantpublic:
324eb5cfb02SEric Fiselier    typedef R result_type; // extension
3253e519524SHoward Hinnant
3263e519524SHoward Hinnant    // construction and destruction
327a4820bc4SHoward Hinnant    packaged_task() noexcept;
3283e519524SHoward Hinnant    template <class F>
3293e519524SHoward Hinnant        explicit packaged_task(F&& f);
330a2f3c632SMarshall Clow    template <class F, class Allocator>
331a2f3c632SMarshall Clow        packaged_task(allocator_arg_t, const Allocator& a, F&& f);
3323e519524SHoward Hinnant    ~packaged_task();
3333e519524SHoward Hinnant
3343e519524SHoward Hinnant    // no copy
3359d772d17SHoward Hinnant    packaged_task(const packaged_task&) = delete;
3369d772d17SHoward Hinnant    packaged_task& operator=(const packaged_task&) = delete;
3373e519524SHoward Hinnant
3383e519524SHoward Hinnant    // move support
339a4820bc4SHoward Hinnant    packaged_task(packaged_task&& other) noexcept;
340a4820bc4SHoward Hinnant    packaged_task& operator=(packaged_task&& other) noexcept;
341a4820bc4SHoward Hinnant    void swap(packaged_task& other) noexcept;
3423e519524SHoward Hinnant
343a4820bc4SHoward Hinnant    bool valid() const noexcept;
3443e519524SHoward Hinnant
3453e519524SHoward Hinnant    // result retrieval
3463e519524SHoward Hinnant    future<R> get_future();
3473e519524SHoward Hinnant
3483e519524SHoward Hinnant    // execution
3493e519524SHoward Hinnant    void operator()(ArgTypes... );
3503e519524SHoward Hinnant    void make_ready_at_thread_exit(ArgTypes...);
3513e519524SHoward Hinnant
3523e519524SHoward Hinnant    void reset();
3533e519524SHoward Hinnant};
3543e519524SHoward Hinnant
3553e519524SHoward Hinnanttemplate <class R>
356a4820bc4SHoward Hinnant  void swap(packaged_task<R(ArgTypes...)&, packaged_task<R(ArgTypes...)>&) noexcept;
3573e519524SHoward Hinnant
358a2f3c632SMarshall Clowtemplate <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>;
359a2f3c632SMarshall Clow
3603e519524SHoward Hinnant}  // std
3613e519524SHoward Hinnant
3623e519524SHoward Hinnant*/
3633e519524SHoward Hinnant
364385cc25aSLouis Dionne#include <__assert> // all public C++ headers provide the assertion handler
3652eadbc86SLouis Dionne#include <__availability>
366489637e6SNikolas Klauser#include <__chrono/duration.h>
367489637e6SNikolas Klauser#include <__chrono/time_point.h>
368bfbd73f8SArthur O'Dwyer#include <__config>
369050b064fSChristopher Di Bella#include <__memory/allocator_arg_t.h>
370050b064fSChristopher Di Bella#include <__memory/uses_allocator.h>
371cb8a0b07SArthur O'Dwyer#include <__utility/auto_cast.h>
3726adbc83eSChristopher Di Bella#include <__utility/forward.h>
37352915d78SNikolas Klauser#include <__utility/move.h>
374167fd108SHoward Hinnant#include <exception>
37506b40e80SArthur O'Dwyer#include <memory>
376b77c0c03SHoward Hinnant#include <mutex>
37706b40e80SArthur O'Dwyer#include <system_error>
378167fd108SHoward Hinnant#include <thread>
379bd6e6846SMark de Wever#include <version>
3803e519524SHoward Hinnant
381de4a57cbSLouis Dionne#ifndef _LIBCPP_REMOVE_TRANSITIVE_INCLUDES
382de4a57cbSLouis Dionne#  include <chrono>
383de4a57cbSLouis Dionne#endif
384de4a57cbSLouis Dionne
385073458b1SHoward Hinnant#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
3863e519524SHoward Hinnant#  pragma GCC system_header
387073458b1SHoward Hinnant#endif
3883e519524SHoward Hinnant
389afe6794bSJonathan Roelofs#ifdef _LIBCPP_HAS_NO_THREADS
3901c4b31c3SLouis Dionne# error "<future> is not supported since libc++ has been configured without support for threads."
3911c4b31c3SLouis Dionne#endif
392b3fcc67fSJonathan Roelofs
3933e519524SHoward Hinnant_LIBCPP_BEGIN_NAMESPACE_STD
3943e519524SHoward Hinnant
3953e519524SHoward Hinnant//enum class future_errc
39675689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM(future_errc)
3973e519524SHoward Hinnant{
3983b2d7ee1SHoward Hinnant    future_already_retrieved = 1,
3993e519524SHoward Hinnant    promise_already_satisfied,
4003b2d7ee1SHoward Hinnant    no_state,
4013b2d7ee1SHoward Hinnant    broken_promise
4023e519524SHoward Hinnant};
40375689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
4043e519524SHoward Hinnant
405a3988679SHoward Hinnanttemplate <>
406e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc> : public true_type {};
407dae3481bSHoward Hinnant
40893b33390SMark de Wever#ifdef _LIBCPP_CXX03_LANG
40975689c10SHoward Hinnanttemplate <>
410e2f2d1edSEric Fiselierstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc::__lx> : public true_type { };
41175689c10SHoward Hinnant#endif
41275689c10SHoward Hinnant
4133e519524SHoward Hinnant//enum class launch
41475689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM(launch)
4153e519524SHoward Hinnant{
416e3120ed1SHoward Hinnant    async = 1,
417e3120ed1SHoward Hinnant    deferred = 2,
418e3120ed1SHoward Hinnant    any = async | deferred
4193e519524SHoward Hinnant};
42075689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch)
4213e519524SHoward Hinnant
42293b33390SMark de Wever#ifndef _LIBCPP_CXX03_LANG
42318364625SHoward Hinnant
42418364625SHoward Hinnanttypedef underlying_type<launch>::type __launch_underlying_type;
42518364625SHoward Hinnant
42618364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
42718364625SHoward Hinnant_LIBCPP_CONSTEXPR
42818364625SHoward Hinnantlaunch
42918364625SHoward Hinnantoperator&(launch __x, launch __y)
43018364625SHoward Hinnant{
43118364625SHoward Hinnant    return static_cast<launch>(static_cast<__launch_underlying_type>(__x) &
43218364625SHoward Hinnant                               static_cast<__launch_underlying_type>(__y));
43318364625SHoward Hinnant}
43418364625SHoward Hinnant
43518364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
43618364625SHoward Hinnant_LIBCPP_CONSTEXPR
43718364625SHoward Hinnantlaunch
43818364625SHoward Hinnantoperator|(launch __x, launch __y)
43918364625SHoward Hinnant{
44018364625SHoward Hinnant    return static_cast<launch>(static_cast<__launch_underlying_type>(__x) |
44118364625SHoward Hinnant                               static_cast<__launch_underlying_type>(__y));
44218364625SHoward Hinnant}
44318364625SHoward Hinnant
44418364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
44518364625SHoward Hinnant_LIBCPP_CONSTEXPR
44618364625SHoward Hinnantlaunch
44718364625SHoward Hinnantoperator^(launch __x, launch __y)
44818364625SHoward Hinnant{
44918364625SHoward Hinnant    return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^
45018364625SHoward Hinnant                               static_cast<__launch_underlying_type>(__y));
45118364625SHoward Hinnant}
45218364625SHoward Hinnant
45318364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
45418364625SHoward Hinnant_LIBCPP_CONSTEXPR
45518364625SHoward Hinnantlaunch
45618364625SHoward Hinnantoperator~(launch __x)
45718364625SHoward Hinnant{
4583fc9ef22SHoward Hinnant    return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3);
45918364625SHoward Hinnant}
46018364625SHoward Hinnant
46118364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
46218364625SHoward Hinnantlaunch&
46318364625SHoward Hinnantoperator&=(launch& __x, launch __y)
46418364625SHoward Hinnant{
46518364625SHoward Hinnant    __x = __x & __y; return __x;
46618364625SHoward Hinnant}
46718364625SHoward Hinnant
46818364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
46918364625SHoward Hinnantlaunch&
47018364625SHoward Hinnantoperator|=(launch& __x, launch __y)
47118364625SHoward Hinnant{
47218364625SHoward Hinnant    __x = __x | __y; return __x;
47318364625SHoward Hinnant}
47418364625SHoward Hinnant
47518364625SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
47618364625SHoward Hinnantlaunch&
47718364625SHoward Hinnantoperator^=(launch& __x, launch __y)
47818364625SHoward Hinnant{
47918364625SHoward Hinnant    __x = __x ^ __y; return __x;
48018364625SHoward Hinnant}
48118364625SHoward Hinnant
48293b33390SMark de Wever#endif // !_LIBCPP_CXX03_LANG
48318364625SHoward Hinnant
4843e519524SHoward Hinnant//enum class future_status
48575689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM(future_status)
4863e519524SHoward Hinnant{
4873e519524SHoward Hinnant    ready,
4883e519524SHoward Hinnant    timeout,
4893e519524SHoward Hinnant    deferred
4903e519524SHoward Hinnant};
49175689c10SHoward Hinnant_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status)
4923e519524SHoward Hinnant
4936e41256fSHoward Hinnant_LIBCPP_FUNC_VIS
494a4820bc4SHoward Hinnantconst error_category& future_category() _NOEXCEPT;
495dae3481bSHoward Hinnant
496dae3481bSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
497dae3481bSHoward Hinnanterror_code
498a4820bc4SHoward Hinnantmake_error_code(future_errc __e) _NOEXCEPT
499dae3481bSHoward Hinnant{
500dae3481bSHoward Hinnant    return error_code(static_cast<int>(__e), future_category());
501dae3481bSHoward Hinnant}
502dae3481bSHoward Hinnant
503dae3481bSHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
504dae3481bSHoward Hinnanterror_condition
505a4820bc4SHoward Hinnantmake_error_condition(future_errc __e) _NOEXCEPT
506dae3481bSHoward Hinnant{
507dae3481bSHoward Hinnant    return error_condition(static_cast<int>(__e), future_category());
508dae3481bSHoward Hinnant}
509dae3481bSHoward Hinnant
510e9c66ad9SMehdi Aminiclass _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_FUTURE_ERROR future_error
511dae3481bSHoward Hinnant    : public logic_error
512dae3481bSHoward Hinnant{
513dae3481bSHoward Hinnant    error_code __ec_;
514dae3481bSHoward Hinnantpublic:
515dae3481bSHoward Hinnant    future_error(error_code __ec);
5165c703f0fSMarek Kurdej
517a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
518a4820bc4SHoward Hinnant    const error_code& code() const _NOEXCEPT {return __ec_;}
51911af28bdSHoward Hinnant
520585a3cc3SDimitry Andric    future_error(const future_error&) _NOEXCEPT = default;
52111af28bdSHoward Hinnant    virtual ~future_error() _NOEXCEPT;
522dae3481bSHoward Hinnant};
523dae3481bSHoward Hinnant
524dc7200b4SLouis Dionne_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
525e9c66ad9SMehdi Amini#ifndef _LIBCPP_NO_EXCEPTIONS
526e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_FUTURE_ERROR
527e9c66ad9SMehdi Amini#endif
528*b48c5010SNikolas Klauservoid __throw_future_error(future_errc __ev)
529a0daa739SMarshall Clow{
530a0daa739SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
531*b48c5010SNikolas Klauser    throw future_error(make_error_code(__ev));
532a0daa739SMarshall Clow#else
533*b48c5010SNikolas Klauser    ((void)__ev);
534d437fa5cSMarshall Clow    _VSTD::abort();
535a0daa739SMarshall Clow#endif
536a0daa739SMarshall Clow}
537a0daa739SMarshall Clow
538e9c66ad9SMehdi Aminiclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state
539167fd108SHoward Hinnant    : public __shared_count
540167fd108SHoward Hinnant{
541167fd108SHoward Hinnantprotected:
542167fd108SHoward Hinnant    exception_ptr __exception_;
543167fd108SHoward Hinnant    mutable mutex __mut_;
544167fd108SHoward Hinnant    mutable condition_variable __cv_;
545167fd108SHoward Hinnant    unsigned __state_;
546167fd108SHoward Hinnant
5473739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
54827f000e1SHoward Hinnant    void __sub_wait(unique_lock<mutex>& __lk);
549167fd108SHoward Hinnantpublic:
550167fd108SHoward Hinnant    enum
551167fd108SHoward Hinnant    {
552167fd108SHoward Hinnant        __constructed = 1,
553167fd108SHoward Hinnant        __future_attached = 2,
554167fd108SHoward Hinnant        ready = 4,
555167fd108SHoward Hinnant        deferred = 8
556167fd108SHoward Hinnant    };
557167fd108SHoward Hinnant
558a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
559167fd108SHoward Hinnant    __assoc_sub_state() : __state_(0) {}
560167fd108SHoward Hinnant
561a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
562167fd108SHoward Hinnant    bool __has_value() const
563167fd108SHoward Hinnant        {return (__state_ & __constructed) || (__exception_ != nullptr);}
564167fd108SHoward Hinnant
565a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
566616ef186SLouis Dionne    void __attach_future() {
5672153d696SHoward Hinnant        lock_guard<mutex> __lk(__mut_);
568616ef186SLouis Dionne        bool __has_future_attached = (__state_ & __future_attached) != 0;
569616ef186SLouis Dionne        if (__has_future_attached)
570616ef186SLouis Dionne            __throw_future_error(future_errc::future_already_retrieved);
571616ef186SLouis Dionne        this->__add_shared();
5722153d696SHoward Hinnant        __state_ |= __future_attached;
5732153d696SHoward Hinnant    }
574167fd108SHoward Hinnant
575a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
57627f000e1SHoward Hinnant    void __set_deferred() {__state_ |= deferred;}
57727f000e1SHoward Hinnant
578167fd108SHoward Hinnant    void __make_ready();
579a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
5809f21325aSMarshall Clow    bool __is_ready() const {return (__state_ & ready) != 0;}
581167fd108SHoward Hinnant
582167fd108SHoward Hinnant    void set_value();
583167fd108SHoward Hinnant    void set_value_at_thread_exit();
584167fd108SHoward Hinnant
585167fd108SHoward Hinnant    void set_exception(exception_ptr __p);
586167fd108SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr __p);
587167fd108SHoward Hinnant
588167fd108SHoward Hinnant    void copy();
589167fd108SHoward Hinnant
59027f000e1SHoward Hinnant    void wait();
591167fd108SHoward Hinnant    template <class _Rep, class _Period>
592167fd108SHoward Hinnant        future_status
593906c872dSEvgeniy Stepanov        _LIBCPP_INLINE_VISIBILITY
594167fd108SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
595167fd108SHoward Hinnant    template <class _Clock, class _Duration>
596bda3c7dfSShoaib Meenai        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
597167fd108SHoward Hinnant        future_status
598167fd108SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const;
59927f000e1SHoward Hinnant
60027f000e1SHoward Hinnant    virtual void __execute();
601167fd108SHoward Hinnant};
602167fd108SHoward Hinnant
6038759d9d4SHoward Hinnanttemplate <class _Clock, class _Duration>
6048759d9d4SHoward Hinnantfuture_status
6058759d9d4SHoward Hinnant__assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
6068759d9d4SHoward Hinnant{
6078759d9d4SHoward Hinnant    unique_lock<mutex> __lk(__mut_);
60827f000e1SHoward Hinnant    if (__state_ & deferred)
60927f000e1SHoward Hinnant        return future_status::deferred;
61027f000e1SHoward Hinnant    while (!(__state_ & ready) && _Clock::now() < __abs_time)
6118759d9d4SHoward Hinnant        __cv_.wait_until(__lk, __abs_time);
6128759d9d4SHoward Hinnant    if (__state_ & ready)
6138759d9d4SHoward Hinnant        return future_status::ready;
6148759d9d4SHoward Hinnant    return future_status::timeout;
6158759d9d4SHoward Hinnant}
6168759d9d4SHoward Hinnant
6178759d9d4SHoward Hinnanttemplate <class _Rep, class _Period>
618906c872dSEvgeniy Stepanovinline
6198759d9d4SHoward Hinnantfuture_status
6208759d9d4SHoward Hinnant__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
6218759d9d4SHoward Hinnant{
6223dc6455fSHoward Hinnant    return wait_until(chrono::steady_clock::now() + __rel_time);
6238759d9d4SHoward Hinnant}
6248759d9d4SHoward Hinnant
625c003db1fSHoward Hinnanttemplate <class _Rp>
626dd37e24aSLouis Dionneclass _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_HIDDEN __assoc_state
627167fd108SHoward Hinnant    : public __assoc_sub_state
628167fd108SHoward Hinnant{
629167fd108SHoward Hinnant    typedef __assoc_sub_state base;
630c003db1fSHoward Hinnant    typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up;
631167fd108SHoward Hinnantprotected:
632c003db1fSHoward Hinnant    _Up __value_;
633167fd108SHoward Hinnant
6343739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
635167fd108SHoward Hinnantpublic:
636167fd108SHoward Hinnant
637167fd108SHoward Hinnant    template <class _Arg>
638167fd108SHoward Hinnant    void set_value(_Arg&& __arg);
639167fd108SHoward Hinnant
640167fd108SHoward Hinnant    template <class _Arg>
641167fd108SHoward Hinnant    void set_value_at_thread_exit(_Arg&& __arg);
642167fd108SHoward Hinnant
643c003db1fSHoward Hinnant    _Rp move();
644c003db1fSHoward Hinnant    typename add_lvalue_reference<_Rp>::type copy();
645167fd108SHoward Hinnant};
646167fd108SHoward Hinnant
647c003db1fSHoward Hinnanttemplate <class _Rp>
648167fd108SHoward Hinnantvoid
649c003db1fSHoward Hinnant__assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT
650167fd108SHoward Hinnant{
651167fd108SHoward Hinnant    if (this->__state_ & base::__constructed)
652c003db1fSHoward Hinnant        reinterpret_cast<_Rp*>(&__value_)->~_Rp();
653167fd108SHoward Hinnant    delete this;
654167fd108SHoward Hinnant}
655167fd108SHoward Hinnant
656c003db1fSHoward Hinnanttemplate <class _Rp>
657167fd108SHoward Hinnanttemplate <class _Arg>
658e9c66ad9SMehdi Amini_LIBCPP_AVAILABILITY_FUTURE
659167fd108SHoward Hinnantvoid
660c003db1fSHoward Hinnant__assoc_state<_Rp>::set_value(_Arg&& __arg)
661167fd108SHoward Hinnant{
662167fd108SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
663167fd108SHoward Hinnant    if (this->__has_value())
6642d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
665be4c657bSArthur O'Dwyer    ::new ((void*)&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
666167fd108SHoward Hinnant    this->__state_ |= base::__constructed | base::ready;
667167fd108SHoward Hinnant    __cv_.notify_all();
668167fd108SHoward Hinnant}
669167fd108SHoward Hinnant
670c003db1fSHoward Hinnanttemplate <class _Rp>
671167fd108SHoward Hinnanttemplate <class _Arg>
672167fd108SHoward Hinnantvoid
673c003db1fSHoward Hinnant__assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg)
674167fd108SHoward Hinnant{
675167fd108SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
676167fd108SHoward Hinnant    if (this->__has_value())
6772d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
678be4c657bSArthur O'Dwyer    ::new ((void*)&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
679167fd108SHoward Hinnant    this->__state_ |= base::__constructed;
68010e4a48aSHoward Hinnant    __thread_local_data()->__make_ready_at_thread_exit(this);
681167fd108SHoward Hinnant}
682167fd108SHoward Hinnant
683c003db1fSHoward Hinnanttemplate <class _Rp>
684c003db1fSHoward Hinnant_Rp
685c003db1fSHoward Hinnant__assoc_state<_Rp>::move()
686167fd108SHoward Hinnant{
687167fd108SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
68827f000e1SHoward Hinnant    this->__sub_wait(__lk);
689167fd108SHoward Hinnant    if (this->__exception_ != nullptr)
690167fd108SHoward Hinnant        rethrow_exception(this->__exception_);
691c003db1fSHoward Hinnant    return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_));
692167fd108SHoward Hinnant}
693167fd108SHoward Hinnant
694c003db1fSHoward Hinnanttemplate <class _Rp>
695c003db1fSHoward Hinnanttypename add_lvalue_reference<_Rp>::type
696c003db1fSHoward Hinnant__assoc_state<_Rp>::copy()
697167fd108SHoward Hinnant{
698167fd108SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
69927f000e1SHoward Hinnant    this->__sub_wait(__lk);
700167fd108SHoward Hinnant    if (this->__exception_ != nullptr)
701167fd108SHoward Hinnant        rethrow_exception(this->__exception_);
702c003db1fSHoward Hinnant    return *reinterpret_cast<_Rp*>(&__value_);
703167fd108SHoward Hinnant}
704167fd108SHoward Hinnant
705c003db1fSHoward Hinnanttemplate <class _Rp>
706e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state<_Rp&>
7078759d9d4SHoward Hinnant    : public __assoc_sub_state
7088759d9d4SHoward Hinnant{
7098759d9d4SHoward Hinnant    typedef __assoc_sub_state base;
710c003db1fSHoward Hinnant    typedef _Rp* _Up;
7118759d9d4SHoward Hinnantprotected:
712c003db1fSHoward Hinnant    _Up __value_;
7138759d9d4SHoward Hinnant
7143739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
7158759d9d4SHoward Hinnantpublic:
7168759d9d4SHoward Hinnant
717c003db1fSHoward Hinnant    void set_value(_Rp& __arg);
718c003db1fSHoward Hinnant    void set_value_at_thread_exit(_Rp& __arg);
7198759d9d4SHoward Hinnant
720c003db1fSHoward Hinnant    _Rp& copy();
7218759d9d4SHoward Hinnant};
7228759d9d4SHoward Hinnant
723c003db1fSHoward Hinnanttemplate <class _Rp>
7248759d9d4SHoward Hinnantvoid
725c003db1fSHoward Hinnant__assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT
7268759d9d4SHoward Hinnant{
7278759d9d4SHoward Hinnant    delete this;
7288759d9d4SHoward Hinnant}
7298759d9d4SHoward Hinnant
730c003db1fSHoward Hinnanttemplate <class _Rp>
7318759d9d4SHoward Hinnantvoid
732c003db1fSHoward Hinnant__assoc_state<_Rp&>::set_value(_Rp& __arg)
7338759d9d4SHoward Hinnant{
7348759d9d4SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
7358759d9d4SHoward Hinnant    if (this->__has_value())
7362d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
7378c974205SHoward Hinnant    __value_ = _VSTD::addressof(__arg);
7388759d9d4SHoward Hinnant    this->__state_ |= base::__constructed | base::ready;
7398759d9d4SHoward Hinnant    __cv_.notify_all();
7408759d9d4SHoward Hinnant}
7418759d9d4SHoward Hinnant
742c003db1fSHoward Hinnanttemplate <class _Rp>
7438759d9d4SHoward Hinnantvoid
744c003db1fSHoward Hinnant__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
7458759d9d4SHoward Hinnant{
7468759d9d4SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
7478759d9d4SHoward Hinnant    if (this->__has_value())
7482d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
7498c974205SHoward Hinnant    __value_ = _VSTD::addressof(__arg);
7508759d9d4SHoward Hinnant    this->__state_ |= base::__constructed;
75110e4a48aSHoward Hinnant    __thread_local_data()->__make_ready_at_thread_exit(this);
7528759d9d4SHoward Hinnant}
7538759d9d4SHoward Hinnant
754c003db1fSHoward Hinnanttemplate <class _Rp>
755c003db1fSHoward Hinnant_Rp&
756c003db1fSHoward Hinnant__assoc_state<_Rp&>::copy()
7578759d9d4SHoward Hinnant{
7588759d9d4SHoward Hinnant    unique_lock<mutex> __lk(this->__mut_);
75927f000e1SHoward Hinnant    this->__sub_wait(__lk);
7608759d9d4SHoward Hinnant    if (this->__exception_ != nullptr)
7618759d9d4SHoward Hinnant        rethrow_exception(this->__exception_);
7628759d9d4SHoward Hinnant    return *__value_;
7638759d9d4SHoward Hinnant}
7648759d9d4SHoward Hinnant
765c003db1fSHoward Hinnanttemplate <class _Rp, class _Alloc>
766e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc
767c003db1fSHoward Hinnant    : public __assoc_state<_Rp>
768167fd108SHoward Hinnant{
769c003db1fSHoward Hinnant    typedef __assoc_state<_Rp> base;
770167fd108SHoward Hinnant    _Alloc __alloc_;
771167fd108SHoward Hinnant
7723739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
773167fd108SHoward Hinnantpublic:
774a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
775167fd108SHoward Hinnant    explicit __assoc_state_alloc(const _Alloc& __a)
776167fd108SHoward Hinnant        : __alloc_(__a) {}
777167fd108SHoward Hinnant};
778167fd108SHoward Hinnant
779c003db1fSHoward Hinnanttemplate <class _Rp, class _Alloc>
780167fd108SHoward Hinnantvoid
781c003db1fSHoward Hinnant__assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT
782167fd108SHoward Hinnant{
783167fd108SHoward Hinnant    if (this->__state_ & base::__constructed)
7848c974205SHoward Hinnant        reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp();
7856fe361c1SEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
7866fe361c1SEric Fiselier    typedef allocator_traits<_Al> _ATraits;
78783fb578eSEric Fiselier    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
7886fe361c1SEric Fiselier    _Al __a(__alloc_);
789167fd108SHoward Hinnant    this->~__assoc_state_alloc();
79083fb578eSEric Fiselier    __a.deallocate(_PTraits::pointer_to(*this), 1);
791167fd108SHoward Hinnant}
792167fd108SHoward Hinnant
793c003db1fSHoward Hinnanttemplate <class _Rp, class _Alloc>
794e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc<_Rp&, _Alloc>
795c003db1fSHoward Hinnant    : public __assoc_state<_Rp&>
7968759d9d4SHoward Hinnant{
797c003db1fSHoward Hinnant    typedef __assoc_state<_Rp&> base;
7988759d9d4SHoward Hinnant    _Alloc __alloc_;
7998759d9d4SHoward Hinnant
8003739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
8018759d9d4SHoward Hinnantpublic:
802a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
8038759d9d4SHoward Hinnant    explicit __assoc_state_alloc(const _Alloc& __a)
8048759d9d4SHoward Hinnant        : __alloc_(__a) {}
8058759d9d4SHoward Hinnant};
8068759d9d4SHoward Hinnant
807c003db1fSHoward Hinnanttemplate <class _Rp, class _Alloc>
8088759d9d4SHoward Hinnantvoid
809c003db1fSHoward Hinnant__assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT
8108759d9d4SHoward Hinnant{
8116fe361c1SEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
8126fe361c1SEric Fiselier    typedef allocator_traits<_Al> _ATraits;
81383fb578eSEric Fiselier    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
8146fe361c1SEric Fiselier    _Al __a(__alloc_);
8158759d9d4SHoward Hinnant    this->~__assoc_state_alloc();
81683fb578eSEric Fiselier    __a.deallocate(_PTraits::pointer_to(*this), 1);
8178759d9d4SHoward Hinnant}
8188759d9d4SHoward Hinnant
819167fd108SHoward Hinnanttemplate <class _Alloc>
820e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state_alloc
821167fd108SHoward Hinnant    : public __assoc_sub_state
822167fd108SHoward Hinnant{
823167fd108SHoward Hinnant    typedef __assoc_sub_state base;
824167fd108SHoward Hinnant    _Alloc __alloc_;
825167fd108SHoward Hinnant
8263739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
827167fd108SHoward Hinnantpublic:
828a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
829167fd108SHoward Hinnant    explicit __assoc_sub_state_alloc(const _Alloc& __a)
830167fd108SHoward Hinnant        : __alloc_(__a) {}
831167fd108SHoward Hinnant};
832167fd108SHoward Hinnant
833167fd108SHoward Hinnanttemplate <class _Alloc>
834167fd108SHoward Hinnantvoid
8353739fe79SHoward Hinnant__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
836167fd108SHoward Hinnant{
8376fe361c1SEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, __assoc_sub_state_alloc>::type _Al;
8386fe361c1SEric Fiselier    typedef allocator_traits<_Al> _ATraits;
83983fb578eSEric Fiselier    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
8406fe361c1SEric Fiselier    _Al __a(__alloc_);
841167fd108SHoward Hinnant    this->~__assoc_sub_state_alloc();
84283fb578eSEric Fiselier    __a.deallocate(_PTraits::pointer_to(*this), 1);
843167fd108SHoward Hinnant}
844167fd108SHoward Hinnant
845c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
846e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state
847c003db1fSHoward Hinnant    : public __assoc_state<_Rp>
84827f000e1SHoward Hinnant{
849c003db1fSHoward Hinnant    typedef __assoc_state<_Rp> base;
85027f000e1SHoward Hinnant
851c003db1fSHoward Hinnant    _Fp __func_;
85227f000e1SHoward Hinnant
85327f000e1SHoward Hinnantpublic:
854906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
855c003db1fSHoward Hinnant    explicit __deferred_assoc_state(_Fp&& __f);
85627f000e1SHoward Hinnant
85727f000e1SHoward Hinnant    virtual void __execute();
85827f000e1SHoward Hinnant};
85927f000e1SHoward Hinnant
860c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
861906c872dSEvgeniy Stepanovinline
862c003db1fSHoward Hinnant__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
863c003db1fSHoward Hinnant    : __func_(_VSTD::forward<_Fp>(__f))
86427f000e1SHoward Hinnant{
86527f000e1SHoward Hinnant    this->__set_deferred();
86627f000e1SHoward Hinnant}
86727f000e1SHoward Hinnant
868c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
86927f000e1SHoward Hinnantvoid
870c003db1fSHoward Hinnant__deferred_assoc_state<_Rp, _Fp>::__execute()
87127f000e1SHoward Hinnant{
87227f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
87327f000e1SHoward Hinnant    try
87427f000e1SHoward Hinnant    {
87527f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
87627f000e1SHoward Hinnant        this->set_value(__func_());
87727f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
87827f000e1SHoward Hinnant    }
87927f000e1SHoward Hinnant    catch (...)
88027f000e1SHoward Hinnant    {
88127f000e1SHoward Hinnant        this->set_exception(current_exception());
88227f000e1SHoward Hinnant    }
88327f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
88427f000e1SHoward Hinnant}
88527f000e1SHoward Hinnant
886c003db1fSHoward Hinnanttemplate <class _Fp>
887e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state<void, _Fp>
88827f000e1SHoward Hinnant    : public __assoc_sub_state
88927f000e1SHoward Hinnant{
89027f000e1SHoward Hinnant    typedef __assoc_sub_state base;
89127f000e1SHoward Hinnant
892c003db1fSHoward Hinnant    _Fp __func_;
89327f000e1SHoward Hinnant
89427f000e1SHoward Hinnantpublic:
895906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
896c003db1fSHoward Hinnant    explicit __deferred_assoc_state(_Fp&& __f);
89727f000e1SHoward Hinnant
89827f000e1SHoward Hinnant    virtual void __execute();
89927f000e1SHoward Hinnant};
90027f000e1SHoward Hinnant
901c003db1fSHoward Hinnanttemplate <class _Fp>
902906c872dSEvgeniy Stepanovinline
903c003db1fSHoward Hinnant__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
904c003db1fSHoward Hinnant    : __func_(_VSTD::forward<_Fp>(__f))
90527f000e1SHoward Hinnant{
90627f000e1SHoward Hinnant    this->__set_deferred();
90727f000e1SHoward Hinnant}
90827f000e1SHoward Hinnant
909c003db1fSHoward Hinnanttemplate <class _Fp>
91027f000e1SHoward Hinnantvoid
911c003db1fSHoward Hinnant__deferred_assoc_state<void, _Fp>::__execute()
91227f000e1SHoward Hinnant{
91327f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
91427f000e1SHoward Hinnant    try
91527f000e1SHoward Hinnant    {
91627f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
91727f000e1SHoward Hinnant        __func_();
91827f000e1SHoward Hinnant        this->set_value();
91927f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
92027f000e1SHoward Hinnant    }
92127f000e1SHoward Hinnant    catch (...)
92227f000e1SHoward Hinnant    {
92327f000e1SHoward Hinnant        this->set_exception(current_exception());
92427f000e1SHoward Hinnant    }
92527f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
92627f000e1SHoward Hinnant}
92727f000e1SHoward Hinnant
928c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
929e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state
930c003db1fSHoward Hinnant    : public __assoc_state<_Rp>
931ec0810e1SHoward Hinnant{
932c003db1fSHoward Hinnant    typedef __assoc_state<_Rp> base;
933ec0810e1SHoward Hinnant
934c003db1fSHoward Hinnant    _Fp __func_;
935ec0810e1SHoward Hinnant
9363739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
937ec0810e1SHoward Hinnantpublic:
938906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
939c003db1fSHoward Hinnant    explicit __async_assoc_state(_Fp&& __f);
940ec0810e1SHoward Hinnant
941ec0810e1SHoward Hinnant    virtual void __execute();
942ec0810e1SHoward Hinnant};
943ec0810e1SHoward Hinnant
944c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
945906c872dSEvgeniy Stepanovinline
946c003db1fSHoward Hinnant__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
947c003db1fSHoward Hinnant    : __func_(_VSTD::forward<_Fp>(__f))
948ec0810e1SHoward Hinnant{
949ec0810e1SHoward Hinnant}
950ec0810e1SHoward Hinnant
951c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
952ec0810e1SHoward Hinnantvoid
953c003db1fSHoward Hinnant__async_assoc_state<_Rp, _Fp>::__execute()
954ec0810e1SHoward Hinnant{
955ec0810e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
956ec0810e1SHoward Hinnant    try
957ec0810e1SHoward Hinnant    {
958ec0810e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
959ec0810e1SHoward Hinnant        this->set_value(__func_());
960ec0810e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
961ec0810e1SHoward Hinnant    }
962ec0810e1SHoward Hinnant    catch (...)
963ec0810e1SHoward Hinnant    {
964ec0810e1SHoward Hinnant        this->set_exception(current_exception());
965ec0810e1SHoward Hinnant    }
966ec0810e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
967ec0810e1SHoward Hinnant}
968ec0810e1SHoward Hinnant
969c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
970ec0810e1SHoward Hinnantvoid
971c003db1fSHoward Hinnant__async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT
972ec0810e1SHoward Hinnant{
973ec0810e1SHoward Hinnant    this->wait();
974ec0810e1SHoward Hinnant    base::__on_zero_shared();
975ec0810e1SHoward Hinnant}
976ec0810e1SHoward Hinnant
977c003db1fSHoward Hinnanttemplate <class _Fp>
978e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state<void, _Fp>
979ec0810e1SHoward Hinnant    : public __assoc_sub_state
980ec0810e1SHoward Hinnant{
981ec0810e1SHoward Hinnant    typedef __assoc_sub_state base;
982ec0810e1SHoward Hinnant
983c003db1fSHoward Hinnant    _Fp __func_;
984ec0810e1SHoward Hinnant
9853739fe79SHoward Hinnant    virtual void __on_zero_shared() _NOEXCEPT;
986ec0810e1SHoward Hinnantpublic:
987906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
988c003db1fSHoward Hinnant    explicit __async_assoc_state(_Fp&& __f);
989ec0810e1SHoward Hinnant
990ec0810e1SHoward Hinnant    virtual void __execute();
991ec0810e1SHoward Hinnant};
992ec0810e1SHoward Hinnant
993c003db1fSHoward Hinnanttemplate <class _Fp>
994906c872dSEvgeniy Stepanovinline
995c003db1fSHoward Hinnant__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
996c003db1fSHoward Hinnant    : __func_(_VSTD::forward<_Fp>(__f))
997ec0810e1SHoward Hinnant{
998ec0810e1SHoward Hinnant}
999ec0810e1SHoward Hinnant
1000c003db1fSHoward Hinnanttemplate <class _Fp>
1001ec0810e1SHoward Hinnantvoid
1002c003db1fSHoward Hinnant__async_assoc_state<void, _Fp>::__execute()
1003ec0810e1SHoward Hinnant{
1004ec0810e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1005ec0810e1SHoward Hinnant    try
1006ec0810e1SHoward Hinnant    {
1007ec0810e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1008ec0810e1SHoward Hinnant        __func_();
1009ec0810e1SHoward Hinnant        this->set_value();
1010ec0810e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
1011ec0810e1SHoward Hinnant    }
1012ec0810e1SHoward Hinnant    catch (...)
1013ec0810e1SHoward Hinnant    {
1014ec0810e1SHoward Hinnant        this->set_exception(current_exception());
1015ec0810e1SHoward Hinnant    }
1016ec0810e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1017ec0810e1SHoward Hinnant}
1018ec0810e1SHoward Hinnant
1019c003db1fSHoward Hinnanttemplate <class _Fp>
1020ec0810e1SHoward Hinnantvoid
1021c003db1fSHoward Hinnant__async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT
1022ec0810e1SHoward Hinnant{
1023ec0810e1SHoward Hinnant    this->wait();
1024ec0810e1SHoward Hinnant    base::__on_zero_shared();
1025ec0810e1SHoward Hinnant}
1026ec0810e1SHoward Hinnant
1027e2f2d1edSEric Fiseliertemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS promise;
1028e2f2d1edSEric Fiseliertemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS shared_future;
1029167fd108SHoward Hinnant
1030167fd108SHoward Hinnant// future
1031167fd108SHoward Hinnant
1032e2f2d1edSEric Fiseliertemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS future;
103327f000e1SHoward Hinnant
1034c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
1035dd37e24aSLouis Dionne_LIBCPP_INLINE_VISIBILITY future<_Rp>
1036c003db1fSHoward Hinnant__make_deferred_assoc_state(_Fp&& __f);
103727f000e1SHoward Hinnant
1038c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
1039dd37e24aSLouis Dionne_LIBCPP_INLINE_VISIBILITY future<_Rp>
1040c003db1fSHoward Hinnant__make_async_assoc_state(_Fp&& __f);
1041ec0810e1SHoward Hinnant
1042c003db1fSHoward Hinnanttemplate <class _Rp>
1043e9c66ad9SMehdi Aminiclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future
1044167fd108SHoward Hinnant{
1045c003db1fSHoward Hinnant    __assoc_state<_Rp>* __state_;
1046167fd108SHoward Hinnant
1047c003db1fSHoward Hinnant    explicit future(__assoc_state<_Rp>* __state);
1048167fd108SHoward Hinnant
1049167fd108SHoward Hinnant    template <class> friend class promise;
1050ead85506SHoward Hinnant    template <class> friend class shared_future;
105127f000e1SHoward Hinnant
1052c003db1fSHoward Hinnant    template <class _R1, class _Fp>
1053c003db1fSHoward Hinnant        friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1054c003db1fSHoward Hinnant    template <class _R1, class _Fp>
1055c003db1fSHoward Hinnant        friend future<_R1> __make_async_assoc_state(_Fp&& __f);
105627f000e1SHoward Hinnant
1057167fd108SHoward Hinnantpublic:
1058a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1059a4820bc4SHoward Hinnant    future() _NOEXCEPT : __state_(nullptr) {}
1060a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1061a4820bc4SHoward Hinnant    future(future&& __rhs) _NOEXCEPT
1062167fd108SHoward Hinnant        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1063167fd108SHoward Hinnant    future(const future&) = delete;
1064167fd108SHoward Hinnant    future& operator=(const future&) = delete;
1065a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1066a4820bc4SHoward Hinnant    future& operator=(future&& __rhs) _NOEXCEPT
1067167fd108SHoward Hinnant        {
1068d586f92cSArthur O'Dwyer            future(_VSTD::move(__rhs)).swap(*this);
1069167fd108SHoward Hinnant            return *this;
1070167fd108SHoward Hinnant        }
10718d4860aaSLouis Dionne
1072167fd108SHoward Hinnant    ~future();
1073906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
10743cd9e942SMarshall Clow    shared_future<_Rp> share() _NOEXCEPT;
1075167fd108SHoward Hinnant
1076167fd108SHoward Hinnant    // retrieving the value
1077c003db1fSHoward Hinnant    _Rp get();
1078167fd108SHoward Hinnant
1079a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1080a4820bc4SHoward Hinnant    void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1081167fd108SHoward Hinnant
1082167fd108SHoward Hinnant    // functions to check state
1083a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1084a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1085167fd108SHoward Hinnant
1086a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1087167fd108SHoward Hinnant    void wait() const {__state_->wait();}
1088167fd108SHoward Hinnant    template <class _Rep, class _Period>
1089a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1090167fd108SHoward Hinnant        future_status
1091167fd108SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1092167fd108SHoward Hinnant            {return __state_->wait_for(__rel_time);}
1093167fd108SHoward Hinnant    template <class _Clock, class _Duration>
1094a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1095167fd108SHoward Hinnant        future_status
1096167fd108SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1097167fd108SHoward Hinnant            {return __state_->wait_until(__abs_time);}
1098167fd108SHoward Hinnant};
1099167fd108SHoward Hinnant
1100c003db1fSHoward Hinnanttemplate <class _Rp>
1101c003db1fSHoward Hinnantfuture<_Rp>::future(__assoc_state<_Rp>* __state)
1102167fd108SHoward Hinnant    : __state_(__state)
1103167fd108SHoward Hinnant{
1104616ef186SLouis Dionne    __state_->__attach_future();
1105167fd108SHoward Hinnant}
1106167fd108SHoward Hinnant
110727f000e1SHoward Hinnantstruct __release_shared_count
110827f000e1SHoward Hinnant{
1109*b48c5010SNikolas Klauser    void operator()(__shared_count* __p) {__p->__release_shared();}
111027f000e1SHoward Hinnant};
111127f000e1SHoward Hinnant
1112c003db1fSHoward Hinnanttemplate <class _Rp>
1113c003db1fSHoward Hinnantfuture<_Rp>::~future()
1114167fd108SHoward Hinnant{
1115167fd108SHoward Hinnant    if (__state_)
1116167fd108SHoward Hinnant        __state_->__release_shared();
1117167fd108SHoward Hinnant}
1118167fd108SHoward Hinnant
1119c003db1fSHoward Hinnanttemplate <class _Rp>
1120c003db1fSHoward Hinnant_Rp
1121c003db1fSHoward Hinnantfuture<_Rp>::get()
1122167fd108SHoward Hinnant{
112327f000e1SHoward Hinnant    unique_ptr<__shared_count, __release_shared_count> __(__state_);
1124c003db1fSHoward Hinnant    __assoc_state<_Rp>* __s = __state_;
1125167fd108SHoward Hinnant    __state_ = nullptr;
1126167fd108SHoward Hinnant    return __s->move();
1127167fd108SHoward Hinnant}
1128167fd108SHoward Hinnant
1129c003db1fSHoward Hinnanttemplate <class _Rp>
1130e9c66ad9SMehdi Aminiclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future<_Rp&>
1131167fd108SHoward Hinnant{
1132c003db1fSHoward Hinnant    __assoc_state<_Rp&>* __state_;
1133167fd108SHoward Hinnant
1134c003db1fSHoward Hinnant    explicit future(__assoc_state<_Rp&>* __state);
1135167fd108SHoward Hinnant
1136167fd108SHoward Hinnant    template <class> friend class promise;
1137ead85506SHoward Hinnant    template <class> friend class shared_future;
113827f000e1SHoward Hinnant
1139c003db1fSHoward Hinnant    template <class _R1, class _Fp>
1140c003db1fSHoward Hinnant        friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1141c003db1fSHoward Hinnant    template <class _R1, class _Fp>
1142c003db1fSHoward Hinnant        friend future<_R1> __make_async_assoc_state(_Fp&& __f);
114327f000e1SHoward Hinnant
1144167fd108SHoward Hinnantpublic:
1145a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1146a4820bc4SHoward Hinnant    future() _NOEXCEPT : __state_(nullptr) {}
1147a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1148a4820bc4SHoward Hinnant    future(future&& __rhs) _NOEXCEPT
1149167fd108SHoward Hinnant        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1150167fd108SHoward Hinnant    future(const future&) = delete;
1151167fd108SHoward Hinnant    future& operator=(const future&) = delete;
1152a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1153a4820bc4SHoward Hinnant    future& operator=(future&& __rhs) _NOEXCEPT
1154167fd108SHoward Hinnant        {
1155d586f92cSArthur O'Dwyer            future(_VSTD::move(__rhs)).swap(*this);
1156167fd108SHoward Hinnant            return *this;
1157167fd108SHoward Hinnant        }
11588d4860aaSLouis Dionne
1159167fd108SHoward Hinnant    ~future();
1160906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
11613cd9e942SMarshall Clow    shared_future<_Rp&> share() _NOEXCEPT;
1162167fd108SHoward Hinnant
1163167fd108SHoward Hinnant    // retrieving the value
1164c003db1fSHoward Hinnant    _Rp& get();
1165167fd108SHoward Hinnant
1166a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1167a4820bc4SHoward Hinnant    void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1168167fd108SHoward Hinnant
1169167fd108SHoward Hinnant    // functions to check state
1170a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1171a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1172167fd108SHoward Hinnant
1173a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1174167fd108SHoward Hinnant    void wait() const {__state_->wait();}
1175167fd108SHoward Hinnant    template <class _Rep, class _Period>
1176a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1177167fd108SHoward Hinnant        future_status
1178167fd108SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1179167fd108SHoward Hinnant            {return __state_->wait_for(__rel_time);}
1180167fd108SHoward Hinnant    template <class _Clock, class _Duration>
1181a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1182167fd108SHoward Hinnant        future_status
1183167fd108SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1184167fd108SHoward Hinnant            {return __state_->wait_until(__abs_time);}
1185167fd108SHoward Hinnant};
1186167fd108SHoward Hinnant
1187c003db1fSHoward Hinnanttemplate <class _Rp>
1188c003db1fSHoward Hinnantfuture<_Rp&>::future(__assoc_state<_Rp&>* __state)
1189167fd108SHoward Hinnant    : __state_(__state)
1190167fd108SHoward Hinnant{
1191616ef186SLouis Dionne    __state_->__attach_future();
1192167fd108SHoward Hinnant}
1193167fd108SHoward Hinnant
1194c003db1fSHoward Hinnanttemplate <class _Rp>
1195c003db1fSHoward Hinnantfuture<_Rp&>::~future()
1196167fd108SHoward Hinnant{
1197167fd108SHoward Hinnant    if (__state_)
1198167fd108SHoward Hinnant        __state_->__release_shared();
1199167fd108SHoward Hinnant}
1200167fd108SHoward Hinnant
1201c003db1fSHoward Hinnanttemplate <class _Rp>
1202c003db1fSHoward Hinnant_Rp&
1203c003db1fSHoward Hinnantfuture<_Rp&>::get()
1204167fd108SHoward Hinnant{
120527f000e1SHoward Hinnant    unique_ptr<__shared_count, __release_shared_count> __(__state_);
1206c003db1fSHoward Hinnant    __assoc_state<_Rp&>* __s = __state_;
1207167fd108SHoward Hinnant    __state_ = nullptr;
1208167fd108SHoward Hinnant    return __s->copy();
1209167fd108SHoward Hinnant}
1210167fd108SHoward Hinnant
1211167fd108SHoward Hinnanttemplate <>
1212e9c66ad9SMehdi Aminiclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE future<void>
1213167fd108SHoward Hinnant{
1214167fd108SHoward Hinnant    __assoc_sub_state* __state_;
1215167fd108SHoward Hinnant
1216167fd108SHoward Hinnant    explicit future(__assoc_sub_state* __state);
1217167fd108SHoward Hinnant
1218167fd108SHoward Hinnant    template <class> friend class promise;
1219ead85506SHoward Hinnant    template <class> friend class shared_future;
122027f000e1SHoward Hinnant
1221c003db1fSHoward Hinnant    template <class _R1, class _Fp>
1222c003db1fSHoward Hinnant        friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
1223c003db1fSHoward Hinnant    template <class _R1, class _Fp>
1224c003db1fSHoward Hinnant        friend future<_R1> __make_async_assoc_state(_Fp&& __f);
122527f000e1SHoward Hinnant
1226167fd108SHoward Hinnantpublic:
1227a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1228a4820bc4SHoward Hinnant    future() _NOEXCEPT : __state_(nullptr) {}
1229a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1230a4820bc4SHoward Hinnant    future(future&& __rhs) _NOEXCEPT
1231167fd108SHoward Hinnant        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1232167fd108SHoward Hinnant    future(const future&) = delete;
1233167fd108SHoward Hinnant    future& operator=(const future&) = delete;
1234a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1235a4820bc4SHoward Hinnant    future& operator=(future&& __rhs) _NOEXCEPT
1236167fd108SHoward Hinnant        {
1237d586f92cSArthur O'Dwyer            future(_VSTD::move(__rhs)).swap(*this);
1238167fd108SHoward Hinnant            return *this;
1239167fd108SHoward Hinnant        }
12408d4860aaSLouis Dionne
1241167fd108SHoward Hinnant    ~future();
1242906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
12433cd9e942SMarshall Clow    shared_future<void> share() _NOEXCEPT;
1244167fd108SHoward Hinnant
1245167fd108SHoward Hinnant    // retrieving the value
1246167fd108SHoward Hinnant    void get();
1247167fd108SHoward Hinnant
1248a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1249a4820bc4SHoward Hinnant    void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1250167fd108SHoward Hinnant
1251167fd108SHoward Hinnant    // functions to check state
1252a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1253a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
1254167fd108SHoward Hinnant
1255a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1256167fd108SHoward Hinnant    void wait() const {__state_->wait();}
1257167fd108SHoward Hinnant    template <class _Rep, class _Period>
1258a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1259167fd108SHoward Hinnant        future_status
1260167fd108SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
1261167fd108SHoward Hinnant            {return __state_->wait_for(__rel_time);}
1262167fd108SHoward Hinnant    template <class _Clock, class _Duration>
1263a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1264167fd108SHoward Hinnant        future_status
1265167fd108SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
1266167fd108SHoward Hinnant            {return __state_->wait_until(__abs_time);}
1267167fd108SHoward Hinnant};
1268167fd108SHoward Hinnant
1269c003db1fSHoward Hinnanttemplate <class _Rp>
1270ead85506SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1271ead85506SHoward Hinnantvoid
1272a4820bc4SHoward Hinnantswap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT
1273ead85506SHoward Hinnant{
1274ead85506SHoward Hinnant    __x.swap(__y);
1275ead85506SHoward Hinnant}
1276ead85506SHoward Hinnant
1277167fd108SHoward Hinnant// promise<R>
1278167fd108SHoward Hinnant
1279ce53420eSHoward Hinnanttemplate <class _Callable> class packaged_task;
128027f000e1SHoward Hinnant
1281c003db1fSHoward Hinnanttemplate <class _Rp>
1282e9c66ad9SMehdi Aminiclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise
1283167fd108SHoward Hinnant{
1284c003db1fSHoward Hinnant    __assoc_state<_Rp>* __state_;
128527f000e1SHoward Hinnant
1286a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1287a4820bc4SHoward Hinnant    explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
128827f000e1SHoward Hinnant
128927f000e1SHoward Hinnant    template <class> friend class packaged_task;
1290167fd108SHoward Hinnantpublic:
1291167fd108SHoward Hinnant    promise();
1292167fd108SHoward Hinnant    template <class _Alloc>
1293167fd108SHoward Hinnant        promise(allocator_arg_t, const _Alloc& __a);
1294a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1295a4820bc4SHoward Hinnant    promise(promise&& __rhs) _NOEXCEPT
1296167fd108SHoward Hinnant        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1297167fd108SHoward Hinnant    promise(const promise& __rhs) = delete;
1298167fd108SHoward Hinnant    ~promise();
1299167fd108SHoward Hinnant
1300167fd108SHoward Hinnant    // assignment
1301a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1302a4820bc4SHoward Hinnant    promise& operator=(promise&& __rhs) _NOEXCEPT
1303167fd108SHoward Hinnant        {
1304d586f92cSArthur O'Dwyer            promise(_VSTD::move(__rhs)).swap(*this);
1305167fd108SHoward Hinnant            return *this;
1306167fd108SHoward Hinnant        }
1307167fd108SHoward Hinnant    promise& operator=(const promise& __rhs) = delete;
13088d4860aaSLouis Dionne
1309a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1310a4820bc4SHoward Hinnant    void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1311167fd108SHoward Hinnant
1312167fd108SHoward Hinnant    // retrieving the result
1313c003db1fSHoward Hinnant    future<_Rp> get_future();
1314167fd108SHoward Hinnant
1315167fd108SHoward Hinnant    // setting the result
1316c003db1fSHoward Hinnant    void set_value(const _Rp& __r);
1317c003db1fSHoward Hinnant    void set_value(_Rp&& __r);
1318167fd108SHoward Hinnant    void set_exception(exception_ptr __p);
1319167fd108SHoward Hinnant
1320167fd108SHoward Hinnant    // setting the result with deferred notification
1321c003db1fSHoward Hinnant    void set_value_at_thread_exit(const _Rp& __r);
1322c003db1fSHoward Hinnant    void set_value_at_thread_exit(_Rp&& __r);
1323167fd108SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr __p);
1324167fd108SHoward Hinnant};
1325167fd108SHoward Hinnant
1326c003db1fSHoward Hinnanttemplate <class _Rp>
1327c003db1fSHoward Hinnantpromise<_Rp>::promise()
1328c003db1fSHoward Hinnant    : __state_(new __assoc_state<_Rp>)
1329167fd108SHoward Hinnant{
1330167fd108SHoward Hinnant}
1331167fd108SHoward Hinnant
1332c003db1fSHoward Hinnanttemplate <class _Rp>
1333167fd108SHoward Hinnanttemplate <class _Alloc>
1334c003db1fSHoward Hinnantpromise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0)
1335167fd108SHoward Hinnant{
133683fb578eSEric Fiselier    typedef __assoc_state_alloc<_Rp, _Alloc> _State;
133783fb578eSEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
1338167fd108SHoward Hinnant    typedef __allocator_destructor<_A2> _D2;
1339167fd108SHoward Hinnant    _A2 __a(__a0);
134083fb578eSEric Fiselier    unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1341be4c657bSArthur O'Dwyer    ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0);
134283fb578eSEric Fiselier    __state_ = _VSTD::addressof(*__hold.release());
1343167fd108SHoward Hinnant}
1344167fd108SHoward Hinnant
1345c003db1fSHoward Hinnanttemplate <class _Rp>
1346c003db1fSHoward Hinnantpromise<_Rp>::~promise()
1347167fd108SHoward Hinnant{
1348167fd108SHoward Hinnant    if (__state_)
1349167fd108SHoward Hinnant    {
1350167fd108SHoward Hinnant        if (!__state_->__has_value() && __state_->use_count() > 1)
1351167fd108SHoward Hinnant            __state_->set_exception(make_exception_ptr(
1352167fd108SHoward Hinnant                      future_error(make_error_code(future_errc::broken_promise))
1353167fd108SHoward Hinnant                                                      ));
1354167fd108SHoward Hinnant        __state_->__release_shared();
1355167fd108SHoward Hinnant    }
1356167fd108SHoward Hinnant}
1357167fd108SHoward Hinnant
1358c003db1fSHoward Hinnanttemplate <class _Rp>
1359c003db1fSHoward Hinnantfuture<_Rp>
1360c003db1fSHoward Hinnantpromise<_Rp>::get_future()
1361167fd108SHoward Hinnant{
1362167fd108SHoward Hinnant    if (__state_ == nullptr)
13632d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1364c003db1fSHoward Hinnant    return future<_Rp>(__state_);
1365167fd108SHoward Hinnant}
1366167fd108SHoward Hinnant
1367c003db1fSHoward Hinnanttemplate <class _Rp>
1368167fd108SHoward Hinnantvoid
1369c003db1fSHoward Hinnantpromise<_Rp>::set_value(const _Rp& __r)
1370167fd108SHoward Hinnant{
1371167fd108SHoward Hinnant    if (__state_ == nullptr)
13722d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1373167fd108SHoward Hinnant    __state_->set_value(__r);
1374167fd108SHoward Hinnant}
1375167fd108SHoward Hinnant
1376c003db1fSHoward Hinnanttemplate <class _Rp>
1377167fd108SHoward Hinnantvoid
1378c003db1fSHoward Hinnantpromise<_Rp>::set_value(_Rp&& __r)
1379167fd108SHoward Hinnant{
1380167fd108SHoward Hinnant    if (__state_ == nullptr)
13812d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1382ce48a113SHoward Hinnant    __state_->set_value(_VSTD::move(__r));
1383167fd108SHoward Hinnant}
1384167fd108SHoward Hinnant
1385c003db1fSHoward Hinnanttemplate <class _Rp>
1386167fd108SHoward Hinnantvoid
1387c003db1fSHoward Hinnantpromise<_Rp>::set_exception(exception_ptr __p)
1388167fd108SHoward Hinnant{
13890e1c6c7eSMarshall Clow    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
1390167fd108SHoward Hinnant    if (__state_ == nullptr)
13912d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1392167fd108SHoward Hinnant    __state_->set_exception(__p);
1393167fd108SHoward Hinnant}
1394167fd108SHoward Hinnant
1395c003db1fSHoward Hinnanttemplate <class _Rp>
1396167fd108SHoward Hinnantvoid
1397c003db1fSHoward Hinnantpromise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
1398167fd108SHoward Hinnant{
1399167fd108SHoward Hinnant    if (__state_ == nullptr)
14002d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1401167fd108SHoward Hinnant    __state_->set_value_at_thread_exit(__r);
1402167fd108SHoward Hinnant}
1403167fd108SHoward Hinnant
1404c003db1fSHoward Hinnanttemplate <class _Rp>
1405167fd108SHoward Hinnantvoid
1406c003db1fSHoward Hinnantpromise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
1407167fd108SHoward Hinnant{
1408167fd108SHoward Hinnant    if (__state_ == nullptr)
14092d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1410ce48a113SHoward Hinnant    __state_->set_value_at_thread_exit(_VSTD::move(__r));
1411167fd108SHoward Hinnant}
1412167fd108SHoward Hinnant
1413c003db1fSHoward Hinnanttemplate <class _Rp>
1414167fd108SHoward Hinnantvoid
1415c003db1fSHoward Hinnantpromise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
1416167fd108SHoward Hinnant{
14175362bbb0SEric Fiselier    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
1418167fd108SHoward Hinnant    if (__state_ == nullptr)
14192d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1420167fd108SHoward Hinnant    __state_->set_exception_at_thread_exit(__p);
1421167fd108SHoward Hinnant}
1422167fd108SHoward Hinnant
1423167fd108SHoward Hinnant// promise<R&>
1424167fd108SHoward Hinnant
1425c003db1fSHoward Hinnanttemplate <class _Rp>
1426e9c66ad9SMehdi Aminiclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<_Rp&>
1427167fd108SHoward Hinnant{
1428c003db1fSHoward Hinnant    __assoc_state<_Rp&>* __state_;
142927f000e1SHoward Hinnant
1430a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1431a4820bc4SHoward Hinnant    explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
143227f000e1SHoward Hinnant
143327f000e1SHoward Hinnant    template <class> friend class packaged_task;
143427f000e1SHoward Hinnant
1435167fd108SHoward Hinnantpublic:
1436167fd108SHoward Hinnant    promise();
1437167fd108SHoward Hinnant    template <class _Allocator>
1438167fd108SHoward Hinnant        promise(allocator_arg_t, const _Allocator& __a);
1439a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1440a4820bc4SHoward Hinnant    promise(promise&& __rhs) _NOEXCEPT
1441167fd108SHoward Hinnant        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1442167fd108SHoward Hinnant    promise(const promise& __rhs) = delete;
1443167fd108SHoward Hinnant    ~promise();
1444167fd108SHoward Hinnant
1445167fd108SHoward Hinnant    // assignment
1446a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1447a4820bc4SHoward Hinnant    promise& operator=(promise&& __rhs) _NOEXCEPT
1448167fd108SHoward Hinnant        {
1449d586f92cSArthur O'Dwyer            promise(_VSTD::move(__rhs)).swap(*this);
1450167fd108SHoward Hinnant            return *this;
1451167fd108SHoward Hinnant        }
1452167fd108SHoward Hinnant    promise& operator=(const promise& __rhs) = delete;
14538d4860aaSLouis Dionne
1454a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1455a4820bc4SHoward Hinnant    void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1456167fd108SHoward Hinnant
1457167fd108SHoward Hinnant    // retrieving the result
1458c003db1fSHoward Hinnant    future<_Rp&> get_future();
1459167fd108SHoward Hinnant
1460167fd108SHoward Hinnant    // setting the result
1461c003db1fSHoward Hinnant    void set_value(_Rp& __r);
1462167fd108SHoward Hinnant    void set_exception(exception_ptr __p);
1463167fd108SHoward Hinnant
1464167fd108SHoward Hinnant    // setting the result with deferred notification
1465c003db1fSHoward Hinnant    void set_value_at_thread_exit(_Rp&);
1466167fd108SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr __p);
1467167fd108SHoward Hinnant};
1468167fd108SHoward Hinnant
1469c003db1fSHoward Hinnanttemplate <class _Rp>
1470c003db1fSHoward Hinnantpromise<_Rp&>::promise()
1471c003db1fSHoward Hinnant    : __state_(new __assoc_state<_Rp&>)
1472167fd108SHoward Hinnant{
1473167fd108SHoward Hinnant}
1474167fd108SHoward Hinnant
1475c003db1fSHoward Hinnanttemplate <class _Rp>
1476167fd108SHoward Hinnanttemplate <class _Alloc>
1477c003db1fSHoward Hinnantpromise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0)
1478167fd108SHoward Hinnant{
147983fb578eSEric Fiselier    typedef __assoc_state_alloc<_Rp&, _Alloc> _State;
148083fb578eSEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
1481167fd108SHoward Hinnant    typedef __allocator_destructor<_A2> _D2;
1482167fd108SHoward Hinnant    _A2 __a(__a0);
148383fb578eSEric Fiselier    unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1484be4c657bSArthur O'Dwyer    ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0);
148583fb578eSEric Fiselier    __state_ = _VSTD::addressof(*__hold.release());
1486167fd108SHoward Hinnant}
1487167fd108SHoward Hinnant
1488c003db1fSHoward Hinnanttemplate <class _Rp>
1489c003db1fSHoward Hinnantpromise<_Rp&>::~promise()
1490167fd108SHoward Hinnant{
1491167fd108SHoward Hinnant    if (__state_)
1492167fd108SHoward Hinnant    {
1493167fd108SHoward Hinnant        if (!__state_->__has_value() && __state_->use_count() > 1)
1494167fd108SHoward Hinnant            __state_->set_exception(make_exception_ptr(
1495167fd108SHoward Hinnant                      future_error(make_error_code(future_errc::broken_promise))
1496167fd108SHoward Hinnant                                                      ));
1497167fd108SHoward Hinnant        __state_->__release_shared();
1498167fd108SHoward Hinnant    }
1499167fd108SHoward Hinnant}
1500167fd108SHoward Hinnant
1501c003db1fSHoward Hinnanttemplate <class _Rp>
1502c003db1fSHoward Hinnantfuture<_Rp&>
1503c003db1fSHoward Hinnantpromise<_Rp&>::get_future()
1504167fd108SHoward Hinnant{
1505167fd108SHoward Hinnant    if (__state_ == nullptr)
15062d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1507c003db1fSHoward Hinnant    return future<_Rp&>(__state_);
1508167fd108SHoward Hinnant}
1509167fd108SHoward Hinnant
1510c003db1fSHoward Hinnanttemplate <class _Rp>
1511167fd108SHoward Hinnantvoid
1512c003db1fSHoward Hinnantpromise<_Rp&>::set_value(_Rp& __r)
1513167fd108SHoward Hinnant{
1514167fd108SHoward Hinnant    if (__state_ == nullptr)
15152d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1516167fd108SHoward Hinnant    __state_->set_value(__r);
1517167fd108SHoward Hinnant}
1518167fd108SHoward Hinnant
1519c003db1fSHoward Hinnanttemplate <class _Rp>
1520167fd108SHoward Hinnantvoid
1521c003db1fSHoward Hinnantpromise<_Rp&>::set_exception(exception_ptr __p)
1522167fd108SHoward Hinnant{
15230e1c6c7eSMarshall Clow    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
1524167fd108SHoward Hinnant    if (__state_ == nullptr)
15252d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1526167fd108SHoward Hinnant    __state_->set_exception(__p);
1527167fd108SHoward Hinnant}
1528167fd108SHoward Hinnant
1529c003db1fSHoward Hinnanttemplate <class _Rp>
1530167fd108SHoward Hinnantvoid
1531c003db1fSHoward Hinnantpromise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
1532167fd108SHoward Hinnant{
1533167fd108SHoward Hinnant    if (__state_ == nullptr)
15342d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1535167fd108SHoward Hinnant    __state_->set_value_at_thread_exit(__r);
1536167fd108SHoward Hinnant}
1537167fd108SHoward Hinnant
1538c003db1fSHoward Hinnanttemplate <class _Rp>
1539167fd108SHoward Hinnantvoid
1540c003db1fSHoward Hinnantpromise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
1541167fd108SHoward Hinnant{
15425362bbb0SEric Fiselier    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
1543167fd108SHoward Hinnant    if (__state_ == nullptr)
15442d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
1545167fd108SHoward Hinnant    __state_->set_exception_at_thread_exit(__p);
1546167fd108SHoward Hinnant}
1547167fd108SHoward Hinnant
1548167fd108SHoward Hinnant// promise<void>
1549167fd108SHoward Hinnant
1550167fd108SHoward Hinnanttemplate <>
1551e9c66ad9SMehdi Aminiclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<void>
1552167fd108SHoward Hinnant{
1553167fd108SHoward Hinnant    __assoc_sub_state* __state_;
155427f000e1SHoward Hinnant
1555a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1556a4820bc4SHoward Hinnant    explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
155727f000e1SHoward Hinnant
155827f000e1SHoward Hinnant    template <class> friend class packaged_task;
155927f000e1SHoward Hinnant
1560167fd108SHoward Hinnantpublic:
1561167fd108SHoward Hinnant    promise();
1562167fd108SHoward Hinnant    template <class _Allocator>
1563bda3c7dfSShoaib Meenai        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
1564167fd108SHoward Hinnant        promise(allocator_arg_t, const _Allocator& __a);
1565a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1566a4820bc4SHoward Hinnant    promise(promise&& __rhs) _NOEXCEPT
1567167fd108SHoward Hinnant        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
1568167fd108SHoward Hinnant    promise(const promise& __rhs) = delete;
1569167fd108SHoward Hinnant    ~promise();
1570167fd108SHoward Hinnant
1571167fd108SHoward Hinnant    // assignment
1572a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1573a4820bc4SHoward Hinnant    promise& operator=(promise&& __rhs) _NOEXCEPT
1574167fd108SHoward Hinnant        {
1575d586f92cSArthur O'Dwyer            promise(_VSTD::move(__rhs)).swap(*this);
1576167fd108SHoward Hinnant            return *this;
1577167fd108SHoward Hinnant        }
1578167fd108SHoward Hinnant    promise& operator=(const promise& __rhs) = delete;
15798d4860aaSLouis Dionne
1580a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1581a4820bc4SHoward Hinnant    void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
1582167fd108SHoward Hinnant
1583167fd108SHoward Hinnant    // retrieving the result
1584167fd108SHoward Hinnant    future<void> get_future();
1585167fd108SHoward Hinnant
1586167fd108SHoward Hinnant    // setting the result
1587167fd108SHoward Hinnant    void set_value();
1588167fd108SHoward Hinnant    void set_exception(exception_ptr __p);
1589167fd108SHoward Hinnant
1590167fd108SHoward Hinnant    // setting the result with deferred notification
1591167fd108SHoward Hinnant    void set_value_at_thread_exit();
1592167fd108SHoward Hinnant    void set_exception_at_thread_exit(exception_ptr __p);
1593167fd108SHoward Hinnant};
1594167fd108SHoward Hinnant
1595167fd108SHoward Hinnanttemplate <class _Alloc>
1596167fd108SHoward Hinnantpromise<void>::promise(allocator_arg_t, const _Alloc& __a0)
1597167fd108SHoward Hinnant{
159883fb578eSEric Fiselier    typedef __assoc_sub_state_alloc<_Alloc> _State;
159983fb578eSEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
1600167fd108SHoward Hinnant    typedef __allocator_destructor<_A2> _D2;
1601167fd108SHoward Hinnant    _A2 __a(__a0);
160283fb578eSEric Fiselier    unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
1603be4c657bSArthur O'Dwyer    ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0);
160483fb578eSEric Fiselier    __state_ = _VSTD::addressof(*__hold.release());
1605167fd108SHoward Hinnant}
1606167fd108SHoward Hinnant
1607c003db1fSHoward Hinnanttemplate <class _Rp>
1608167fd108SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
1609167fd108SHoward Hinnantvoid
1610a4820bc4SHoward Hinnantswap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT
1611167fd108SHoward Hinnant{
1612167fd108SHoward Hinnant    __x.swap(__y);
1613167fd108SHoward Hinnant}
1614167fd108SHoward Hinnant
1615c003db1fSHoward Hinnanttemplate <class _Rp, class _Alloc>
1616e2f2d1edSEric Fiselier    struct _LIBCPP_TEMPLATE_VIS uses_allocator<promise<_Rp>, _Alloc>
1617a3988679SHoward Hinnant        : public true_type {};
1618167fd108SHoward Hinnant
161927f000e1SHoward Hinnant// packaged_task
162027f000e1SHoward Hinnant
162127f000e1SHoward Hinnanttemplate<class _Fp> class __packaged_task_base;
162227f000e1SHoward Hinnant
1623c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1624e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_base<_Rp(_ArgTypes...)>
162527f000e1SHoward Hinnant{
162627f000e1SHoward Hinnant    __packaged_task_base(const __packaged_task_base&);
162727f000e1SHoward Hinnant    __packaged_task_base& operator=(const __packaged_task_base&);
162827f000e1SHoward Hinnantpublic:
1629a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
163027f000e1SHoward Hinnant    __packaged_task_base() {}
1631a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
163227f000e1SHoward Hinnant    virtual ~__packaged_task_base() {}
1633a4820bc4SHoward Hinnant    virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0;
163427f000e1SHoward Hinnant    virtual void destroy() = 0;
163527f000e1SHoward Hinnant    virtual void destroy_deallocate() = 0;
1636c003db1fSHoward Hinnant    virtual _Rp operator()(_ArgTypes&& ...) = 0;
163727f000e1SHoward Hinnant};
163827f000e1SHoward Hinnant
163927f000e1SHoward Hinnanttemplate<class _FD, class _Alloc, class _FB> class __packaged_task_func;
164027f000e1SHoward Hinnant
1641c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1642e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>
1643c003db1fSHoward Hinnant    : public  __packaged_task_base<_Rp(_ArgTypes...)>
164427f000e1SHoward Hinnant{
1645c003db1fSHoward Hinnant    __compressed_pair<_Fp, _Alloc> __f_;
164627f000e1SHoward Hinnantpublic:
1647a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1648549545b6SEric Fiselier    explicit __packaged_task_func(const _Fp& __f) : __f_(__f, __default_init_tag()) {}
1649a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1650549545b6SEric Fiselier    explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f), __default_init_tag()) {}
1651a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1652c003db1fSHoward Hinnant    __packaged_task_func(const _Fp& __f, const _Alloc& __a)
165327f000e1SHoward Hinnant        : __f_(__f, __a) {}
1654a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1655c003db1fSHoward Hinnant    __packaged_task_func(_Fp&& __f, const _Alloc& __a)
1656ce48a113SHoward Hinnant        : __f_(_VSTD::move(__f), __a) {}
1657a4820bc4SHoward Hinnant    virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT;
165827f000e1SHoward Hinnant    virtual void destroy();
165927f000e1SHoward Hinnant    virtual void destroy_deallocate();
1660c003db1fSHoward Hinnant    virtual _Rp operator()(_ArgTypes&& ... __args);
166127f000e1SHoward Hinnant};
166227f000e1SHoward Hinnant
1663c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
166427f000e1SHoward Hinnantvoid
1665c003db1fSHoward Hinnant__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to(
1666a4820bc4SHoward Hinnant                              __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT
166727f000e1SHoward Hinnant{
1668be4c657bSArthur O'Dwyer    ::new ((void*)__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second()));
166927f000e1SHoward Hinnant}
167027f000e1SHoward Hinnant
1671c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
167227f000e1SHoward Hinnantvoid
1673c003db1fSHoward Hinnant__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy()
167427f000e1SHoward Hinnant{
1675c003db1fSHoward Hinnant    __f_.~__compressed_pair<_Fp, _Alloc>();
167627f000e1SHoward Hinnant}
167727f000e1SHoward Hinnant
1678c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
167927f000e1SHoward Hinnantvoid
1680c003db1fSHoward Hinnant__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate()
168127f000e1SHoward Hinnant{
168283fb578eSEric Fiselier    typedef typename __allocator_traits_rebind<_Alloc, __packaged_task_func>::type _Ap;
168383fb578eSEric Fiselier    typedef allocator_traits<_Ap> _ATraits;
168483fb578eSEric Fiselier    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
1685c003db1fSHoward Hinnant    _Ap __a(__f_.second());
1686c003db1fSHoward Hinnant    __f_.~__compressed_pair<_Fp, _Alloc>();
168783fb578eSEric Fiselier    __a.deallocate(_PTraits::pointer_to(*this), 1);
168827f000e1SHoward Hinnant}
168927f000e1SHoward Hinnant
1690c003db1fSHoward Hinnanttemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
1691c003db1fSHoward Hinnant_Rp
1692c003db1fSHoward Hinnant__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
169327f000e1SHoward Hinnant{
1694781c476cSArthur O'Dwyer    return _VSTD::__invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
169527f000e1SHoward Hinnant}
169627f000e1SHoward Hinnant
1697ce53420eSHoward Hinnanttemplate <class _Callable> class __packaged_task_function;
169827f000e1SHoward Hinnant
1699c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1700e9c66ad9SMehdi Aminiclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_function<_Rp(_ArgTypes...)>
170127f000e1SHoward Hinnant{
1702c003db1fSHoward Hinnant    typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
1703189ba3dbSEvgenii Stepanov
1704189ba3dbSEvgenii Stepanov    _LIBCPP_INLINE_VISIBILITY _LIBCPP_NO_CFI
1705189ba3dbSEvgenii Stepanov    __base* __get_buf() { return (__base*)&__buf_; }
1706189ba3dbSEvgenii Stepanov
17078d3e7974SHoward Hinnant    typename aligned_storage<3*sizeof(void*)>::type __buf_;
170827f000e1SHoward Hinnant    __base* __f_;
170927f000e1SHoward Hinnant
171027f000e1SHoward Hinnantpublic:
1711c003db1fSHoward Hinnant    typedef _Rp result_type;
171227f000e1SHoward Hinnant
171327f000e1SHoward Hinnant    // construct/copy/destroy:
1714a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1715a4820bc4SHoward Hinnant    __packaged_task_function() _NOEXCEPT : __f_(nullptr) {}
1716c003db1fSHoward Hinnant    template<class _Fp>
1717c003db1fSHoward Hinnant      __packaged_task_function(_Fp&& __f);
1718c003db1fSHoward Hinnant    template<class _Fp, class _Alloc>
1719c003db1fSHoward Hinnant      __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f);
172027f000e1SHoward Hinnant
1721a4820bc4SHoward Hinnant    __packaged_task_function(__packaged_task_function&&) _NOEXCEPT;
1722a4820bc4SHoward Hinnant    __packaged_task_function& operator=(__packaged_task_function&&) _NOEXCEPT;
172327f000e1SHoward Hinnant
172427f000e1SHoward Hinnant    __packaged_task_function(const __packaged_task_function&) =  delete;
172527f000e1SHoward Hinnant    __packaged_task_function& operator=(const __packaged_task_function&) =  delete;
172627f000e1SHoward Hinnant
172727f000e1SHoward Hinnant    ~__packaged_task_function();
172827f000e1SHoward Hinnant
1729a4820bc4SHoward Hinnant    void swap(__packaged_task_function&) _NOEXCEPT;
173027f000e1SHoward Hinnant
1731906c872dSEvgeniy Stepanov    _LIBCPP_INLINE_VISIBILITY
1732c003db1fSHoward Hinnant    _Rp operator()(_ArgTypes...) const;
173327f000e1SHoward Hinnant};
173427f000e1SHoward Hinnant
1735c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1736a4820bc4SHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) _NOEXCEPT
173727f000e1SHoward Hinnant{
173827f000e1SHoward Hinnant    if (__f.__f_ == nullptr)
173927f000e1SHoward Hinnant        __f_ = nullptr;
1740189ba3dbSEvgenii Stepanov    else if (__f.__f_ == __f.__get_buf())
174127f000e1SHoward Hinnant    {
1742189ba3dbSEvgenii Stepanov        __f.__f_->__move_to(__get_buf());
174327f000e1SHoward Hinnant        __f_ = (__base*)&__buf_;
174427f000e1SHoward Hinnant    }
174527f000e1SHoward Hinnant    else
174627f000e1SHoward Hinnant    {
174727f000e1SHoward Hinnant        __f_ = __f.__f_;
174827f000e1SHoward Hinnant        __f.__f_ = nullptr;
174927f000e1SHoward Hinnant    }
175027f000e1SHoward Hinnant}
175127f000e1SHoward Hinnant
1752c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1753c003db1fSHoward Hinnanttemplate <class _Fp>
1754c003db1fSHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
175527f000e1SHoward Hinnant    : __f_(nullptr)
175627f000e1SHoward Hinnant{
1757886c6a64SMarshall Clow    typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
1758c003db1fSHoward Hinnant    typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
175927f000e1SHoward Hinnant    if (sizeof(_FF) <= sizeof(__buf_))
176027f000e1SHoward Hinnant    {
1761be4c657bSArthur O'Dwyer        ::new ((void*)&__buf_) _FF(_VSTD::forward<_Fp>(__f));
176227f000e1SHoward Hinnant        __f_ = (__base*)&__buf_;
176327f000e1SHoward Hinnant    }
176427f000e1SHoward Hinnant    else
176527f000e1SHoward Hinnant    {
1766c003db1fSHoward Hinnant        typedef allocator<_FF> _Ap;
1767c003db1fSHoward Hinnant        _Ap __a;
1768c003db1fSHoward Hinnant        typedef __allocator_destructor<_Ap> _Dp;
1769c003db1fSHoward Hinnant        unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1770be4c657bSArthur O'Dwyer        ::new ((void*)__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a));
177127f000e1SHoward Hinnant        __f_ = __hold.release();
177227f000e1SHoward Hinnant    }
177327f000e1SHoward Hinnant}
177427f000e1SHoward Hinnant
1775c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1776c003db1fSHoward Hinnanttemplate <class _Fp, class _Alloc>
1777c003db1fSHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(
1778c003db1fSHoward Hinnant                                  allocator_arg_t, const _Alloc& __a0, _Fp&& __f)
177927f000e1SHoward Hinnant    : __f_(nullptr)
178027f000e1SHoward Hinnant{
1781886c6a64SMarshall Clow    typedef typename remove_reference<typename decay<_Fp>::type>::type _FR;
1782c003db1fSHoward Hinnant    typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
178327f000e1SHoward Hinnant    if (sizeof(_FF) <= sizeof(__buf_))
178427f000e1SHoward Hinnant    {
178527f000e1SHoward Hinnant        __f_ = (__base*)&__buf_;
1786be4c657bSArthur O'Dwyer        ::new ((void*)__f_) _FF(_VSTD::forward<_Fp>(__f));
178727f000e1SHoward Hinnant    }
178827f000e1SHoward Hinnant    else
178927f000e1SHoward Hinnant    {
179083fb578eSEric Fiselier        typedef typename __allocator_traits_rebind<_Alloc, _FF>::type _Ap;
1791c003db1fSHoward Hinnant        _Ap __a(__a0);
1792c003db1fSHoward Hinnant        typedef __allocator_destructor<_Ap> _Dp;
1793c003db1fSHoward Hinnant        unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
1794be4c657bSArthur O'Dwyer        ::new ((void*)_VSTD::addressof(*__hold.get()))
179583fb578eSEric Fiselier            _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
179683fb578eSEric Fiselier        __f_ = _VSTD::addressof(*__hold.release());
179727f000e1SHoward Hinnant    }
179827f000e1SHoward Hinnant}
179927f000e1SHoward Hinnant
1800c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1801c003db1fSHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>&
1802a4820bc4SHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT
180327f000e1SHoward Hinnant{
1804189ba3dbSEvgenii Stepanov    if (__f_ == __get_buf())
180527f000e1SHoward Hinnant        __f_->destroy();
180627f000e1SHoward Hinnant    else if (__f_)
180727f000e1SHoward Hinnant        __f_->destroy_deallocate();
180827f000e1SHoward Hinnant    __f_ = nullptr;
180927f000e1SHoward Hinnant    if (__f.__f_ == nullptr)
181027f000e1SHoward Hinnant        __f_ = nullptr;
1811189ba3dbSEvgenii Stepanov    else if (__f.__f_ == __f.__get_buf())
181227f000e1SHoward Hinnant    {
1813189ba3dbSEvgenii Stepanov        __f.__f_->__move_to(__get_buf());
1814189ba3dbSEvgenii Stepanov        __f_ = __get_buf();
181527f000e1SHoward Hinnant    }
181627f000e1SHoward Hinnant    else
181727f000e1SHoward Hinnant    {
181827f000e1SHoward Hinnant        __f_ = __f.__f_;
181927f000e1SHoward Hinnant        __f.__f_ = nullptr;
182027f000e1SHoward Hinnant    }
182188db3171SArgyrios Kyrtzidis    return *this;
182227f000e1SHoward Hinnant}
182327f000e1SHoward Hinnant
1824c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1825c003db1fSHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function()
182627f000e1SHoward Hinnant{
1827189ba3dbSEvgenii Stepanov    if (__f_ == __get_buf())
182827f000e1SHoward Hinnant        __f_->destroy();
182927f000e1SHoward Hinnant    else if (__f_)
183027f000e1SHoward Hinnant        __f_->destroy_deallocate();
183127f000e1SHoward Hinnant}
183227f000e1SHoward Hinnant
1833c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1834189ba3dbSEvgenii Stepanov_LIBCPP_NO_CFI
183527f000e1SHoward Hinnantvoid
1836a4820bc4SHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT
183727f000e1SHoward Hinnant{
183827f000e1SHoward Hinnant    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
183927f000e1SHoward Hinnant    {
184027f000e1SHoward Hinnant        typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
184127f000e1SHoward Hinnant        __base* __t = (__base*)&__tempbuf;
184227f000e1SHoward Hinnant        __f_->__move_to(__t);
184327f000e1SHoward Hinnant        __f_->destroy();
184427f000e1SHoward Hinnant        __f_ = nullptr;
184527f000e1SHoward Hinnant        __f.__f_->__move_to((__base*)&__buf_);
184627f000e1SHoward Hinnant        __f.__f_->destroy();
184727f000e1SHoward Hinnant        __f.__f_ = nullptr;
184827f000e1SHoward Hinnant        __f_ = (__base*)&__buf_;
184927f000e1SHoward Hinnant        __t->__move_to((__base*)&__f.__buf_);
185027f000e1SHoward Hinnant        __t->destroy();
185127f000e1SHoward Hinnant        __f.__f_ = (__base*)&__f.__buf_;
185227f000e1SHoward Hinnant    }
185327f000e1SHoward Hinnant    else if (__f_ == (__base*)&__buf_)
185427f000e1SHoward Hinnant    {
185527f000e1SHoward Hinnant        __f_->__move_to((__base*)&__f.__buf_);
185627f000e1SHoward Hinnant        __f_->destroy();
185727f000e1SHoward Hinnant        __f_ = __f.__f_;
185827f000e1SHoward Hinnant        __f.__f_ = (__base*)&__f.__buf_;
185927f000e1SHoward Hinnant    }
186027f000e1SHoward Hinnant    else if (__f.__f_ == (__base*)&__f.__buf_)
186127f000e1SHoward Hinnant    {
186227f000e1SHoward Hinnant        __f.__f_->__move_to((__base*)&__buf_);
186327f000e1SHoward Hinnant        __f.__f_->destroy();
186427f000e1SHoward Hinnant        __f.__f_ = __f_;
186527f000e1SHoward Hinnant        __f_ = (__base*)&__buf_;
186627f000e1SHoward Hinnant    }
186727f000e1SHoward Hinnant    else
1868ce48a113SHoward Hinnant        _VSTD::swap(__f_, __f.__f_);
186927f000e1SHoward Hinnant}
187027f000e1SHoward Hinnant
1871c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1872906c872dSEvgeniy Stepanovinline
1873c003db1fSHoward Hinnant_Rp
1874c003db1fSHoward Hinnant__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
187527f000e1SHoward Hinnant{
1876ce48a113SHoward Hinnant    return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
187727f000e1SHoward Hinnant}
187827f000e1SHoward Hinnant
1879c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
1880e9c66ad9SMehdi Aminiclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<_Rp(_ArgTypes...)>
188127f000e1SHoward Hinnant{
188227f000e1SHoward Hinnantpublic:
1883eb5cfb02SEric Fiselier    typedef _Rp result_type; // extension
188427f000e1SHoward Hinnant
188527f000e1SHoward Hinnantprivate:
188627f000e1SHoward Hinnant    __packaged_task_function<result_type(_ArgTypes...)> __f_;
188727f000e1SHoward Hinnant    promise<result_type>                                __p_;
188827f000e1SHoward Hinnant
188927f000e1SHoward Hinnantpublic:
189027f000e1SHoward Hinnant    // construction and destruction
1891a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1892a4820bc4SHoward Hinnant    packaged_task() _NOEXCEPT : __p_(nullptr) {}
1893d58daf94SMarshall Clow    template <class _Fp,
1894f7558068SNikolas Klauser              class = __enable_if_t<!is_same<__uncvref_t<_Fp>, packaged_task>::value> >
1895a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
1896c003db1fSHoward Hinnant        explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
1897a2f3c632SMarshall Clow    template <class _Fp, class _Allocator,
1898f7558068SNikolas Klauser              class = __enable_if_t<!is_same<__uncvref_t<_Fp>, packaged_task>::value> >
1899a2f3c632SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
1900a2f3c632SMarshall Clow        packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
1901a2f3c632SMarshall Clow             : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
1902a2f3c632SMarshall Clow               __p_(allocator_arg, __a) {}
190327f000e1SHoward Hinnant    // ~packaged_task() = default;
190427f000e1SHoward Hinnant
190527f000e1SHoward Hinnant    // no copy
19069d772d17SHoward Hinnant    packaged_task(const packaged_task&) = delete;
19079d772d17SHoward Hinnant    packaged_task& operator=(const packaged_task&) = delete;
190827f000e1SHoward Hinnant
190927f000e1SHoward Hinnant    // move support
1910a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1911a4820bc4SHoward Hinnant    packaged_task(packaged_task&& __other) _NOEXCEPT
1912ce48a113SHoward Hinnant        : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
1913a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1914a4820bc4SHoward Hinnant    packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
191527f000e1SHoward Hinnant    {
1916ce48a113SHoward Hinnant        __f_ = _VSTD::move(__other.__f_);
1917ce48a113SHoward Hinnant        __p_ = _VSTD::move(__other.__p_);
191827f000e1SHoward Hinnant        return *this;
191927f000e1SHoward Hinnant    }
1920a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1921a4820bc4SHoward Hinnant    void swap(packaged_task& __other) _NOEXCEPT
192227f000e1SHoward Hinnant    {
192327f000e1SHoward Hinnant        __f_.swap(__other.__f_);
192427f000e1SHoward Hinnant        __p_.swap(__other.__p_);
192527f000e1SHoward Hinnant    }
192627f000e1SHoward Hinnant
1927a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
1928a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
192927f000e1SHoward Hinnant
193027f000e1SHoward Hinnant    // result retrieval
1931a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
193227f000e1SHoward Hinnant    future<result_type> get_future() {return __p_.get_future();}
193327f000e1SHoward Hinnant
193427f000e1SHoward Hinnant    // execution
193527f000e1SHoward Hinnant    void operator()(_ArgTypes... __args);
193627f000e1SHoward Hinnant    void make_ready_at_thread_exit(_ArgTypes... __args);
193727f000e1SHoward Hinnant
193827f000e1SHoward Hinnant    void reset();
193927f000e1SHoward Hinnant};
194027f000e1SHoward Hinnant
1941c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
194227f000e1SHoward Hinnantvoid
1943c003db1fSHoward Hinnantpackaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
194427f000e1SHoward Hinnant{
194527f000e1SHoward Hinnant    if (__p_.__state_ == nullptr)
19462d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
194727f000e1SHoward Hinnant    if (__p_.__state_->__has_value())
19482d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
1949a0daa739SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
195027f000e1SHoward Hinnant    try
195127f000e1SHoward Hinnant    {
195227f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1953ce48a113SHoward Hinnant        __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...));
195427f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
195527f000e1SHoward Hinnant    }
195627f000e1SHoward Hinnant    catch (...)
195727f000e1SHoward Hinnant    {
195827f000e1SHoward Hinnant        __p_.set_exception(current_exception());
195927f000e1SHoward Hinnant    }
196027f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
196127f000e1SHoward Hinnant}
196227f000e1SHoward Hinnant
1963c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
196427f000e1SHoward Hinnantvoid
1965c003db1fSHoward Hinnantpackaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
196627f000e1SHoward Hinnant{
196727f000e1SHoward Hinnant    if (__p_.__state_ == nullptr)
19682d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
196927f000e1SHoward Hinnant    if (__p_.__state_->__has_value())
19702d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
1971a0daa739SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
197227f000e1SHoward Hinnant    try
197327f000e1SHoward Hinnant    {
197427f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
1975ce48a113SHoward Hinnant        __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...));
197627f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
197727f000e1SHoward Hinnant    }
197827f000e1SHoward Hinnant    catch (...)
197927f000e1SHoward Hinnant    {
198027f000e1SHoward Hinnant        __p_.set_exception_at_thread_exit(current_exception());
198127f000e1SHoward Hinnant    }
198227f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
198327f000e1SHoward Hinnant}
198427f000e1SHoward Hinnant
1985c003db1fSHoward Hinnanttemplate<class _Rp, class ..._ArgTypes>
198627f000e1SHoward Hinnantvoid
1987c003db1fSHoward Hinnantpackaged_task<_Rp(_ArgTypes...)>::reset()
198827f000e1SHoward Hinnant{
198992e3718bSHoward Hinnant    if (!valid())
19902d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
199127f000e1SHoward Hinnant    __p_ = promise<result_type>();
199227f000e1SHoward Hinnant}
199327f000e1SHoward Hinnant
199427f000e1SHoward Hinnanttemplate<class ..._ArgTypes>
1995e9c66ad9SMehdi Aminiclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<void(_ArgTypes...)>
199627f000e1SHoward Hinnant{
199727f000e1SHoward Hinnantpublic:
1998eb5cfb02SEric Fiselier    typedef void result_type; // extension
199927f000e1SHoward Hinnant
200027f000e1SHoward Hinnantprivate:
200127f000e1SHoward Hinnant    __packaged_task_function<result_type(_ArgTypes...)> __f_;
200227f000e1SHoward Hinnant    promise<result_type>                                __p_;
200327f000e1SHoward Hinnant
200427f000e1SHoward Hinnantpublic:
200527f000e1SHoward Hinnant    // construction and destruction
2006a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2007a4820bc4SHoward Hinnant    packaged_task() _NOEXCEPT : __p_(nullptr) {}
2008d58daf94SMarshall Clow    template <class _Fp,
2009f7558068SNikolas Klauser              class = __enable_if_t<!is_same<__uncvref_t<_Fp>, packaged_task>::value> >
2010a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2011c003db1fSHoward Hinnant        explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
2012a2f3c632SMarshall Clow    template <class _Fp, class _Allocator,
2013f7558068SNikolas Klauser              class = __enable_if_t<!is_same<__uncvref_t<_Fp>, packaged_task>::value> >
2014a2f3c632SMarshall Clow        _LIBCPP_INLINE_VISIBILITY
2015a2f3c632SMarshall Clow        packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
2016a2f3c632SMarshall Clow             : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
2017a2f3c632SMarshall Clow               __p_(allocator_arg, __a) {}
201827f000e1SHoward Hinnant    // ~packaged_task() = default;
201927f000e1SHoward Hinnant
202027f000e1SHoward Hinnant    // no copy
20219d772d17SHoward Hinnant    packaged_task(const packaged_task&) = delete;
20229d772d17SHoward Hinnant    packaged_task& operator=(const packaged_task&) = delete;
202327f000e1SHoward Hinnant
202427f000e1SHoward Hinnant    // move support
2025a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2026a4820bc4SHoward Hinnant    packaged_task(packaged_task&& __other) _NOEXCEPT
2027ce48a113SHoward Hinnant        : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
2028a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2029a4820bc4SHoward Hinnant    packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
203027f000e1SHoward Hinnant    {
2031ce48a113SHoward Hinnant        __f_ = _VSTD::move(__other.__f_);
2032ce48a113SHoward Hinnant        __p_ = _VSTD::move(__other.__p_);
203327f000e1SHoward Hinnant        return *this;
203427f000e1SHoward Hinnant    }
2035a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2036a4820bc4SHoward Hinnant    void swap(packaged_task& __other) _NOEXCEPT
203727f000e1SHoward Hinnant    {
203827f000e1SHoward Hinnant        __f_.swap(__other.__f_);
203927f000e1SHoward Hinnant        __p_.swap(__other.__p_);
204027f000e1SHoward Hinnant    }
204127f000e1SHoward Hinnant
2042a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2043a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
204427f000e1SHoward Hinnant
204527f000e1SHoward Hinnant    // result retrieval
2046a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
204727f000e1SHoward Hinnant    future<result_type> get_future() {return __p_.get_future();}
204827f000e1SHoward Hinnant
204927f000e1SHoward Hinnant    // execution
205027f000e1SHoward Hinnant    void operator()(_ArgTypes... __args);
205127f000e1SHoward Hinnant    void make_ready_at_thread_exit(_ArgTypes... __args);
205227f000e1SHoward Hinnant
205327f000e1SHoward Hinnant    void reset();
205427f000e1SHoward Hinnant};
205527f000e1SHoward Hinnant
205627f000e1SHoward Hinnanttemplate<class ..._ArgTypes>
205727f000e1SHoward Hinnantvoid
205827f000e1SHoward Hinnantpackaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
205927f000e1SHoward Hinnant{
206027f000e1SHoward Hinnant    if (__p_.__state_ == nullptr)
20612d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
206227f000e1SHoward Hinnant    if (__p_.__state_->__has_value())
20632d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
2064a0daa739SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
206527f000e1SHoward Hinnant    try
206627f000e1SHoward Hinnant    {
206727f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
2068ce48a113SHoward Hinnant        __f_(_VSTD::forward<_ArgTypes>(__args)...);
206927f000e1SHoward Hinnant        __p_.set_value();
207027f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
207127f000e1SHoward Hinnant    }
207227f000e1SHoward Hinnant    catch (...)
207327f000e1SHoward Hinnant    {
207427f000e1SHoward Hinnant        __p_.set_exception(current_exception());
207527f000e1SHoward Hinnant    }
207627f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
207727f000e1SHoward Hinnant}
207827f000e1SHoward Hinnant
207927f000e1SHoward Hinnanttemplate<class ..._ArgTypes>
208027f000e1SHoward Hinnantvoid
208127f000e1SHoward Hinnantpackaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
208227f000e1SHoward Hinnant{
208327f000e1SHoward Hinnant    if (__p_.__state_ == nullptr)
20842d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
208527f000e1SHoward Hinnant    if (__p_.__state_->__has_value())
20862d6c0e79SEric Fiselier        __throw_future_error(future_errc::promise_already_satisfied);
2087a0daa739SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
208827f000e1SHoward Hinnant    try
208927f000e1SHoward Hinnant    {
209027f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
2091ce48a113SHoward Hinnant        __f_(_VSTD::forward<_ArgTypes>(__args)...);
209227f000e1SHoward Hinnant        __p_.set_value_at_thread_exit();
209327f000e1SHoward Hinnant#ifndef _LIBCPP_NO_EXCEPTIONS
209427f000e1SHoward Hinnant    }
209527f000e1SHoward Hinnant    catch (...)
209627f000e1SHoward Hinnant    {
209727f000e1SHoward Hinnant        __p_.set_exception_at_thread_exit(current_exception());
209827f000e1SHoward Hinnant    }
209927f000e1SHoward Hinnant#endif // _LIBCPP_NO_EXCEPTIONS
210027f000e1SHoward Hinnant}
210127f000e1SHoward Hinnant
210227f000e1SHoward Hinnanttemplate<class ..._ArgTypes>
210327f000e1SHoward Hinnantvoid
210427f000e1SHoward Hinnantpackaged_task<void(_ArgTypes...)>::reset()
210527f000e1SHoward Hinnant{
210692e3718bSHoward Hinnant    if (!valid())
21072d6c0e79SEric Fiselier        __throw_future_error(future_errc::no_state);
210827f000e1SHoward Hinnant    __p_ = promise<result_type>();
210927f000e1SHoward Hinnant}
211027f000e1SHoward Hinnant
211109a84d30Sjasonliutemplate <class _Rp, class... _ArgTypes>
211227f000e1SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
211327f000e1SHoward Hinnantvoid
211409a84d30Sjasonliuswap(packaged_task<_Rp(_ArgTypes...)>& __x, packaged_task<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
211527f000e1SHoward Hinnant{
211627f000e1SHoward Hinnant    __x.swap(__y);
211727f000e1SHoward Hinnant}
211827f000e1SHoward Hinnant
2119a2f3c632SMarshall Clowtemplate <class _Callable, class _Alloc>
2120a2f3c632SMarshall Clowstruct _LIBCPP_TEMPLATE_VIS uses_allocator<packaged_task<_Callable>, _Alloc>
2121a2f3c632SMarshall Clow    : public true_type {};
2122a2f3c632SMarshall Clow
2123c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
2124dd37e24aSLouis Dionne_LIBCPP_INLINE_VISIBILITY future<_Rp>
2125c003db1fSHoward Hinnant__make_deferred_assoc_state(_Fp&& __f)
212627f000e1SHoward Hinnant{
2127c003db1fSHoward Hinnant    unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count>
2128c003db1fSHoward Hinnant        __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
2129c003db1fSHoward Hinnant    return future<_Rp>(__h.get());
213027f000e1SHoward Hinnant}
213127f000e1SHoward Hinnant
2132c003db1fSHoward Hinnanttemplate <class _Rp, class _Fp>
2133dd37e24aSLouis Dionne_LIBCPP_INLINE_VISIBILITY future<_Rp>
2134c003db1fSHoward Hinnant__make_async_assoc_state(_Fp&& __f)
2135ec0810e1SHoward Hinnant{
2136c003db1fSHoward Hinnant    unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count>
2137c003db1fSHoward Hinnant        __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
2138c003db1fSHoward Hinnant    _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach();
2139c003db1fSHoward Hinnant    return future<_Rp>(__h.get());
2140ec0810e1SHoward Hinnant}
2141ec0810e1SHoward Hinnant
2142a3c28ccdSLouis Dionne#ifndef _LIBCPP_CXX03_LANG
2143a3c28ccdSLouis Dionne
2144c003db1fSHoward Hinnanttemplate <class _Fp, class... _Args>
2145dd37e24aSLouis Dionneclass _LIBCPP_HIDDEN __async_func
2146ec0810e1SHoward Hinnant{
2147c003db1fSHoward Hinnant    tuple<_Fp, _Args...> __f_;
2148ec0810e1SHoward Hinnant
2149ec0810e1SHoward Hinnantpublic:
2150c003db1fSHoward Hinnant    typedef typename __invoke_of<_Fp, _Args...>::type _Rp;
2151ec0810e1SHoward Hinnant
2152ec0810e1SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2153c003db1fSHoward Hinnant    explicit __async_func(_Fp&& __f, _Args&&... __args)
2154ce48a113SHoward Hinnant        : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {}
2155ec0810e1SHoward Hinnant
2156ec0810e1SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2157ce48a113SHoward Hinnant    __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {}
2158ec0810e1SHoward Hinnant
2159c003db1fSHoward Hinnant    _Rp operator()()
2160ec0810e1SHoward Hinnant    {
2161ec0810e1SHoward Hinnant        typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index;
2162ec0810e1SHoward Hinnant        return __execute(_Index());
2163ec0810e1SHoward Hinnant    }
2164ec0810e1SHoward Hinnantprivate:
2165ec0810e1SHoward Hinnant    template <size_t ..._Indices>
2166c003db1fSHoward Hinnant    _Rp
2167ec0810e1SHoward Hinnant    __execute(__tuple_indices<_Indices...>)
2168ec0810e1SHoward Hinnant    {
2169781c476cSArthur O'Dwyer        return _VSTD::__invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
2170ec0810e1SHoward Hinnant    }
2171ec0810e1SHoward Hinnant};
2172ec0810e1SHoward Hinnant
217399c09647SMarshall Clowinline _LIBCPP_INLINE_VISIBILITY bool __does_policy_contain(launch __policy, launch __value )
2174b1915875SMarshall Clow{ return (int(__policy) & int(__value)) != 0; }
2175b1915875SMarshall Clow
2176c003db1fSHoward Hinnanttemplate <class _Fp, class... _Args>
2177b6ad844eSMarshall Clow_LIBCPP_NODISCARD_AFTER_CXX17
2178c003db1fSHoward Hinnantfuture<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
2179c003db1fSHoward Hinnantasync(launch __policy, _Fp&& __f, _Args&&... __args)
218027f000e1SHoward Hinnant{
2181c003db1fSHoward Hinnant    typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF;
2182c003db1fSHoward Hinnant    typedef typename _BF::_Rp _Rp;
2183b1915875SMarshall Clow
2184b1915875SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
2185b1915875SMarshall Clow    try
2186b1915875SMarshall Clow    {
2187b1915875SMarshall Clow#endif
2188b1915875SMarshall Clow        if (__does_policy_contain(__policy, launch::async))
2189cb8a0b07SArthur O'Dwyer        return _VSTD::__make_async_assoc_state<_Rp>(_BF(_LIBCPP_AUTO_CAST(_VSTD::forward<_Fp>(__f)),
2190cb8a0b07SArthur O'Dwyer                                                        _LIBCPP_AUTO_CAST(_VSTD::forward<_Args>(__args))...));
2191b1915875SMarshall Clow#ifndef _LIBCPP_NO_EXCEPTIONS
2192b1915875SMarshall Clow    }
2193b1915875SMarshall Clow    catch ( ... ) { if (__policy == launch::async) throw ; }
2194b1915875SMarshall Clow#endif
2195b1915875SMarshall Clow
2196b1915875SMarshall Clow    if (__does_policy_contain(__policy, launch::deferred))
2197cb8a0b07SArthur O'Dwyer        return _VSTD::__make_deferred_assoc_state<_Rp>(_BF(_LIBCPP_AUTO_CAST(_VSTD::forward<_Fp>(__f)),
2198cb8a0b07SArthur O'Dwyer                                                           _LIBCPP_AUTO_CAST(_VSTD::forward<_Args>(__args))...));
2199b1915875SMarshall Clow    return future<_Rp>{};
220027f000e1SHoward Hinnant}
220127f000e1SHoward Hinnant
2202c003db1fSHoward Hinnanttemplate <class _Fp, class... _Args>
2203b6ad844eSMarshall Clow_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
2204c003db1fSHoward Hinnantfuture<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
2205c003db1fSHoward Hinnantasync(_Fp&& __f, _Args&&... __args)
220627f000e1SHoward Hinnant{
2207c003db1fSHoward Hinnant    return _VSTD::async(launch::any, _VSTD::forward<_Fp>(__f),
2208ce48a113SHoward Hinnant                                    _VSTD::forward<_Args>(__args)...);
220927f000e1SHoward Hinnant}
221027f000e1SHoward Hinnant
2211a3c28ccdSLouis Dionne#endif // C++03
221227f000e1SHoward Hinnant
2213b77c0c03SHoward Hinnant// shared_future
2214b77c0c03SHoward Hinnant
2215c003db1fSHoward Hinnanttemplate <class _Rp>
2216e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_future
2217ead85506SHoward Hinnant{
2218c003db1fSHoward Hinnant    __assoc_state<_Rp>* __state_;
2219ead85506SHoward Hinnant
2220ead85506SHoward Hinnantpublic:
2221a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2222a4820bc4SHoward Hinnant    shared_future() _NOEXCEPT : __state_(nullptr) {}
2223a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2224065b3af0SMarshall Clow    shared_future(const shared_future& __rhs)  _NOEXCEPT : __state_(__rhs.__state_)
2225ead85506SHoward Hinnant        {if (__state_) __state_->__add_shared();}
2226a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2227a4820bc4SHoward Hinnant    shared_future(future<_Rp>&& __f) _NOEXCEPT : __state_(__f.__state_)
2228ead85506SHoward Hinnant        {__f.__state_ = nullptr;}
2229a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2230a4820bc4SHoward Hinnant    shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
2231ead85506SHoward Hinnant        {__rhs.__state_ = nullptr;}
2232ead85506SHoward Hinnant    ~shared_future();
2233065b3af0SMarshall Clow    shared_future& operator=(const shared_future& __rhs) _NOEXCEPT;
2234a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2235a4820bc4SHoward Hinnant    shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
2236ead85506SHoward Hinnant        {
2237d586f92cSArthur O'Dwyer            shared_future(_VSTD::move(__rhs)).swap(*this);
2238ead85506SHoward Hinnant            return *this;
2239ead85506SHoward Hinnant        }
2240ead85506SHoward Hinnant
2241ead85506SHoward Hinnant    // retrieving the value
2242a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2243c003db1fSHoward Hinnant    const _Rp& get() const {return __state_->copy();}
2244ead85506SHoward Hinnant
2245a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2246a4820bc4SHoward Hinnant    void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
2247ead85506SHoward Hinnant
2248ead85506SHoward Hinnant    // functions to check state
2249a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2250a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
2251ead85506SHoward Hinnant
2252a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2253ead85506SHoward Hinnant    void wait() const {__state_->wait();}
2254ead85506SHoward Hinnant    template <class _Rep, class _Period>
2255a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2256ead85506SHoward Hinnant        future_status
2257ead85506SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
2258ead85506SHoward Hinnant            {return __state_->wait_for(__rel_time);}
2259ead85506SHoward Hinnant    template <class _Clock, class _Duration>
2260a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2261ead85506SHoward Hinnant        future_status
2262ead85506SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
2263ead85506SHoward Hinnant            {return __state_->wait_until(__abs_time);}
2264ead85506SHoward Hinnant};
2265ead85506SHoward Hinnant
2266c003db1fSHoward Hinnanttemplate <class _Rp>
2267c003db1fSHoward Hinnantshared_future<_Rp>::~shared_future()
2268ead85506SHoward Hinnant{
2269ead85506SHoward Hinnant    if (__state_)
2270ead85506SHoward Hinnant        __state_->__release_shared();
2271ead85506SHoward Hinnant}
2272ead85506SHoward Hinnant
2273c003db1fSHoward Hinnanttemplate <class _Rp>
2274c003db1fSHoward Hinnantshared_future<_Rp>&
2275065b3af0SMarshall Clowshared_future<_Rp>::operator=(const shared_future& __rhs) _NOEXCEPT
2276ead85506SHoward Hinnant{
2277ead85506SHoward Hinnant    if (__rhs.__state_)
2278ead85506SHoward Hinnant        __rhs.__state_->__add_shared();
2279ead85506SHoward Hinnant    if (__state_)
2280ead85506SHoward Hinnant        __state_->__release_shared();
2281ead85506SHoward Hinnant    __state_ = __rhs.__state_;
2282ead85506SHoward Hinnant    return *this;
2283ead85506SHoward Hinnant}
2284ead85506SHoward Hinnant
2285c003db1fSHoward Hinnanttemplate <class _Rp>
2286e2f2d1edSEric Fiselierclass _LIBCPP_TEMPLATE_VIS shared_future<_Rp&>
2287ead85506SHoward Hinnant{
2288c003db1fSHoward Hinnant    __assoc_state<_Rp&>* __state_;
2289ead85506SHoward Hinnant
2290ead85506SHoward Hinnantpublic:
2291a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2292a4820bc4SHoward Hinnant    shared_future() _NOEXCEPT : __state_(nullptr) {}
2293a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2294ead85506SHoward Hinnant    shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
2295ead85506SHoward Hinnant        {if (__state_) __state_->__add_shared();}
2296a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2297a4820bc4SHoward Hinnant    shared_future(future<_Rp&>&& __f) _NOEXCEPT : __state_(__f.__state_)
2298ead85506SHoward Hinnant        {__f.__state_ = nullptr;}
2299a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2300a4820bc4SHoward Hinnant    shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
2301ead85506SHoward Hinnant        {__rhs.__state_ = nullptr;}
2302ead85506SHoward Hinnant    ~shared_future();
2303ead85506SHoward Hinnant    shared_future& operator=(const shared_future& __rhs);
2304a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2305a4820bc4SHoward Hinnant    shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
2306ead85506SHoward Hinnant        {
2307d586f92cSArthur O'Dwyer            shared_future(_VSTD::move(__rhs)).swap(*this);
2308ead85506SHoward Hinnant            return *this;
2309ead85506SHoward Hinnant        }
2310ead85506SHoward Hinnant
2311ead85506SHoward Hinnant    // retrieving the value
2312a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2313c003db1fSHoward Hinnant    _Rp& get() const {return __state_->copy();}
2314ead85506SHoward Hinnant
2315a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2316a4820bc4SHoward Hinnant    void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
2317ead85506SHoward Hinnant
2318ead85506SHoward Hinnant    // functions to check state
2319a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2320a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
2321ead85506SHoward Hinnant
2322a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2323ead85506SHoward Hinnant    void wait() const {__state_->wait();}
2324ead85506SHoward Hinnant    template <class _Rep, class _Period>
2325a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2326ead85506SHoward Hinnant        future_status
2327ead85506SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
2328ead85506SHoward Hinnant            {return __state_->wait_for(__rel_time);}
2329ead85506SHoward Hinnant    template <class _Clock, class _Duration>
2330a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2331ead85506SHoward Hinnant        future_status
2332ead85506SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
2333ead85506SHoward Hinnant            {return __state_->wait_until(__abs_time);}
2334ead85506SHoward Hinnant};
2335ead85506SHoward Hinnant
2336c003db1fSHoward Hinnanttemplate <class _Rp>
2337c003db1fSHoward Hinnantshared_future<_Rp&>::~shared_future()
2338ead85506SHoward Hinnant{
2339ead85506SHoward Hinnant    if (__state_)
2340ead85506SHoward Hinnant        __state_->__release_shared();
2341ead85506SHoward Hinnant}
2342ead85506SHoward Hinnant
2343c003db1fSHoward Hinnanttemplate <class _Rp>
2344c003db1fSHoward Hinnantshared_future<_Rp&>&
2345c003db1fSHoward Hinnantshared_future<_Rp&>::operator=(const shared_future& __rhs)
2346ead85506SHoward Hinnant{
2347ead85506SHoward Hinnant    if (__rhs.__state_)
2348ead85506SHoward Hinnant        __rhs.__state_->__add_shared();
2349ead85506SHoward Hinnant    if (__state_)
2350ead85506SHoward Hinnant        __state_->__release_shared();
2351ead85506SHoward Hinnant    __state_ = __rhs.__state_;
2352ead85506SHoward Hinnant    return *this;
2353ead85506SHoward Hinnant}
2354ead85506SHoward Hinnant
2355ead85506SHoward Hinnanttemplate <>
2356e9c66ad9SMehdi Aminiclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE shared_future<void>
2357ead85506SHoward Hinnant{
2358ead85506SHoward Hinnant    __assoc_sub_state* __state_;
2359ead85506SHoward Hinnant
2360ead85506SHoward Hinnantpublic:
2361a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2362a4820bc4SHoward Hinnant    shared_future() _NOEXCEPT : __state_(nullptr) {}
2363a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2364ead85506SHoward Hinnant    shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
2365ead85506SHoward Hinnant        {if (__state_) __state_->__add_shared();}
2366a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2367a4820bc4SHoward Hinnant    shared_future(future<void>&& __f) _NOEXCEPT : __state_(__f.__state_)
2368ead85506SHoward Hinnant        {__f.__state_ = nullptr;}
2369a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2370a4820bc4SHoward Hinnant    shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
2371ead85506SHoward Hinnant        {__rhs.__state_ = nullptr;}
2372ead85506SHoward Hinnant    ~shared_future();
2373ead85506SHoward Hinnant    shared_future& operator=(const shared_future& __rhs);
2374a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2375a4820bc4SHoward Hinnant    shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
2376ead85506SHoward Hinnant        {
2377d586f92cSArthur O'Dwyer            shared_future(_VSTD::move(__rhs)).swap(*this);
2378ead85506SHoward Hinnant            return *this;
2379ead85506SHoward Hinnant        }
2380ead85506SHoward Hinnant
2381ead85506SHoward Hinnant    // retrieving the value
2382a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2383ead85506SHoward Hinnant    void get() const {__state_->copy();}
2384ead85506SHoward Hinnant
2385a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2386a4820bc4SHoward Hinnant    void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
2387ead85506SHoward Hinnant
2388ead85506SHoward Hinnant    // functions to check state
2389a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2390a4820bc4SHoward Hinnant    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
2391ead85506SHoward Hinnant
2392a3988679SHoward Hinnant    _LIBCPP_INLINE_VISIBILITY
2393ead85506SHoward Hinnant    void wait() const {__state_->wait();}
2394ead85506SHoward Hinnant    template <class _Rep, class _Period>
2395a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2396ead85506SHoward Hinnant        future_status
2397ead85506SHoward Hinnant        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
2398ead85506SHoward Hinnant            {return __state_->wait_for(__rel_time);}
2399ead85506SHoward Hinnant    template <class _Clock, class _Duration>
2400a3988679SHoward Hinnant        _LIBCPP_INLINE_VISIBILITY
2401ead85506SHoward Hinnant        future_status
2402ead85506SHoward Hinnant        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
2403ead85506SHoward Hinnant            {return __state_->wait_until(__abs_time);}
2404ead85506SHoward Hinnant};
2405ead85506SHoward Hinnant
2406c003db1fSHoward Hinnanttemplate <class _Rp>
2407ead85506SHoward Hinnantinline _LIBCPP_INLINE_VISIBILITY
2408ead85506SHoward Hinnantvoid
2409a4820bc4SHoward Hinnantswap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) _NOEXCEPT
2410ead85506SHoward Hinnant{
2411ead85506SHoward Hinnant    __x.swap(__y);
2412ead85506SHoward Hinnant}
2413ead85506SHoward Hinnant
2414c003db1fSHoward Hinnanttemplate <class _Rp>
2415906c872dSEvgeniy Stepanovinline
2416c003db1fSHoward Hinnantshared_future<_Rp>
24173cd9e942SMarshall Clowfuture<_Rp>::share() _NOEXCEPT
2418b77c0c03SHoward Hinnant{
2419c003db1fSHoward Hinnant    return shared_future<_Rp>(_VSTD::move(*this));
2420b77c0c03SHoward Hinnant}
2421b77c0c03SHoward Hinnant
2422c003db1fSHoward Hinnanttemplate <class _Rp>
2423906c872dSEvgeniy Stepanovinline
2424c003db1fSHoward Hinnantshared_future<_Rp&>
24253cd9e942SMarshall Clowfuture<_Rp&>::share() _NOEXCEPT
2426b77c0c03SHoward Hinnant{
2427c003db1fSHoward Hinnant    return shared_future<_Rp&>(_VSTD::move(*this));
242892e3718bSHoward Hinnant}
242992e3718bSHoward Hinnant
2430906c872dSEvgeniy Stepanovinline
243192e3718bSHoward Hinnantshared_future<void>
24323cd9e942SMarshall Clowfuture<void>::share() _NOEXCEPT
243392e3718bSHoward Hinnant{
2434ce48a113SHoward Hinnant    return shared_future<void>(_VSTD::move(*this));
2435b77c0c03SHoward Hinnant}
2436b77c0c03SHoward Hinnant
24373e519524SHoward Hinnant_LIBCPP_END_NAMESPACE_STD
24383e519524SHoward Hinnant
24393e519524SHoward Hinnant#endif // _LIBCPP_FUTURE
2440