xref: /openbsd-src/gnu/llvm/libcxx/include/future (revision 4bdff4bed0e3d54e55670334c7d0077db4170f86)
146035553Spatrick// -*- C++ -*-
2*4bdff4beSrobert//===----------------------------------------------------------------------===//
346035553Spatrick//
446035553Spatrick// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
546035553Spatrick// See https://llvm.org/LICENSE.txt for license information.
646035553Spatrick// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
746035553Spatrick//
846035553Spatrick//===----------------------------------------------------------------------===//
946035553Spatrick
1046035553Spatrick#ifndef _LIBCPP_FUTURE
1146035553Spatrick#define _LIBCPP_FUTURE
1246035553Spatrick
1346035553Spatrick/*
1446035553Spatrick    future synopsis
1546035553Spatrick
1646035553Spatricknamespace std
1746035553Spatrick{
1846035553Spatrick
1946035553Spatrickenum class future_errc
2046035553Spatrick{
2146035553Spatrick    future_already_retrieved = 1,
2246035553Spatrick    promise_already_satisfied,
2346035553Spatrick    no_state,
2446035553Spatrick    broken_promise
2546035553Spatrick};
2646035553Spatrick
2746035553Spatrickenum class launch
2846035553Spatrick{
2946035553Spatrick    async = 1,
3046035553Spatrick    deferred = 2,
3146035553Spatrick    any = async | deferred
3246035553Spatrick};
3346035553Spatrick
3446035553Spatrickenum class future_status
3546035553Spatrick{
3646035553Spatrick    ready,
3746035553Spatrick    timeout,
3846035553Spatrick    deferred
3946035553Spatrick};
4046035553Spatrick
4146035553Spatricktemplate <> struct is_error_code_enum<future_errc> : public true_type { };
4246035553Spatrickerror_code make_error_code(future_errc e) noexcept;
4346035553Spatrickerror_condition make_error_condition(future_errc e) noexcept;
4446035553Spatrick
4546035553Spatrickconst error_category& future_category() noexcept;
4646035553Spatrick
4746035553Spatrickclass future_error
4846035553Spatrick    : public logic_error
4946035553Spatrick{
5046035553Spatrickpublic:
5146035553Spatrick    future_error(error_code ec);  // exposition only
5246035553Spatrick    explicit future_error(future_errc); // C++17
5346035553Spatrick    const error_code& code() const noexcept;
5446035553Spatrick    const char*       what() const noexcept;
5546035553Spatrick};
5646035553Spatrick
5746035553Spatricktemplate <class R>
5846035553Spatrickclass promise
5946035553Spatrick{
6046035553Spatrickpublic:
6146035553Spatrick    promise();
6246035553Spatrick    template <class Allocator>
6346035553Spatrick        promise(allocator_arg_t, const Allocator& a);
6446035553Spatrick    promise(promise&& rhs) noexcept;
6546035553Spatrick    promise(const promise& rhs) = delete;
6646035553Spatrick    ~promise();
6746035553Spatrick
6846035553Spatrick    // assignment
6946035553Spatrick    promise& operator=(promise&& rhs) noexcept;
7046035553Spatrick    promise& operator=(const promise& rhs) = delete;
7146035553Spatrick    void swap(promise& other) noexcept;
7246035553Spatrick
7346035553Spatrick    // retrieving the result
7446035553Spatrick    future<R> get_future();
7546035553Spatrick
7646035553Spatrick    // setting the result
7746035553Spatrick    void set_value(const R& r);
7846035553Spatrick    void set_value(R&& r);
7946035553Spatrick    void set_exception(exception_ptr p);
8046035553Spatrick
8146035553Spatrick    // setting the result with deferred notification
8246035553Spatrick    void set_value_at_thread_exit(const R& r);
8346035553Spatrick    void set_value_at_thread_exit(R&& r);
8446035553Spatrick    void set_exception_at_thread_exit(exception_ptr p);
8546035553Spatrick};
8646035553Spatrick
8746035553Spatricktemplate <class R>
8846035553Spatrickclass promise<R&>
8946035553Spatrick{
9046035553Spatrickpublic:
9146035553Spatrick    promise();
9246035553Spatrick    template <class Allocator>
9346035553Spatrick        promise(allocator_arg_t, const Allocator& a);
9446035553Spatrick    promise(promise&& rhs) noexcept;
9546035553Spatrick    promise(const promise& rhs) = delete;
9646035553Spatrick    ~promise();
9746035553Spatrick
9846035553Spatrick    // assignment
9946035553Spatrick    promise& operator=(promise&& rhs) noexcept;
10046035553Spatrick    promise& operator=(const promise& rhs) = delete;
10146035553Spatrick    void swap(promise& other) noexcept;
10246035553Spatrick
10346035553Spatrick    // retrieving the result
10446035553Spatrick    future<R&> get_future();
10546035553Spatrick
10646035553Spatrick    // setting the result
10746035553Spatrick    void set_value(R& r);
10846035553Spatrick    void set_exception(exception_ptr p);
10946035553Spatrick
11046035553Spatrick    // setting the result with deferred notification
11146035553Spatrick    void set_value_at_thread_exit(R&);
11246035553Spatrick    void set_exception_at_thread_exit(exception_ptr p);
11346035553Spatrick};
11446035553Spatrick
11546035553Spatricktemplate <>
11646035553Spatrickclass promise<void>
11746035553Spatrick{
11846035553Spatrickpublic:
11946035553Spatrick    promise();
12046035553Spatrick    template <class Allocator>
12146035553Spatrick        promise(allocator_arg_t, const Allocator& a);
12246035553Spatrick    promise(promise&& rhs) noexcept;
12346035553Spatrick    promise(const promise& rhs) = delete;
12446035553Spatrick    ~promise();
12546035553Spatrick
12646035553Spatrick    // assignment
12746035553Spatrick    promise& operator=(promise&& rhs) noexcept;
12846035553Spatrick    promise& operator=(const promise& rhs) = delete;
12946035553Spatrick    void swap(promise& other) noexcept;
13046035553Spatrick
13146035553Spatrick    // retrieving the result
13246035553Spatrick    future<void> get_future();
13346035553Spatrick
13446035553Spatrick    // setting the result
13546035553Spatrick    void set_value();
13646035553Spatrick    void set_exception(exception_ptr p);
13746035553Spatrick
13846035553Spatrick    // setting the result with deferred notification
13946035553Spatrick    void set_value_at_thread_exit();
14046035553Spatrick    void set_exception_at_thread_exit(exception_ptr p);
14146035553Spatrick};
14246035553Spatrick
14346035553Spatricktemplate <class R> void swap(promise<R>& x, promise<R>& y) noexcept;
14446035553Spatrick
14546035553Spatricktemplate <class R, class Alloc>
14646035553Spatrick    struct uses_allocator<promise<R>, Alloc> : public true_type {};
14746035553Spatrick
14846035553Spatricktemplate <class R>
14946035553Spatrickclass future
15046035553Spatrick{
15146035553Spatrickpublic:
15246035553Spatrick    future() noexcept;
15346035553Spatrick    future(future&&) noexcept;
15446035553Spatrick    future(const future& rhs) = delete;
15546035553Spatrick    ~future();
15646035553Spatrick    future& operator=(const future& rhs) = delete;
15746035553Spatrick    future& operator=(future&&) noexcept;
15846035553Spatrick    shared_future<R> share() noexcept;
15946035553Spatrick
16046035553Spatrick    // retrieving the value
16146035553Spatrick    R get();
16246035553Spatrick
16346035553Spatrick    // functions to check state
16446035553Spatrick    bool valid() const noexcept;
16546035553Spatrick
16646035553Spatrick    void wait() const;
16746035553Spatrick    template <class Rep, class Period>
16846035553Spatrick        future_status
16946035553Spatrick        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
17046035553Spatrick    template <class Clock, class Duration>
17146035553Spatrick        future_status
17246035553Spatrick        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
17346035553Spatrick};
17446035553Spatrick
17546035553Spatricktemplate <class R>
17646035553Spatrickclass future<R&>
17746035553Spatrick{
17846035553Spatrickpublic:
17946035553Spatrick    future() noexcept;
18046035553Spatrick    future(future&&) noexcept;
18146035553Spatrick    future(const future& rhs) = delete;
18246035553Spatrick    ~future();
18346035553Spatrick    future& operator=(const future& rhs) = delete;
18446035553Spatrick    future& operator=(future&&) noexcept;
18546035553Spatrick    shared_future<R&> share() noexcept;
18646035553Spatrick
18746035553Spatrick    // retrieving the value
18846035553Spatrick    R& get();
18946035553Spatrick
19046035553Spatrick    // functions to check state
19146035553Spatrick    bool valid() const noexcept;
19246035553Spatrick
19346035553Spatrick    void wait() const;
19446035553Spatrick    template <class Rep, class Period>
19546035553Spatrick        future_status
19646035553Spatrick        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
19746035553Spatrick    template <class Clock, class Duration>
19846035553Spatrick        future_status
19946035553Spatrick        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
20046035553Spatrick};
20146035553Spatrick
20246035553Spatricktemplate <>
20346035553Spatrickclass future<void>
20446035553Spatrick{
20546035553Spatrickpublic:
20646035553Spatrick    future() noexcept;
20746035553Spatrick    future(future&&) noexcept;
20846035553Spatrick    future(const future& rhs) = delete;
20946035553Spatrick    ~future();
21046035553Spatrick    future& operator=(const future& rhs) = delete;
21146035553Spatrick    future& operator=(future&&) noexcept;
21246035553Spatrick    shared_future<void> share() noexcept;
21346035553Spatrick
21446035553Spatrick    // retrieving the value
21546035553Spatrick    void get();
21646035553Spatrick
21746035553Spatrick    // functions to check state
21846035553Spatrick    bool valid() const noexcept;
21946035553Spatrick
22046035553Spatrick    void wait() const;
22146035553Spatrick    template <class Rep, class Period>
22246035553Spatrick        future_status
22346035553Spatrick        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
22446035553Spatrick    template <class Clock, class Duration>
22546035553Spatrick        future_status
22646035553Spatrick        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
22746035553Spatrick};
22846035553Spatrick
22946035553Spatricktemplate <class R>
23046035553Spatrickclass shared_future
23146035553Spatrick{
23246035553Spatrickpublic:
23346035553Spatrick    shared_future() noexcept;
23446035553Spatrick    shared_future(const shared_future& rhs);
23546035553Spatrick    shared_future(future<R>&&) noexcept;
23646035553Spatrick    shared_future(shared_future&& rhs) noexcept;
23746035553Spatrick    ~shared_future();
23846035553Spatrick    shared_future& operator=(const shared_future& rhs);
23946035553Spatrick    shared_future& operator=(shared_future&& rhs) noexcept;
24046035553Spatrick
24146035553Spatrick    // retrieving the value
24246035553Spatrick    const R& get() const;
24346035553Spatrick
24446035553Spatrick    // functions to check state
24546035553Spatrick    bool valid() const noexcept;
24646035553Spatrick
24746035553Spatrick    void wait() const;
24846035553Spatrick    template <class Rep, class Period>
24946035553Spatrick        future_status
25046035553Spatrick        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
25146035553Spatrick    template <class Clock, class Duration>
25246035553Spatrick        future_status
25346035553Spatrick        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
25446035553Spatrick};
25546035553Spatrick
25646035553Spatricktemplate <class R>
25746035553Spatrickclass shared_future<R&>
25846035553Spatrick{
25946035553Spatrickpublic:
26046035553Spatrick    shared_future() noexcept;
26146035553Spatrick    shared_future(const shared_future& rhs);
26246035553Spatrick    shared_future(future<R&>&&) noexcept;
26346035553Spatrick    shared_future(shared_future&& rhs) noexcept;
26446035553Spatrick    ~shared_future();
26546035553Spatrick    shared_future& operator=(const shared_future& rhs);
26646035553Spatrick    shared_future& operator=(shared_future&& rhs) noexcept;
26746035553Spatrick
26846035553Spatrick    // retrieving the value
26946035553Spatrick    R& get() const;
27046035553Spatrick
27146035553Spatrick    // functions to check state
27246035553Spatrick    bool valid() const noexcept;
27346035553Spatrick
27446035553Spatrick    void wait() const;
27546035553Spatrick    template <class Rep, class Period>
27646035553Spatrick        future_status
27746035553Spatrick        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
27846035553Spatrick    template <class Clock, class Duration>
27946035553Spatrick        future_status
28046035553Spatrick        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
28146035553Spatrick};
28246035553Spatrick
28346035553Spatricktemplate <>
28446035553Spatrickclass shared_future<void>
28546035553Spatrick{
28646035553Spatrickpublic:
28746035553Spatrick    shared_future() noexcept;
28846035553Spatrick    shared_future(const shared_future& rhs);
28946035553Spatrick    shared_future(future<void>&&) noexcept;
29046035553Spatrick    shared_future(shared_future&& rhs) noexcept;
29146035553Spatrick    ~shared_future();
29246035553Spatrick    shared_future& operator=(const shared_future& rhs);
29346035553Spatrick    shared_future& operator=(shared_future&& rhs) noexcept;
29446035553Spatrick
29546035553Spatrick    // retrieving the value
29646035553Spatrick    void get() const;
29746035553Spatrick
29846035553Spatrick    // functions to check state
29946035553Spatrick    bool valid() const noexcept;
30046035553Spatrick
30146035553Spatrick    void wait() const;
30246035553Spatrick    template <class Rep, class Period>
30346035553Spatrick        future_status
30446035553Spatrick        wait_for(const chrono::duration<Rep, Period>& rel_time) const;
30546035553Spatrick    template <class Clock, class Duration>
30646035553Spatrick        future_status
30746035553Spatrick        wait_until(const chrono::time_point<Clock, Duration>& abs_time) const;
30846035553Spatrick};
30946035553Spatrick
31046035553Spatricktemplate <class F, class... Args>
31146035553Spatrick  future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
31246035553Spatrick  async(F&& f, Args&&... args);
31346035553Spatrick
31446035553Spatricktemplate <class F, class... Args>
31546035553Spatrick  future<typename result_of<typename decay<F>::type(typename decay<Args>::type...)>::type>
31646035553Spatrick  async(launch policy, F&& f, Args&&... args);
31746035553Spatrick
31846035553Spatricktemplate <class> class packaged_task; // undefined
31946035553Spatrick
32046035553Spatricktemplate <class R, class... ArgTypes>
32146035553Spatrickclass packaged_task<R(ArgTypes...)>
32246035553Spatrick{
32346035553Spatrickpublic:
32446035553Spatrick    typedef R result_type; // extension
32546035553Spatrick
32646035553Spatrick    // construction and destruction
32746035553Spatrick    packaged_task() noexcept;
32846035553Spatrick    template <class F>
32946035553Spatrick        explicit packaged_task(F&& f);
33046035553Spatrick    template <class F, class Allocator>
33146035553Spatrick        packaged_task(allocator_arg_t, const Allocator& a, F&& f);
33246035553Spatrick    ~packaged_task();
33346035553Spatrick
33446035553Spatrick    // no copy
33546035553Spatrick    packaged_task(const packaged_task&) = delete;
33646035553Spatrick    packaged_task& operator=(const packaged_task&) = delete;
33746035553Spatrick
33846035553Spatrick    // move support
33946035553Spatrick    packaged_task(packaged_task&& other) noexcept;
34046035553Spatrick    packaged_task& operator=(packaged_task&& other) noexcept;
34146035553Spatrick    void swap(packaged_task& other) noexcept;
34246035553Spatrick
34346035553Spatrick    bool valid() const noexcept;
34446035553Spatrick
34546035553Spatrick    // result retrieval
34646035553Spatrick    future<R> get_future();
34746035553Spatrick
34846035553Spatrick    // execution
34946035553Spatrick    void operator()(ArgTypes... );
35046035553Spatrick    void make_ready_at_thread_exit(ArgTypes...);
35146035553Spatrick
35246035553Spatrick    void reset();
35346035553Spatrick};
35446035553Spatrick
35546035553Spatricktemplate <class R>
35646035553Spatrick  void swap(packaged_task<R(ArgTypes...)&, packaged_task<R(ArgTypes...)>&) noexcept;
35746035553Spatrick
35846035553Spatricktemplate <class R, class Alloc> struct uses_allocator<packaged_task<R>, Alloc>;
35946035553Spatrick
36046035553Spatrick}  // std
36146035553Spatrick
36246035553Spatrick*/
36346035553Spatrick
364*4bdff4beSrobert#include <__assert> // all public C++ headers provide the assertion handler
36576d0caaeSpatrick#include <__availability>
366*4bdff4beSrobert#include <__chrono/duration.h>
367*4bdff4beSrobert#include <__chrono/time_point.h>
36846035553Spatrick#include <__config>
36976d0caaeSpatrick#include <__memory/allocator_arg_t.h>
370*4bdff4beSrobert#include <__memory/allocator_destructor.h>
37176d0caaeSpatrick#include <__memory/uses_allocator.h>
372*4bdff4beSrobert#include <__type_traits/strip_signature.h>
373*4bdff4beSrobert#include <__utility/auto_cast.h>
37476d0caaeSpatrick#include <__utility/forward.h>
375*4bdff4beSrobert#include <__utility/move.h>
37646035553Spatrick#include <exception>
37746035553Spatrick#include <mutex>
378*4bdff4beSrobert#include <new>
37976d0caaeSpatrick#include <system_error>
38046035553Spatrick#include <thread>
381*4bdff4beSrobert#include <version>
38246035553Spatrick
38346035553Spatrick#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
38446035553Spatrick#  pragma GCC system_header
38546035553Spatrick#endif
38646035553Spatrick
38746035553Spatrick#ifdef _LIBCPP_HAS_NO_THREADS
388*4bdff4beSrobert# error "<future> is not supported since libc++ has been configured without support for threads."
389*4bdff4beSrobert#endif
39046035553Spatrick
39146035553Spatrick_LIBCPP_BEGIN_NAMESPACE_STD
39246035553Spatrick
39346035553Spatrick//enum class future_errc
39446035553Spatrick_LIBCPP_DECLARE_STRONG_ENUM(future_errc)
39546035553Spatrick{
39646035553Spatrick    future_already_retrieved = 1,
39746035553Spatrick    promise_already_satisfied,
39846035553Spatrick    no_state,
39946035553Spatrick    broken_promise
40046035553Spatrick};
40146035553Spatrick_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_errc)
40246035553Spatrick
40346035553Spatricktemplate <>
40446035553Spatrickstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc> : public true_type {};
40546035553Spatrick
406*4bdff4beSrobert#ifdef _LIBCPP_CXX03_LANG
40746035553Spatricktemplate <>
40846035553Spatrickstruct _LIBCPP_TEMPLATE_VIS is_error_code_enum<future_errc::__lx> : public true_type { };
40946035553Spatrick#endif
41046035553Spatrick
41146035553Spatrick//enum class launch
41246035553Spatrick_LIBCPP_DECLARE_STRONG_ENUM(launch)
41346035553Spatrick{
41446035553Spatrick    async = 1,
41546035553Spatrick    deferred = 2,
41646035553Spatrick    any = async | deferred
41746035553Spatrick};
41846035553Spatrick_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(launch)
41946035553Spatrick
420*4bdff4beSrobert#ifndef _LIBCPP_CXX03_LANG
42146035553Spatrick
42246035553Spatricktypedef underlying_type<launch>::type __launch_underlying_type;
42346035553Spatrick
42446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
42546035553Spatrick_LIBCPP_CONSTEXPR
42646035553Spatricklaunch
42746035553Spatrickoperator&(launch __x, launch __y)
42846035553Spatrick{
42946035553Spatrick    return static_cast<launch>(static_cast<__launch_underlying_type>(__x) &
43046035553Spatrick                               static_cast<__launch_underlying_type>(__y));
43146035553Spatrick}
43246035553Spatrick
43346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
43446035553Spatrick_LIBCPP_CONSTEXPR
43546035553Spatricklaunch
43646035553Spatrickoperator|(launch __x, launch __y)
43746035553Spatrick{
43846035553Spatrick    return static_cast<launch>(static_cast<__launch_underlying_type>(__x) |
43946035553Spatrick                               static_cast<__launch_underlying_type>(__y));
44046035553Spatrick}
44146035553Spatrick
44246035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
44346035553Spatrick_LIBCPP_CONSTEXPR
44446035553Spatricklaunch
44546035553Spatrickoperator^(launch __x, launch __y)
44646035553Spatrick{
44746035553Spatrick    return static_cast<launch>(static_cast<__launch_underlying_type>(__x) ^
44846035553Spatrick                               static_cast<__launch_underlying_type>(__y));
44946035553Spatrick}
45046035553Spatrick
45146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
45246035553Spatrick_LIBCPP_CONSTEXPR
45346035553Spatricklaunch
45446035553Spatrickoperator~(launch __x)
45546035553Spatrick{
45646035553Spatrick    return static_cast<launch>(~static_cast<__launch_underlying_type>(__x) & 3);
45746035553Spatrick}
45846035553Spatrick
45946035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
46046035553Spatricklaunch&
46146035553Spatrickoperator&=(launch& __x, launch __y)
46246035553Spatrick{
46346035553Spatrick    __x = __x & __y; return __x;
46446035553Spatrick}
46546035553Spatrick
46646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
46746035553Spatricklaunch&
46846035553Spatrickoperator|=(launch& __x, launch __y)
46946035553Spatrick{
47046035553Spatrick    __x = __x | __y; return __x;
47146035553Spatrick}
47246035553Spatrick
47346035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
47446035553Spatricklaunch&
47546035553Spatrickoperator^=(launch& __x, launch __y)
47646035553Spatrick{
47746035553Spatrick    __x = __x ^ __y; return __x;
47846035553Spatrick}
47946035553Spatrick
480*4bdff4beSrobert#endif // !_LIBCPP_CXX03_LANG
48146035553Spatrick
48246035553Spatrick//enum class future_status
48346035553Spatrick_LIBCPP_DECLARE_STRONG_ENUM(future_status)
48446035553Spatrick{
48546035553Spatrick    ready,
48646035553Spatrick    timeout,
48746035553Spatrick    deferred
48846035553Spatrick};
48946035553Spatrick_LIBCPP_DECLARE_STRONG_ENUM_EPILOG(future_status)
49046035553Spatrick
49146035553Spatrick_LIBCPP_FUNC_VIS
49246035553Spatrickconst error_category& future_category() _NOEXCEPT;
49346035553Spatrick
49446035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
49546035553Spatrickerror_code
49646035553Spatrickmake_error_code(future_errc __e) _NOEXCEPT
49746035553Spatrick{
49846035553Spatrick    return error_code(static_cast<int>(__e), future_category());
49946035553Spatrick}
50046035553Spatrick
50146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
50246035553Spatrickerror_condition
50346035553Spatrickmake_error_condition(future_errc __e) _NOEXCEPT
50446035553Spatrick{
50546035553Spatrick    return error_condition(static_cast<int>(__e), future_category());
50646035553Spatrick}
50746035553Spatrick
50846035553Spatrickclass _LIBCPP_EXCEPTION_ABI _LIBCPP_AVAILABILITY_FUTURE_ERROR future_error
50946035553Spatrick    : public logic_error
51046035553Spatrick{
51146035553Spatrick    error_code __ec_;
51246035553Spatrickpublic:
51346035553Spatrick    future_error(error_code __ec);
51476d0caaeSpatrick
51546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
51646035553Spatrick    const error_code& code() const _NOEXCEPT {return __ec_;}
51746035553Spatrick
518037e7968Spatrick    future_error(const future_error&) _NOEXCEPT = default;
519*4bdff4beSrobert    ~future_error() _NOEXCEPT override;
52046035553Spatrick};
52146035553Spatrick
52246035553Spatrick_LIBCPP_NORETURN inline _LIBCPP_INLINE_VISIBILITY
52346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
52446035553Spatrick_LIBCPP_AVAILABILITY_FUTURE_ERROR
52546035553Spatrick#endif
526*4bdff4beSrobertvoid __throw_future_error(future_errc __ev)
52746035553Spatrick{
52846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
529*4bdff4beSrobert    throw future_error(make_error_code(__ev));
53046035553Spatrick#else
531*4bdff4beSrobert    ((void)__ev);
53246035553Spatrick    _VSTD::abort();
53346035553Spatrick#endif
53446035553Spatrick}
53546035553Spatrick
53646035553Spatrickclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state
53746035553Spatrick    : public __shared_count
53846035553Spatrick{
53946035553Spatrickprotected:
54046035553Spatrick    exception_ptr __exception_;
54146035553Spatrick    mutable mutex __mut_;
54246035553Spatrick    mutable condition_variable __cv_;
54346035553Spatrick    unsigned __state_;
54446035553Spatrick
545*4bdff4beSrobert    void __on_zero_shared() _NOEXCEPT override;
54646035553Spatrick    void __sub_wait(unique_lock<mutex>& __lk);
54746035553Spatrickpublic:
54846035553Spatrick    enum
54946035553Spatrick    {
55046035553Spatrick        __constructed = 1,
55146035553Spatrick        __future_attached = 2,
55246035553Spatrick        ready = 4,
55346035553Spatrick        deferred = 8
55446035553Spatrick    };
55546035553Spatrick
55646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
55746035553Spatrick    __assoc_sub_state() : __state_(0) {}
55846035553Spatrick
55946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
56046035553Spatrick    bool __has_value() const
56146035553Spatrick        {return (__state_ & __constructed) || (__exception_ != nullptr);}
56246035553Spatrick
56346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
56446035553Spatrick    void __attach_future() {
56546035553Spatrick        lock_guard<mutex> __lk(__mut_);
56646035553Spatrick        bool __has_future_attached = (__state_ & __future_attached) != 0;
56746035553Spatrick        if (__has_future_attached)
56846035553Spatrick            __throw_future_error(future_errc::future_already_retrieved);
56946035553Spatrick        this->__add_shared();
57046035553Spatrick        __state_ |= __future_attached;
57146035553Spatrick    }
57246035553Spatrick
57346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
57446035553Spatrick    void __set_deferred() {__state_ |= deferred;}
57546035553Spatrick
57646035553Spatrick    void __make_ready();
57746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
57846035553Spatrick    bool __is_ready() const {return (__state_ & ready) != 0;}
57946035553Spatrick
58046035553Spatrick    void set_value();
58146035553Spatrick    void set_value_at_thread_exit();
58246035553Spatrick
58346035553Spatrick    void set_exception(exception_ptr __p);
58446035553Spatrick    void set_exception_at_thread_exit(exception_ptr __p);
58546035553Spatrick
58646035553Spatrick    void copy();
58746035553Spatrick
58846035553Spatrick    void wait();
58946035553Spatrick    template <class _Rep, class _Period>
59046035553Spatrick        future_status
59146035553Spatrick        _LIBCPP_INLINE_VISIBILITY
59246035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const;
59346035553Spatrick    template <class _Clock, class _Duration>
59446035553Spatrick        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
59546035553Spatrick        future_status
59646035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const;
59746035553Spatrick
59846035553Spatrick    virtual void __execute();
59946035553Spatrick};
60046035553Spatrick
60146035553Spatricktemplate <class _Clock, class _Duration>
60246035553Spatrickfuture_status
60346035553Spatrick__assoc_sub_state::wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
60446035553Spatrick{
60546035553Spatrick    unique_lock<mutex> __lk(__mut_);
60646035553Spatrick    if (__state_ & deferred)
60746035553Spatrick        return future_status::deferred;
60846035553Spatrick    while (!(__state_ & ready) && _Clock::now() < __abs_time)
60946035553Spatrick        __cv_.wait_until(__lk, __abs_time);
61046035553Spatrick    if (__state_ & ready)
61146035553Spatrick        return future_status::ready;
61246035553Spatrick    return future_status::timeout;
61346035553Spatrick}
61446035553Spatrick
61546035553Spatricktemplate <class _Rep, class _Period>
61646035553Spatrickinline
61746035553Spatrickfuture_status
61846035553Spatrick__assoc_sub_state::wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
61946035553Spatrick{
62046035553Spatrick    return wait_until(chrono::steady_clock::now() + __rel_time);
62146035553Spatrick}
62246035553Spatrick
62346035553Spatricktemplate <class _Rp>
62446035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE _LIBCPP_HIDDEN __assoc_state
62546035553Spatrick    : public __assoc_sub_state
62646035553Spatrick{
62746035553Spatrick    typedef __assoc_sub_state base;
628*4bdff4beSrobert_LIBCPP_SUPPRESS_DEPRECATED_PUSH
62946035553Spatrick    typedef typename aligned_storage<sizeof(_Rp), alignment_of<_Rp>::value>::type _Up;
630*4bdff4beSrobert_LIBCPP_SUPPRESS_DEPRECATED_POP
63146035553Spatrickprotected:
63246035553Spatrick    _Up __value_;
63346035553Spatrick
634*4bdff4beSrobert    void __on_zero_shared() _NOEXCEPT override;
63546035553Spatrickpublic:
63646035553Spatrick
63746035553Spatrick    template <class _Arg>
63846035553Spatrick    void set_value(_Arg&& __arg);
63946035553Spatrick
64046035553Spatrick    template <class _Arg>
64146035553Spatrick    void set_value_at_thread_exit(_Arg&& __arg);
64246035553Spatrick
64346035553Spatrick    _Rp move();
644*4bdff4beSrobert    __add_lvalue_reference_t<_Rp> copy();
64546035553Spatrick};
64646035553Spatrick
64746035553Spatricktemplate <class _Rp>
64846035553Spatrickvoid
64946035553Spatrick__assoc_state<_Rp>::__on_zero_shared() _NOEXCEPT
65046035553Spatrick{
65146035553Spatrick    if (this->__state_ & base::__constructed)
65246035553Spatrick        reinterpret_cast<_Rp*>(&__value_)->~_Rp();
65346035553Spatrick    delete this;
65446035553Spatrick}
65546035553Spatrick
65646035553Spatricktemplate <class _Rp>
65746035553Spatricktemplate <class _Arg>
65846035553Spatrick_LIBCPP_AVAILABILITY_FUTURE
65946035553Spatrickvoid
66046035553Spatrick__assoc_state<_Rp>::set_value(_Arg&& __arg)
66146035553Spatrick{
66246035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
66346035553Spatrick    if (this->__has_value())
66446035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
66576d0caaeSpatrick    ::new ((void*)&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
66646035553Spatrick    this->__state_ |= base::__constructed | base::ready;
66746035553Spatrick    __cv_.notify_all();
66846035553Spatrick}
66946035553Spatrick
67046035553Spatricktemplate <class _Rp>
67146035553Spatricktemplate <class _Arg>
67246035553Spatrickvoid
67346035553Spatrick__assoc_state<_Rp>::set_value_at_thread_exit(_Arg&& __arg)
67446035553Spatrick{
67546035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
67646035553Spatrick    if (this->__has_value())
67746035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
67876d0caaeSpatrick    ::new ((void*)&__value_) _Rp(_VSTD::forward<_Arg>(__arg));
67946035553Spatrick    this->__state_ |= base::__constructed;
68046035553Spatrick    __thread_local_data()->__make_ready_at_thread_exit(this);
68146035553Spatrick}
68246035553Spatrick
68346035553Spatricktemplate <class _Rp>
68446035553Spatrick_Rp
68546035553Spatrick__assoc_state<_Rp>::move()
68646035553Spatrick{
68746035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
68846035553Spatrick    this->__sub_wait(__lk);
68946035553Spatrick    if (this->__exception_ != nullptr)
690*4bdff4beSrobert        std::rethrow_exception(this->__exception_);
69146035553Spatrick    return _VSTD::move(*reinterpret_cast<_Rp*>(&__value_));
69246035553Spatrick}
69346035553Spatrick
69446035553Spatricktemplate <class _Rp>
695*4bdff4beSrobert__add_lvalue_reference_t<_Rp>
69646035553Spatrick__assoc_state<_Rp>::copy()
69746035553Spatrick{
69846035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
69946035553Spatrick    this->__sub_wait(__lk);
70046035553Spatrick    if (this->__exception_ != nullptr)
701*4bdff4beSrobert        std::rethrow_exception(this->__exception_);
70246035553Spatrick    return *reinterpret_cast<_Rp*>(&__value_);
70346035553Spatrick}
70446035553Spatrick
70546035553Spatricktemplate <class _Rp>
70646035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state<_Rp&>
70746035553Spatrick    : public __assoc_sub_state
70846035553Spatrick{
70946035553Spatrick    typedef __assoc_sub_state base;
71046035553Spatrick    typedef _Rp* _Up;
71146035553Spatrickprotected:
71246035553Spatrick    _Up __value_;
71346035553Spatrick
714*4bdff4beSrobert    void __on_zero_shared() _NOEXCEPT override;
71546035553Spatrickpublic:
71646035553Spatrick
71746035553Spatrick    void set_value(_Rp& __arg);
71846035553Spatrick    void set_value_at_thread_exit(_Rp& __arg);
71946035553Spatrick
72046035553Spatrick    _Rp& copy();
72146035553Spatrick};
72246035553Spatrick
72346035553Spatricktemplate <class _Rp>
72446035553Spatrickvoid
72546035553Spatrick__assoc_state<_Rp&>::__on_zero_shared() _NOEXCEPT
72646035553Spatrick{
72746035553Spatrick    delete this;
72846035553Spatrick}
72946035553Spatrick
73046035553Spatricktemplate <class _Rp>
73146035553Spatrickvoid
73246035553Spatrick__assoc_state<_Rp&>::set_value(_Rp& __arg)
73346035553Spatrick{
73446035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
73546035553Spatrick    if (this->__has_value())
73646035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
73746035553Spatrick    __value_ = _VSTD::addressof(__arg);
73846035553Spatrick    this->__state_ |= base::__constructed | base::ready;
73946035553Spatrick    __cv_.notify_all();
74046035553Spatrick}
74146035553Spatrick
74246035553Spatricktemplate <class _Rp>
74346035553Spatrickvoid
74446035553Spatrick__assoc_state<_Rp&>::set_value_at_thread_exit(_Rp& __arg)
74546035553Spatrick{
74646035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
74746035553Spatrick    if (this->__has_value())
74846035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
74946035553Spatrick    __value_ = _VSTD::addressof(__arg);
75046035553Spatrick    this->__state_ |= base::__constructed;
75146035553Spatrick    __thread_local_data()->__make_ready_at_thread_exit(this);
75246035553Spatrick}
75346035553Spatrick
75446035553Spatricktemplate <class _Rp>
75546035553Spatrick_Rp&
75646035553Spatrick__assoc_state<_Rp&>::copy()
75746035553Spatrick{
75846035553Spatrick    unique_lock<mutex> __lk(this->__mut_);
75946035553Spatrick    this->__sub_wait(__lk);
76046035553Spatrick    if (this->__exception_ != nullptr)
761*4bdff4beSrobert        std::rethrow_exception(this->__exception_);
76246035553Spatrick    return *__value_;
76346035553Spatrick}
76446035553Spatrick
76546035553Spatricktemplate <class _Rp, class _Alloc>
76646035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc
76746035553Spatrick    : public __assoc_state<_Rp>
76846035553Spatrick{
76946035553Spatrick    typedef __assoc_state<_Rp> base;
77046035553Spatrick    _Alloc __alloc_;
77146035553Spatrick
77246035553Spatrick    virtual void __on_zero_shared() _NOEXCEPT;
77346035553Spatrickpublic:
77446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
77546035553Spatrick    explicit __assoc_state_alloc(const _Alloc& __a)
77646035553Spatrick        : __alloc_(__a) {}
77746035553Spatrick};
77846035553Spatrick
77946035553Spatricktemplate <class _Rp, class _Alloc>
78046035553Spatrickvoid
78146035553Spatrick__assoc_state_alloc<_Rp, _Alloc>::__on_zero_shared() _NOEXCEPT
78246035553Spatrick{
78346035553Spatrick    if (this->__state_ & base::__constructed)
78446035553Spatrick        reinterpret_cast<_Rp*>(_VSTD::addressof(this->__value_))->~_Rp();
78546035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
78646035553Spatrick    typedef allocator_traits<_Al> _ATraits;
78746035553Spatrick    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
78846035553Spatrick    _Al __a(__alloc_);
78946035553Spatrick    this->~__assoc_state_alloc();
79046035553Spatrick    __a.deallocate(_PTraits::pointer_to(*this), 1);
79146035553Spatrick}
79246035553Spatrick
79346035553Spatricktemplate <class _Rp, class _Alloc>
79446035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __assoc_state_alloc<_Rp&, _Alloc>
79546035553Spatrick    : public __assoc_state<_Rp&>
79646035553Spatrick{
79746035553Spatrick    typedef __assoc_state<_Rp&> base;
79846035553Spatrick    _Alloc __alloc_;
79946035553Spatrick
80046035553Spatrick    virtual void __on_zero_shared() _NOEXCEPT;
80146035553Spatrickpublic:
80246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
80346035553Spatrick    explicit __assoc_state_alloc(const _Alloc& __a)
80446035553Spatrick        : __alloc_(__a) {}
80546035553Spatrick};
80646035553Spatrick
80746035553Spatricktemplate <class _Rp, class _Alloc>
80846035553Spatrickvoid
80946035553Spatrick__assoc_state_alloc<_Rp&, _Alloc>::__on_zero_shared() _NOEXCEPT
81046035553Spatrick{
81146035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, __assoc_state_alloc>::type _Al;
81246035553Spatrick    typedef allocator_traits<_Al> _ATraits;
81346035553Spatrick    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
81446035553Spatrick    _Al __a(__alloc_);
81546035553Spatrick    this->~__assoc_state_alloc();
81646035553Spatrick    __a.deallocate(_PTraits::pointer_to(*this), 1);
81746035553Spatrick}
81846035553Spatrick
81946035553Spatricktemplate <class _Alloc>
82046035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __assoc_sub_state_alloc
82146035553Spatrick    : public __assoc_sub_state
82246035553Spatrick{
82346035553Spatrick    typedef __assoc_sub_state base;
82446035553Spatrick    _Alloc __alloc_;
82546035553Spatrick
826*4bdff4beSrobert    void __on_zero_shared() _NOEXCEPT override;
82746035553Spatrickpublic:
82846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
82946035553Spatrick    explicit __assoc_sub_state_alloc(const _Alloc& __a)
83046035553Spatrick        : __alloc_(__a) {}
83146035553Spatrick};
83246035553Spatrick
83346035553Spatricktemplate <class _Alloc>
83446035553Spatrickvoid
83546035553Spatrick__assoc_sub_state_alloc<_Alloc>::__on_zero_shared() _NOEXCEPT
83646035553Spatrick{
83746035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, __assoc_sub_state_alloc>::type _Al;
83846035553Spatrick    typedef allocator_traits<_Al> _ATraits;
83946035553Spatrick    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
84046035553Spatrick    _Al __a(__alloc_);
84146035553Spatrick    this->~__assoc_sub_state_alloc();
84246035553Spatrick    __a.deallocate(_PTraits::pointer_to(*this), 1);
84346035553Spatrick}
84446035553Spatrick
84546035553Spatricktemplate <class _Rp, class _Fp>
84646035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state
84746035553Spatrick    : public __assoc_state<_Rp>
84846035553Spatrick{
84946035553Spatrick    typedef __assoc_state<_Rp> base;
85046035553Spatrick
85146035553Spatrick    _Fp __func_;
85246035553Spatrick
85346035553Spatrickpublic:
85446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
85546035553Spatrick    explicit __deferred_assoc_state(_Fp&& __f);
85646035553Spatrick
85746035553Spatrick    virtual void __execute();
85846035553Spatrick};
85946035553Spatrick
86046035553Spatricktemplate <class _Rp, class _Fp>
86146035553Spatrickinline
86246035553Spatrick__deferred_assoc_state<_Rp, _Fp>::__deferred_assoc_state(_Fp&& __f)
86346035553Spatrick    : __func_(_VSTD::forward<_Fp>(__f))
86446035553Spatrick{
86546035553Spatrick    this->__set_deferred();
86646035553Spatrick}
86746035553Spatrick
86846035553Spatricktemplate <class _Rp, class _Fp>
86946035553Spatrickvoid
87046035553Spatrick__deferred_assoc_state<_Rp, _Fp>::__execute()
87146035553Spatrick{
87246035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
87346035553Spatrick    try
87446035553Spatrick    {
87546035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
87646035553Spatrick        this->set_value(__func_());
87746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
87846035553Spatrick    }
87946035553Spatrick    catch (...)
88046035553Spatrick    {
88146035553Spatrick        this->set_exception(current_exception());
88246035553Spatrick    }
88346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
88446035553Spatrick}
88546035553Spatrick
88646035553Spatricktemplate <class _Fp>
88746035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __deferred_assoc_state<void, _Fp>
88846035553Spatrick    : public __assoc_sub_state
88946035553Spatrick{
89046035553Spatrick    typedef __assoc_sub_state base;
89146035553Spatrick
89246035553Spatrick    _Fp __func_;
89346035553Spatrick
89446035553Spatrickpublic:
89546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
89646035553Spatrick    explicit __deferred_assoc_state(_Fp&& __f);
89746035553Spatrick
898*4bdff4beSrobert    void __execute() override;
89946035553Spatrick};
90046035553Spatrick
90146035553Spatricktemplate <class _Fp>
90246035553Spatrickinline
90346035553Spatrick__deferred_assoc_state<void, _Fp>::__deferred_assoc_state(_Fp&& __f)
90446035553Spatrick    : __func_(_VSTD::forward<_Fp>(__f))
90546035553Spatrick{
90646035553Spatrick    this->__set_deferred();
90746035553Spatrick}
90846035553Spatrick
90946035553Spatricktemplate <class _Fp>
91046035553Spatrickvoid
91146035553Spatrick__deferred_assoc_state<void, _Fp>::__execute()
91246035553Spatrick{
91346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
91446035553Spatrick    try
91546035553Spatrick    {
91646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
91746035553Spatrick        __func_();
91846035553Spatrick        this->set_value();
91946035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
92046035553Spatrick    }
92146035553Spatrick    catch (...)
92246035553Spatrick    {
92346035553Spatrick        this->set_exception(current_exception());
92446035553Spatrick    }
92546035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
92646035553Spatrick}
92746035553Spatrick
92846035553Spatricktemplate <class _Rp, class _Fp>
92946035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state
93046035553Spatrick    : public __assoc_state<_Rp>
93146035553Spatrick{
93246035553Spatrick    typedef __assoc_state<_Rp> base;
93346035553Spatrick
93446035553Spatrick    _Fp __func_;
93546035553Spatrick
93646035553Spatrick    virtual void __on_zero_shared() _NOEXCEPT;
93746035553Spatrickpublic:
93846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
93946035553Spatrick    explicit __async_assoc_state(_Fp&& __f);
94046035553Spatrick
94146035553Spatrick    virtual void __execute();
94246035553Spatrick};
94346035553Spatrick
94446035553Spatricktemplate <class _Rp, class _Fp>
94546035553Spatrickinline
94646035553Spatrick__async_assoc_state<_Rp, _Fp>::__async_assoc_state(_Fp&& __f)
94746035553Spatrick    : __func_(_VSTD::forward<_Fp>(__f))
94846035553Spatrick{
94946035553Spatrick}
95046035553Spatrick
95146035553Spatricktemplate <class _Rp, class _Fp>
95246035553Spatrickvoid
95346035553Spatrick__async_assoc_state<_Rp, _Fp>::__execute()
95446035553Spatrick{
95546035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
95646035553Spatrick    try
95746035553Spatrick    {
95846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
95946035553Spatrick        this->set_value(__func_());
96046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
96146035553Spatrick    }
96246035553Spatrick    catch (...)
96346035553Spatrick    {
96446035553Spatrick        this->set_exception(current_exception());
96546035553Spatrick    }
96646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
96746035553Spatrick}
96846035553Spatrick
96946035553Spatricktemplate <class _Rp, class _Fp>
97046035553Spatrickvoid
97146035553Spatrick__async_assoc_state<_Rp, _Fp>::__on_zero_shared() _NOEXCEPT
97246035553Spatrick{
97346035553Spatrick    this->wait();
97446035553Spatrick    base::__on_zero_shared();
97546035553Spatrick}
97646035553Spatrick
97746035553Spatricktemplate <class _Fp>
97846035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __async_assoc_state<void, _Fp>
97946035553Spatrick    : public __assoc_sub_state
98046035553Spatrick{
98146035553Spatrick    typedef __assoc_sub_state base;
98246035553Spatrick
98346035553Spatrick    _Fp __func_;
98446035553Spatrick
985*4bdff4beSrobert    void __on_zero_shared() _NOEXCEPT override;
98646035553Spatrickpublic:
98746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
98846035553Spatrick    explicit __async_assoc_state(_Fp&& __f);
98946035553Spatrick
990*4bdff4beSrobert    void __execute() override;
99146035553Spatrick};
99246035553Spatrick
99346035553Spatricktemplate <class _Fp>
99446035553Spatrickinline
99546035553Spatrick__async_assoc_state<void, _Fp>::__async_assoc_state(_Fp&& __f)
99646035553Spatrick    : __func_(_VSTD::forward<_Fp>(__f))
99746035553Spatrick{
99846035553Spatrick}
99946035553Spatrick
100046035553Spatricktemplate <class _Fp>
100146035553Spatrickvoid
100246035553Spatrick__async_assoc_state<void, _Fp>::__execute()
100346035553Spatrick{
100446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
100546035553Spatrick    try
100646035553Spatrick    {
100746035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
100846035553Spatrick        __func_();
100946035553Spatrick        this->set_value();
101046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
101146035553Spatrick    }
101246035553Spatrick    catch (...)
101346035553Spatrick    {
101446035553Spatrick        this->set_exception(current_exception());
101546035553Spatrick    }
101646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
101746035553Spatrick}
101846035553Spatrick
101946035553Spatricktemplate <class _Fp>
102046035553Spatrickvoid
102146035553Spatrick__async_assoc_state<void, _Fp>::__on_zero_shared() _NOEXCEPT
102246035553Spatrick{
102346035553Spatrick    this->wait();
102446035553Spatrick    base::__on_zero_shared();
102546035553Spatrick}
102646035553Spatrick
102746035553Spatricktemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS promise;
102846035553Spatricktemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS shared_future;
102946035553Spatrick
103046035553Spatrick// future
103146035553Spatrick
103246035553Spatricktemplate <class _Rp> class _LIBCPP_TEMPLATE_VIS future;
103346035553Spatrick
103446035553Spatricktemplate <class _Rp, class _Fp>
103546035553Spatrick_LIBCPP_INLINE_VISIBILITY future<_Rp>
103646035553Spatrick__make_deferred_assoc_state(_Fp&& __f);
103746035553Spatrick
103846035553Spatricktemplate <class _Rp, class _Fp>
103946035553Spatrick_LIBCPP_INLINE_VISIBILITY future<_Rp>
104046035553Spatrick__make_async_assoc_state(_Fp&& __f);
104146035553Spatrick
104246035553Spatricktemplate <class _Rp>
104346035553Spatrickclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future
104446035553Spatrick{
104546035553Spatrick    __assoc_state<_Rp>* __state_;
104646035553Spatrick
104746035553Spatrick    explicit future(__assoc_state<_Rp>* __state);
104846035553Spatrick
104946035553Spatrick    template <class> friend class promise;
105046035553Spatrick    template <class> friend class shared_future;
105146035553Spatrick
105246035553Spatrick    template <class _R1, class _Fp>
105346035553Spatrick        friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
105446035553Spatrick    template <class _R1, class _Fp>
105546035553Spatrick        friend future<_R1> __make_async_assoc_state(_Fp&& __f);
105646035553Spatrick
105746035553Spatrickpublic:
105846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
105946035553Spatrick    future() _NOEXCEPT : __state_(nullptr) {}
106046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
106146035553Spatrick    future(future&& __rhs) _NOEXCEPT
106246035553Spatrick        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
106346035553Spatrick    future(const future&) = delete;
106446035553Spatrick    future& operator=(const future&) = delete;
106546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
106646035553Spatrick    future& operator=(future&& __rhs) _NOEXCEPT
106746035553Spatrick        {
106876d0caaeSpatrick            future(_VSTD::move(__rhs)).swap(*this);
106946035553Spatrick            return *this;
107046035553Spatrick        }
107176d0caaeSpatrick
107246035553Spatrick    ~future();
107346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
107446035553Spatrick    shared_future<_Rp> share() _NOEXCEPT;
107546035553Spatrick
107646035553Spatrick    // retrieving the value
107746035553Spatrick    _Rp get();
107846035553Spatrick
107946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
108046035553Spatrick    void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
108146035553Spatrick
108246035553Spatrick    // functions to check state
108346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
108446035553Spatrick    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
108546035553Spatrick
108646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
108746035553Spatrick    void wait() const {__state_->wait();}
108846035553Spatrick    template <class _Rep, class _Period>
108946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
109046035553Spatrick        future_status
109146035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
109246035553Spatrick            {return __state_->wait_for(__rel_time);}
109346035553Spatrick    template <class _Clock, class _Duration>
109446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
109546035553Spatrick        future_status
109646035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
109746035553Spatrick            {return __state_->wait_until(__abs_time);}
109846035553Spatrick};
109946035553Spatrick
110046035553Spatricktemplate <class _Rp>
110146035553Spatrickfuture<_Rp>::future(__assoc_state<_Rp>* __state)
110246035553Spatrick    : __state_(__state)
110346035553Spatrick{
110446035553Spatrick    __state_->__attach_future();
110546035553Spatrick}
110646035553Spatrick
110746035553Spatrickstruct __release_shared_count
110846035553Spatrick{
1109*4bdff4beSrobert    void operator()(__shared_count* __p) {__p->__release_shared();}
111046035553Spatrick};
111146035553Spatrick
111246035553Spatricktemplate <class _Rp>
111346035553Spatrickfuture<_Rp>::~future()
111446035553Spatrick{
111546035553Spatrick    if (__state_)
111646035553Spatrick        __state_->__release_shared();
111746035553Spatrick}
111846035553Spatrick
111946035553Spatricktemplate <class _Rp>
112046035553Spatrick_Rp
112146035553Spatrickfuture<_Rp>::get()
112246035553Spatrick{
112346035553Spatrick    unique_ptr<__shared_count, __release_shared_count> __(__state_);
112446035553Spatrick    __assoc_state<_Rp>* __s = __state_;
112546035553Spatrick    __state_ = nullptr;
112646035553Spatrick    return __s->move();
112746035553Spatrick}
112846035553Spatrick
112946035553Spatricktemplate <class _Rp>
113046035553Spatrickclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE future<_Rp&>
113146035553Spatrick{
113246035553Spatrick    __assoc_state<_Rp&>* __state_;
113346035553Spatrick
113446035553Spatrick    explicit future(__assoc_state<_Rp&>* __state);
113546035553Spatrick
113646035553Spatrick    template <class> friend class promise;
113746035553Spatrick    template <class> friend class shared_future;
113846035553Spatrick
113946035553Spatrick    template <class _R1, class _Fp>
114046035553Spatrick        friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
114146035553Spatrick    template <class _R1, class _Fp>
114246035553Spatrick        friend future<_R1> __make_async_assoc_state(_Fp&& __f);
114346035553Spatrick
114446035553Spatrickpublic:
114546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
114646035553Spatrick    future() _NOEXCEPT : __state_(nullptr) {}
114746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
114846035553Spatrick    future(future&& __rhs) _NOEXCEPT
114946035553Spatrick        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
115046035553Spatrick    future(const future&) = delete;
115146035553Spatrick    future& operator=(const future&) = delete;
115246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
115346035553Spatrick    future& operator=(future&& __rhs) _NOEXCEPT
115446035553Spatrick        {
115576d0caaeSpatrick            future(_VSTD::move(__rhs)).swap(*this);
115646035553Spatrick            return *this;
115746035553Spatrick        }
115876d0caaeSpatrick
115946035553Spatrick    ~future();
116046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116146035553Spatrick    shared_future<_Rp&> share() _NOEXCEPT;
116246035553Spatrick
116346035553Spatrick    // retrieving the value
116446035553Spatrick    _Rp& get();
116546035553Spatrick
116646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
116746035553Spatrick    void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
116846035553Spatrick
116946035553Spatrick    // functions to check state
117046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
117146035553Spatrick    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
117246035553Spatrick
117346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
117446035553Spatrick    void wait() const {__state_->wait();}
117546035553Spatrick    template <class _Rep, class _Period>
117646035553Spatrick        _LIBCPP_INLINE_VISIBILITY
117746035553Spatrick        future_status
117846035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
117946035553Spatrick            {return __state_->wait_for(__rel_time);}
118046035553Spatrick    template <class _Clock, class _Duration>
118146035553Spatrick        _LIBCPP_INLINE_VISIBILITY
118246035553Spatrick        future_status
118346035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
118446035553Spatrick            {return __state_->wait_until(__abs_time);}
118546035553Spatrick};
118646035553Spatrick
118746035553Spatricktemplate <class _Rp>
118846035553Spatrickfuture<_Rp&>::future(__assoc_state<_Rp&>* __state)
118946035553Spatrick    : __state_(__state)
119046035553Spatrick{
119146035553Spatrick    __state_->__attach_future();
119246035553Spatrick}
119346035553Spatrick
119446035553Spatricktemplate <class _Rp>
119546035553Spatrickfuture<_Rp&>::~future()
119646035553Spatrick{
119746035553Spatrick    if (__state_)
119846035553Spatrick        __state_->__release_shared();
119946035553Spatrick}
120046035553Spatrick
120146035553Spatricktemplate <class _Rp>
120246035553Spatrick_Rp&
120346035553Spatrickfuture<_Rp&>::get()
120446035553Spatrick{
120546035553Spatrick    unique_ptr<__shared_count, __release_shared_count> __(__state_);
120646035553Spatrick    __assoc_state<_Rp&>* __s = __state_;
120746035553Spatrick    __state_ = nullptr;
120846035553Spatrick    return __s->copy();
120946035553Spatrick}
121046035553Spatrick
121146035553Spatricktemplate <>
121246035553Spatrickclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE future<void>
121346035553Spatrick{
121446035553Spatrick    __assoc_sub_state* __state_;
121546035553Spatrick
121646035553Spatrick    explicit future(__assoc_sub_state* __state);
121746035553Spatrick
121846035553Spatrick    template <class> friend class promise;
121946035553Spatrick    template <class> friend class shared_future;
122046035553Spatrick
122146035553Spatrick    template <class _R1, class _Fp>
122246035553Spatrick        friend future<_R1> __make_deferred_assoc_state(_Fp&& __f);
122346035553Spatrick    template <class _R1, class _Fp>
122446035553Spatrick        friend future<_R1> __make_async_assoc_state(_Fp&& __f);
122546035553Spatrick
122646035553Spatrickpublic:
122746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
122846035553Spatrick    future() _NOEXCEPT : __state_(nullptr) {}
122946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
123046035553Spatrick    future(future&& __rhs) _NOEXCEPT
123146035553Spatrick        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
123246035553Spatrick    future(const future&) = delete;
123346035553Spatrick    future& operator=(const future&) = delete;
123446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
123546035553Spatrick    future& operator=(future&& __rhs) _NOEXCEPT
123646035553Spatrick        {
123776d0caaeSpatrick            future(_VSTD::move(__rhs)).swap(*this);
123846035553Spatrick            return *this;
123946035553Spatrick        }
124076d0caaeSpatrick
124146035553Spatrick    ~future();
124246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
124346035553Spatrick    shared_future<void> share() _NOEXCEPT;
124446035553Spatrick
124546035553Spatrick    // retrieving the value
124646035553Spatrick    void get();
124746035553Spatrick
124846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
124946035553Spatrick    void swap(future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
125046035553Spatrick
125146035553Spatrick    // functions to check state
125246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
125346035553Spatrick    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
125446035553Spatrick
125546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
125646035553Spatrick    void wait() const {__state_->wait();}
125746035553Spatrick    template <class _Rep, class _Period>
125846035553Spatrick        _LIBCPP_INLINE_VISIBILITY
125946035553Spatrick        future_status
126046035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
126146035553Spatrick            {return __state_->wait_for(__rel_time);}
126246035553Spatrick    template <class _Clock, class _Duration>
126346035553Spatrick        _LIBCPP_INLINE_VISIBILITY
126446035553Spatrick        future_status
126546035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
126646035553Spatrick            {return __state_->wait_until(__abs_time);}
126746035553Spatrick};
126846035553Spatrick
126946035553Spatricktemplate <class _Rp>
127046035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
127146035553Spatrickvoid
127246035553Spatrickswap(future<_Rp>& __x, future<_Rp>& __y) _NOEXCEPT
127346035553Spatrick{
127446035553Spatrick    __x.swap(__y);
127546035553Spatrick}
127646035553Spatrick
127746035553Spatrick// promise<R>
127846035553Spatrick
127946035553Spatricktemplate <class _Callable> class packaged_task;
128046035553Spatrick
128146035553Spatricktemplate <class _Rp>
128246035553Spatrickclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise
128346035553Spatrick{
128446035553Spatrick    __assoc_state<_Rp>* __state_;
128546035553Spatrick
128646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
128746035553Spatrick    explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
128846035553Spatrick
128946035553Spatrick    template <class> friend class packaged_task;
129046035553Spatrickpublic:
129146035553Spatrick    promise();
129246035553Spatrick    template <class _Alloc>
129346035553Spatrick        promise(allocator_arg_t, const _Alloc& __a);
129446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
129546035553Spatrick    promise(promise&& __rhs) _NOEXCEPT
129646035553Spatrick        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
129746035553Spatrick    promise(const promise& __rhs) = delete;
129846035553Spatrick    ~promise();
129946035553Spatrick
130046035553Spatrick    // assignment
130146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
130246035553Spatrick    promise& operator=(promise&& __rhs) _NOEXCEPT
130346035553Spatrick        {
130476d0caaeSpatrick            promise(_VSTD::move(__rhs)).swap(*this);
130546035553Spatrick            return *this;
130646035553Spatrick        }
130746035553Spatrick    promise& operator=(const promise& __rhs) = delete;
130876d0caaeSpatrick
130946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
131046035553Spatrick    void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
131146035553Spatrick
131246035553Spatrick    // retrieving the result
131346035553Spatrick    future<_Rp> get_future();
131446035553Spatrick
131546035553Spatrick    // setting the result
131646035553Spatrick    void set_value(const _Rp& __r);
131746035553Spatrick    void set_value(_Rp&& __r);
131846035553Spatrick    void set_exception(exception_ptr __p);
131946035553Spatrick
132046035553Spatrick    // setting the result with deferred notification
132146035553Spatrick    void set_value_at_thread_exit(const _Rp& __r);
132246035553Spatrick    void set_value_at_thread_exit(_Rp&& __r);
132346035553Spatrick    void set_exception_at_thread_exit(exception_ptr __p);
132446035553Spatrick};
132546035553Spatrick
132646035553Spatricktemplate <class _Rp>
132746035553Spatrickpromise<_Rp>::promise()
132846035553Spatrick    : __state_(new __assoc_state<_Rp>)
132946035553Spatrick{
133046035553Spatrick}
133146035553Spatrick
133246035553Spatricktemplate <class _Rp>
133346035553Spatricktemplate <class _Alloc>
133446035553Spatrickpromise<_Rp>::promise(allocator_arg_t, const _Alloc& __a0)
133546035553Spatrick{
133646035553Spatrick    typedef __assoc_state_alloc<_Rp, _Alloc> _State;
133746035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
133846035553Spatrick    typedef __allocator_destructor<_A2> _D2;
133946035553Spatrick    _A2 __a(__a0);
134046035553Spatrick    unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
134176d0caaeSpatrick    ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0);
134246035553Spatrick    __state_ = _VSTD::addressof(*__hold.release());
134346035553Spatrick}
134446035553Spatrick
134546035553Spatricktemplate <class _Rp>
134646035553Spatrickpromise<_Rp>::~promise()
134746035553Spatrick{
134846035553Spatrick    if (__state_)
134946035553Spatrick    {
135046035553Spatrick        if (!__state_->__has_value() && __state_->use_count() > 1)
135146035553Spatrick            __state_->set_exception(make_exception_ptr(
135246035553Spatrick                      future_error(make_error_code(future_errc::broken_promise))
135346035553Spatrick                                                      ));
135446035553Spatrick        __state_->__release_shared();
135546035553Spatrick    }
135646035553Spatrick}
135746035553Spatrick
135846035553Spatricktemplate <class _Rp>
135946035553Spatrickfuture<_Rp>
136046035553Spatrickpromise<_Rp>::get_future()
136146035553Spatrick{
136246035553Spatrick    if (__state_ == nullptr)
136346035553Spatrick        __throw_future_error(future_errc::no_state);
136446035553Spatrick    return future<_Rp>(__state_);
136546035553Spatrick}
136646035553Spatrick
136746035553Spatricktemplate <class _Rp>
136846035553Spatrickvoid
136946035553Spatrickpromise<_Rp>::set_value(const _Rp& __r)
137046035553Spatrick{
137146035553Spatrick    if (__state_ == nullptr)
137246035553Spatrick        __throw_future_error(future_errc::no_state);
137346035553Spatrick    __state_->set_value(__r);
137446035553Spatrick}
137546035553Spatrick
137646035553Spatricktemplate <class _Rp>
137746035553Spatrickvoid
137846035553Spatrickpromise<_Rp>::set_value(_Rp&& __r)
137946035553Spatrick{
138046035553Spatrick    if (__state_ == nullptr)
138146035553Spatrick        __throw_future_error(future_errc::no_state);
138246035553Spatrick    __state_->set_value(_VSTD::move(__r));
138346035553Spatrick}
138446035553Spatrick
138546035553Spatricktemplate <class _Rp>
138646035553Spatrickvoid
138746035553Spatrickpromise<_Rp>::set_exception(exception_ptr __p)
138846035553Spatrick{
138946035553Spatrick    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
139046035553Spatrick    if (__state_ == nullptr)
139146035553Spatrick        __throw_future_error(future_errc::no_state);
139246035553Spatrick    __state_->set_exception(__p);
139346035553Spatrick}
139446035553Spatrick
139546035553Spatricktemplate <class _Rp>
139646035553Spatrickvoid
139746035553Spatrickpromise<_Rp>::set_value_at_thread_exit(const _Rp& __r)
139846035553Spatrick{
139946035553Spatrick    if (__state_ == nullptr)
140046035553Spatrick        __throw_future_error(future_errc::no_state);
140146035553Spatrick    __state_->set_value_at_thread_exit(__r);
140246035553Spatrick}
140346035553Spatrick
140446035553Spatricktemplate <class _Rp>
140546035553Spatrickvoid
140646035553Spatrickpromise<_Rp>::set_value_at_thread_exit(_Rp&& __r)
140746035553Spatrick{
140846035553Spatrick    if (__state_ == nullptr)
140946035553Spatrick        __throw_future_error(future_errc::no_state);
141046035553Spatrick    __state_->set_value_at_thread_exit(_VSTD::move(__r));
141146035553Spatrick}
141246035553Spatrick
141346035553Spatricktemplate <class _Rp>
141446035553Spatrickvoid
141546035553Spatrickpromise<_Rp>::set_exception_at_thread_exit(exception_ptr __p)
141646035553Spatrick{
141746035553Spatrick    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
141846035553Spatrick    if (__state_ == nullptr)
141946035553Spatrick        __throw_future_error(future_errc::no_state);
142046035553Spatrick    __state_->set_exception_at_thread_exit(__p);
142146035553Spatrick}
142246035553Spatrick
142346035553Spatrick// promise<R&>
142446035553Spatrick
142546035553Spatricktemplate <class _Rp>
142646035553Spatrickclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<_Rp&>
142746035553Spatrick{
142846035553Spatrick    __assoc_state<_Rp&>* __state_;
142946035553Spatrick
143046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
143146035553Spatrick    explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
143246035553Spatrick
143346035553Spatrick    template <class> friend class packaged_task;
143446035553Spatrick
143546035553Spatrickpublic:
143646035553Spatrick    promise();
143746035553Spatrick    template <class _Allocator>
143846035553Spatrick        promise(allocator_arg_t, const _Allocator& __a);
143946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
144046035553Spatrick    promise(promise&& __rhs) _NOEXCEPT
144146035553Spatrick        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
144246035553Spatrick    promise(const promise& __rhs) = delete;
144346035553Spatrick    ~promise();
144446035553Spatrick
144546035553Spatrick    // assignment
144646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
144746035553Spatrick    promise& operator=(promise&& __rhs) _NOEXCEPT
144846035553Spatrick        {
144976d0caaeSpatrick            promise(_VSTD::move(__rhs)).swap(*this);
145046035553Spatrick            return *this;
145146035553Spatrick        }
145246035553Spatrick    promise& operator=(const promise& __rhs) = delete;
145376d0caaeSpatrick
145446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
145546035553Spatrick    void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
145646035553Spatrick
145746035553Spatrick    // retrieving the result
145846035553Spatrick    future<_Rp&> get_future();
145946035553Spatrick
146046035553Spatrick    // setting the result
146146035553Spatrick    void set_value(_Rp& __r);
146246035553Spatrick    void set_exception(exception_ptr __p);
146346035553Spatrick
146446035553Spatrick    // setting the result with deferred notification
146546035553Spatrick    void set_value_at_thread_exit(_Rp&);
146646035553Spatrick    void set_exception_at_thread_exit(exception_ptr __p);
146746035553Spatrick};
146846035553Spatrick
146946035553Spatricktemplate <class _Rp>
147046035553Spatrickpromise<_Rp&>::promise()
147146035553Spatrick    : __state_(new __assoc_state<_Rp&>)
147246035553Spatrick{
147346035553Spatrick}
147446035553Spatrick
147546035553Spatricktemplate <class _Rp>
147646035553Spatricktemplate <class _Alloc>
147746035553Spatrickpromise<_Rp&>::promise(allocator_arg_t, const _Alloc& __a0)
147846035553Spatrick{
147946035553Spatrick    typedef __assoc_state_alloc<_Rp&, _Alloc> _State;
148046035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
148146035553Spatrick    typedef __allocator_destructor<_A2> _D2;
148246035553Spatrick    _A2 __a(__a0);
148346035553Spatrick    unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
148476d0caaeSpatrick    ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0);
148546035553Spatrick    __state_ = _VSTD::addressof(*__hold.release());
148646035553Spatrick}
148746035553Spatrick
148846035553Spatricktemplate <class _Rp>
148946035553Spatrickpromise<_Rp&>::~promise()
149046035553Spatrick{
149146035553Spatrick    if (__state_)
149246035553Spatrick    {
149346035553Spatrick        if (!__state_->__has_value() && __state_->use_count() > 1)
149446035553Spatrick            __state_->set_exception(make_exception_ptr(
149546035553Spatrick                      future_error(make_error_code(future_errc::broken_promise))
149646035553Spatrick                                                      ));
149746035553Spatrick        __state_->__release_shared();
149846035553Spatrick    }
149946035553Spatrick}
150046035553Spatrick
150146035553Spatricktemplate <class _Rp>
150246035553Spatrickfuture<_Rp&>
150346035553Spatrickpromise<_Rp&>::get_future()
150446035553Spatrick{
150546035553Spatrick    if (__state_ == nullptr)
150646035553Spatrick        __throw_future_error(future_errc::no_state);
150746035553Spatrick    return future<_Rp&>(__state_);
150846035553Spatrick}
150946035553Spatrick
151046035553Spatricktemplate <class _Rp>
151146035553Spatrickvoid
151246035553Spatrickpromise<_Rp&>::set_value(_Rp& __r)
151346035553Spatrick{
151446035553Spatrick    if (__state_ == nullptr)
151546035553Spatrick        __throw_future_error(future_errc::no_state);
151646035553Spatrick    __state_->set_value(__r);
151746035553Spatrick}
151846035553Spatrick
151946035553Spatricktemplate <class _Rp>
152046035553Spatrickvoid
152146035553Spatrickpromise<_Rp&>::set_exception(exception_ptr __p)
152246035553Spatrick{
152346035553Spatrick    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception: received nullptr" );
152446035553Spatrick    if (__state_ == nullptr)
152546035553Spatrick        __throw_future_error(future_errc::no_state);
152646035553Spatrick    __state_->set_exception(__p);
152746035553Spatrick}
152846035553Spatrick
152946035553Spatricktemplate <class _Rp>
153046035553Spatrickvoid
153146035553Spatrickpromise<_Rp&>::set_value_at_thread_exit(_Rp& __r)
153246035553Spatrick{
153346035553Spatrick    if (__state_ == nullptr)
153446035553Spatrick        __throw_future_error(future_errc::no_state);
153546035553Spatrick    __state_->set_value_at_thread_exit(__r);
153646035553Spatrick}
153746035553Spatrick
153846035553Spatricktemplate <class _Rp>
153946035553Spatrickvoid
154046035553Spatrickpromise<_Rp&>::set_exception_at_thread_exit(exception_ptr __p)
154146035553Spatrick{
154246035553Spatrick    _LIBCPP_ASSERT( __p != nullptr, "promise::set_exception_at_thread_exit: received nullptr" );
154346035553Spatrick    if (__state_ == nullptr)
154446035553Spatrick        __throw_future_error(future_errc::no_state);
154546035553Spatrick    __state_->set_exception_at_thread_exit(__p);
154646035553Spatrick}
154746035553Spatrick
154846035553Spatrick// promise<void>
154946035553Spatrick
155046035553Spatricktemplate <>
155146035553Spatrickclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE promise<void>
155246035553Spatrick{
155346035553Spatrick    __assoc_sub_state* __state_;
155446035553Spatrick
155546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
155646035553Spatrick    explicit promise(nullptr_t) _NOEXCEPT : __state_(nullptr) {}
155746035553Spatrick
155846035553Spatrick    template <class> friend class packaged_task;
155946035553Spatrick
156046035553Spatrickpublic:
156146035553Spatrick    promise();
156246035553Spatrick    template <class _Allocator>
156346035553Spatrick        _LIBCPP_METHOD_TEMPLATE_IMPLICIT_INSTANTIATION_VIS
156446035553Spatrick        promise(allocator_arg_t, const _Allocator& __a);
156546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
156646035553Spatrick    promise(promise&& __rhs) _NOEXCEPT
156746035553Spatrick        : __state_(__rhs.__state_) {__rhs.__state_ = nullptr;}
156846035553Spatrick    promise(const promise& __rhs) = delete;
156946035553Spatrick    ~promise();
157046035553Spatrick
157146035553Spatrick    // assignment
157246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
157346035553Spatrick    promise& operator=(promise&& __rhs) _NOEXCEPT
157446035553Spatrick        {
157576d0caaeSpatrick            promise(_VSTD::move(__rhs)).swap(*this);
157646035553Spatrick            return *this;
157746035553Spatrick        }
157846035553Spatrick    promise& operator=(const promise& __rhs) = delete;
157976d0caaeSpatrick
158046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
158146035553Spatrick    void swap(promise& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
158246035553Spatrick
158346035553Spatrick    // retrieving the result
158446035553Spatrick    future<void> get_future();
158546035553Spatrick
158646035553Spatrick    // setting the result
158746035553Spatrick    void set_value();
158846035553Spatrick    void set_exception(exception_ptr __p);
158946035553Spatrick
159046035553Spatrick    // setting the result with deferred notification
159146035553Spatrick    void set_value_at_thread_exit();
159246035553Spatrick    void set_exception_at_thread_exit(exception_ptr __p);
159346035553Spatrick};
159446035553Spatrick
159546035553Spatricktemplate <class _Alloc>
159646035553Spatrickpromise<void>::promise(allocator_arg_t, const _Alloc& __a0)
159746035553Spatrick{
159846035553Spatrick    typedef __assoc_sub_state_alloc<_Alloc> _State;
159946035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, _State>::type _A2;
160046035553Spatrick    typedef __allocator_destructor<_A2> _D2;
160146035553Spatrick    _A2 __a(__a0);
160246035553Spatrick    unique_ptr<_State, _D2> __hold(__a.allocate(1), _D2(__a, 1));
160376d0caaeSpatrick    ::new ((void*)_VSTD::addressof(*__hold.get())) _State(__a0);
160446035553Spatrick    __state_ = _VSTD::addressof(*__hold.release());
160546035553Spatrick}
160646035553Spatrick
160746035553Spatricktemplate <class _Rp>
160846035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
160946035553Spatrickvoid
161046035553Spatrickswap(promise<_Rp>& __x, promise<_Rp>& __y) _NOEXCEPT
161146035553Spatrick{
161246035553Spatrick    __x.swap(__y);
161346035553Spatrick}
161446035553Spatrick
161546035553Spatricktemplate <class _Rp, class _Alloc>
161646035553Spatrick    struct _LIBCPP_TEMPLATE_VIS uses_allocator<promise<_Rp>, _Alloc>
161746035553Spatrick        : public true_type {};
161846035553Spatrick
161946035553Spatrick// packaged_task
162046035553Spatrick
162146035553Spatricktemplate<class _Fp> class __packaged_task_base;
162246035553Spatrick
162346035553Spatricktemplate<class _Rp, class ..._ArgTypes>
162446035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_base<_Rp(_ArgTypes...)>
162546035553Spatrick{
162646035553Spatrick    __packaged_task_base(const __packaged_task_base&);
162746035553Spatrick    __packaged_task_base& operator=(const __packaged_task_base&);
162846035553Spatrickpublic:
162946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
163046035553Spatrick    __packaged_task_base() {}
1631*4bdff4beSrobert    _LIBCPP_HIDE_FROM_ABI_VIRTUAL
163246035553Spatrick    virtual ~__packaged_task_base() {}
163346035553Spatrick    virtual void __move_to(__packaged_task_base*) _NOEXCEPT = 0;
163446035553Spatrick    virtual void destroy() = 0;
163546035553Spatrick    virtual void destroy_deallocate() = 0;
163646035553Spatrick    virtual _Rp operator()(_ArgTypes&& ...) = 0;
163746035553Spatrick};
163846035553Spatrick
163946035553Spatricktemplate<class _FD, class _Alloc, class _FB> class __packaged_task_func;
164046035553Spatrick
164146035553Spatricktemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
164246035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>
164346035553Spatrick    : public  __packaged_task_base<_Rp(_ArgTypes...)>
164446035553Spatrick{
164546035553Spatrick    __compressed_pair<_Fp, _Alloc> __f_;
164646035553Spatrickpublic:
164746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
164846035553Spatrick    explicit __packaged_task_func(const _Fp& __f) : __f_(__f, __default_init_tag()) {}
164946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
165046035553Spatrick    explicit __packaged_task_func(_Fp&& __f) : __f_(_VSTD::move(__f), __default_init_tag()) {}
165146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
165246035553Spatrick    __packaged_task_func(const _Fp& __f, const _Alloc& __a)
165346035553Spatrick        : __f_(__f, __a) {}
165446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
165546035553Spatrick    __packaged_task_func(_Fp&& __f, const _Alloc& __a)
165646035553Spatrick        : __f_(_VSTD::move(__f), __a) {}
165746035553Spatrick    virtual void __move_to(__packaged_task_base<_Rp(_ArgTypes...)>*) _NOEXCEPT;
165846035553Spatrick    virtual void destroy();
165946035553Spatrick    virtual void destroy_deallocate();
166046035553Spatrick    virtual _Rp operator()(_ArgTypes&& ... __args);
166146035553Spatrick};
166246035553Spatrick
166346035553Spatricktemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
166446035553Spatrickvoid
166546035553Spatrick__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::__move_to(
166646035553Spatrick                              __packaged_task_base<_Rp(_ArgTypes...)>* __p) _NOEXCEPT
166746035553Spatrick{
166876d0caaeSpatrick    ::new ((void*)__p) __packaged_task_func(_VSTD::move(__f_.first()), _VSTD::move(__f_.second()));
166946035553Spatrick}
167046035553Spatrick
167146035553Spatricktemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
167246035553Spatrickvoid
167346035553Spatrick__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy()
167446035553Spatrick{
167546035553Spatrick    __f_.~__compressed_pair<_Fp, _Alloc>();
167646035553Spatrick}
167746035553Spatrick
167846035553Spatricktemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
167946035553Spatrickvoid
168046035553Spatrick__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::destroy_deallocate()
168146035553Spatrick{
168246035553Spatrick    typedef typename __allocator_traits_rebind<_Alloc, __packaged_task_func>::type _Ap;
168346035553Spatrick    typedef allocator_traits<_Ap> _ATraits;
168446035553Spatrick    typedef pointer_traits<typename _ATraits::pointer> _PTraits;
168546035553Spatrick    _Ap __a(__f_.second());
168646035553Spatrick    __f_.~__compressed_pair<_Fp, _Alloc>();
168746035553Spatrick    __a.deallocate(_PTraits::pointer_to(*this), 1);
168846035553Spatrick}
168946035553Spatrick
169046035553Spatricktemplate<class _Fp, class _Alloc, class _Rp, class ..._ArgTypes>
169146035553Spatrick_Rp
169246035553Spatrick__packaged_task_func<_Fp, _Alloc, _Rp(_ArgTypes...)>::operator()(_ArgTypes&& ... __arg)
169346035553Spatrick{
169476d0caaeSpatrick    return _VSTD::__invoke(__f_.first(), _VSTD::forward<_ArgTypes>(__arg)...);
169546035553Spatrick}
169646035553Spatrick
169746035553Spatricktemplate <class _Callable> class __packaged_task_function;
169846035553Spatrick
169946035553Spatricktemplate<class _Rp, class ..._ArgTypes>
170046035553Spatrickclass _LIBCPP_AVAILABILITY_FUTURE __packaged_task_function<_Rp(_ArgTypes...)>
170146035553Spatrick{
170246035553Spatrick    typedef __packaged_task_base<_Rp(_ArgTypes...)> __base;
170376d0caaeSpatrick
170476d0caaeSpatrick    _LIBCPP_INLINE_VISIBILITY _LIBCPP_NO_CFI
170576d0caaeSpatrick    __base* __get_buf() { return (__base*)&__buf_; }
170676d0caaeSpatrick
1707*4bdff4beSrobert    _LIBCPP_SUPPRESS_DEPRECATED_PUSH
170846035553Spatrick    typename aligned_storage<3*sizeof(void*)>::type __buf_;
1709*4bdff4beSrobert    _LIBCPP_SUPPRESS_DEPRECATED_POP
171046035553Spatrick    __base* __f_;
171146035553Spatrick
171246035553Spatrickpublic:
171346035553Spatrick    typedef _Rp result_type;
171446035553Spatrick
171546035553Spatrick    // construct/copy/destroy:
171646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
171746035553Spatrick    __packaged_task_function() _NOEXCEPT : __f_(nullptr) {}
171846035553Spatrick    template<class _Fp>
171946035553Spatrick      __packaged_task_function(_Fp&& __f);
172046035553Spatrick    template<class _Fp, class _Alloc>
172146035553Spatrick      __packaged_task_function(allocator_arg_t, const _Alloc& __a, _Fp&& __f);
172246035553Spatrick
172346035553Spatrick    __packaged_task_function(__packaged_task_function&&) _NOEXCEPT;
172446035553Spatrick    __packaged_task_function& operator=(__packaged_task_function&&) _NOEXCEPT;
172546035553Spatrick
172646035553Spatrick    __packaged_task_function(const __packaged_task_function&) =  delete;
172746035553Spatrick    __packaged_task_function& operator=(const __packaged_task_function&) =  delete;
172846035553Spatrick
172946035553Spatrick    ~__packaged_task_function();
173046035553Spatrick
173146035553Spatrick    void swap(__packaged_task_function&) _NOEXCEPT;
173246035553Spatrick
173346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
173446035553Spatrick    _Rp operator()(_ArgTypes...) const;
173546035553Spatrick};
173646035553Spatrick
173746035553Spatricktemplate<class _Rp, class ..._ArgTypes>
173846035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(__packaged_task_function&& __f) _NOEXCEPT
173946035553Spatrick{
174046035553Spatrick    if (__f.__f_ == nullptr)
174146035553Spatrick        __f_ = nullptr;
174276d0caaeSpatrick    else if (__f.__f_ == __f.__get_buf())
174346035553Spatrick    {
174476d0caaeSpatrick        __f.__f_->__move_to(__get_buf());
174546035553Spatrick        __f_ = (__base*)&__buf_;
174646035553Spatrick    }
174746035553Spatrick    else
174846035553Spatrick    {
174946035553Spatrick        __f_ = __f.__f_;
175046035553Spatrick        __f.__f_ = nullptr;
175146035553Spatrick    }
175246035553Spatrick}
175346035553Spatrick
175446035553Spatricktemplate<class _Rp, class ..._ArgTypes>
175546035553Spatricktemplate <class _Fp>
175646035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(_Fp&& __f)
175746035553Spatrick    : __f_(nullptr)
175846035553Spatrick{
1759*4bdff4beSrobert    typedef __libcpp_remove_reference_t<typename decay<_Fp>::type> _FR;
176046035553Spatrick    typedef __packaged_task_func<_FR, allocator<_FR>, _Rp(_ArgTypes...)> _FF;
176146035553Spatrick    if (sizeof(_FF) <= sizeof(__buf_))
176246035553Spatrick    {
176376d0caaeSpatrick        ::new ((void*)&__buf_) _FF(_VSTD::forward<_Fp>(__f));
176446035553Spatrick        __f_ = (__base*)&__buf_;
176546035553Spatrick    }
176646035553Spatrick    else
176746035553Spatrick    {
176846035553Spatrick        typedef allocator<_FF> _Ap;
176946035553Spatrick        _Ap __a;
177046035553Spatrick        typedef __allocator_destructor<_Ap> _Dp;
177146035553Spatrick        unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
177276d0caaeSpatrick        ::new ((void*)__hold.get()) _FF(_VSTD::forward<_Fp>(__f), allocator<_FR>(__a));
177346035553Spatrick        __f_ = __hold.release();
177446035553Spatrick    }
177546035553Spatrick}
177646035553Spatrick
177746035553Spatricktemplate<class _Rp, class ..._ArgTypes>
177846035553Spatricktemplate <class _Fp, class _Alloc>
177946035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::__packaged_task_function(
178046035553Spatrick                                  allocator_arg_t, const _Alloc& __a0, _Fp&& __f)
178146035553Spatrick    : __f_(nullptr)
178246035553Spatrick{
1783*4bdff4beSrobert    typedef __libcpp_remove_reference_t<typename decay<_Fp>::type> _FR;
178446035553Spatrick    typedef __packaged_task_func<_FR, _Alloc, _Rp(_ArgTypes...)> _FF;
178546035553Spatrick    if (sizeof(_FF) <= sizeof(__buf_))
178646035553Spatrick    {
178746035553Spatrick        __f_ = (__base*)&__buf_;
178876d0caaeSpatrick        ::new ((void*)__f_) _FF(_VSTD::forward<_Fp>(__f));
178946035553Spatrick    }
179046035553Spatrick    else
179146035553Spatrick    {
179246035553Spatrick        typedef typename __allocator_traits_rebind<_Alloc, _FF>::type _Ap;
179346035553Spatrick        _Ap __a(__a0);
179446035553Spatrick        typedef __allocator_destructor<_Ap> _Dp;
179546035553Spatrick        unique_ptr<__base, _Dp> __hold(__a.allocate(1), _Dp(__a, 1));
179676d0caaeSpatrick        ::new ((void*)_VSTD::addressof(*__hold.get()))
179746035553Spatrick            _FF(_VSTD::forward<_Fp>(__f), _Alloc(__a));
179846035553Spatrick        __f_ = _VSTD::addressof(*__hold.release());
179946035553Spatrick    }
180046035553Spatrick}
180146035553Spatrick
180246035553Spatricktemplate<class _Rp, class ..._ArgTypes>
180346035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>&
180446035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::operator=(__packaged_task_function&& __f) _NOEXCEPT
180546035553Spatrick{
180676d0caaeSpatrick    if (__f_ == __get_buf())
180746035553Spatrick        __f_->destroy();
180846035553Spatrick    else if (__f_)
180946035553Spatrick        __f_->destroy_deallocate();
181046035553Spatrick    __f_ = nullptr;
181146035553Spatrick    if (__f.__f_ == nullptr)
181246035553Spatrick        __f_ = nullptr;
181376d0caaeSpatrick    else if (__f.__f_ == __f.__get_buf())
181446035553Spatrick    {
181576d0caaeSpatrick        __f.__f_->__move_to(__get_buf());
181676d0caaeSpatrick        __f_ = __get_buf();
181746035553Spatrick    }
181846035553Spatrick    else
181946035553Spatrick    {
182046035553Spatrick        __f_ = __f.__f_;
182146035553Spatrick        __f.__f_ = nullptr;
182246035553Spatrick    }
182346035553Spatrick    return *this;
182446035553Spatrick}
182546035553Spatrick
182646035553Spatricktemplate<class _Rp, class ..._ArgTypes>
182746035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::~__packaged_task_function()
182846035553Spatrick{
182976d0caaeSpatrick    if (__f_ == __get_buf())
183046035553Spatrick        __f_->destroy();
183146035553Spatrick    else if (__f_)
183246035553Spatrick        __f_->destroy_deallocate();
183346035553Spatrick}
183446035553Spatrick
183546035553Spatricktemplate<class _Rp, class ..._ArgTypes>
183676d0caaeSpatrick_LIBCPP_NO_CFI
183746035553Spatrickvoid
183846035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::swap(__packaged_task_function& __f) _NOEXCEPT
183946035553Spatrick{
184046035553Spatrick    if (__f_ == (__base*)&__buf_ && __f.__f_ == (__base*)&__f.__buf_)
184146035553Spatrick    {
1842*4bdff4beSrobert        _LIBCPP_SUPPRESS_DEPRECATED_PUSH
184346035553Spatrick        typename aligned_storage<sizeof(__buf_)>::type __tempbuf;
1844*4bdff4beSrobert        _LIBCPP_SUPPRESS_DEPRECATED_POP
184546035553Spatrick        __base* __t = (__base*)&__tempbuf;
184646035553Spatrick        __f_->__move_to(__t);
184746035553Spatrick        __f_->destroy();
184846035553Spatrick        __f_ = nullptr;
184946035553Spatrick        __f.__f_->__move_to((__base*)&__buf_);
185046035553Spatrick        __f.__f_->destroy();
185146035553Spatrick        __f.__f_ = nullptr;
185246035553Spatrick        __f_ = (__base*)&__buf_;
185346035553Spatrick        __t->__move_to((__base*)&__f.__buf_);
185446035553Spatrick        __t->destroy();
185546035553Spatrick        __f.__f_ = (__base*)&__f.__buf_;
185646035553Spatrick    }
185746035553Spatrick    else if (__f_ == (__base*)&__buf_)
185846035553Spatrick    {
185946035553Spatrick        __f_->__move_to((__base*)&__f.__buf_);
186046035553Spatrick        __f_->destroy();
186146035553Spatrick        __f_ = __f.__f_;
186246035553Spatrick        __f.__f_ = (__base*)&__f.__buf_;
186346035553Spatrick    }
186446035553Spatrick    else if (__f.__f_ == (__base*)&__f.__buf_)
186546035553Spatrick    {
186646035553Spatrick        __f.__f_->__move_to((__base*)&__buf_);
186746035553Spatrick        __f.__f_->destroy();
186846035553Spatrick        __f.__f_ = __f_;
186946035553Spatrick        __f_ = (__base*)&__buf_;
187046035553Spatrick    }
187146035553Spatrick    else
187246035553Spatrick        _VSTD::swap(__f_, __f.__f_);
187346035553Spatrick}
187446035553Spatrick
187546035553Spatricktemplate<class _Rp, class ..._ArgTypes>
187646035553Spatrickinline
187746035553Spatrick_Rp
187846035553Spatrick__packaged_task_function<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __arg) const
187946035553Spatrick{
188046035553Spatrick    return (*__f_)(_VSTD::forward<_ArgTypes>(__arg)...);
188146035553Spatrick}
188246035553Spatrick
188346035553Spatricktemplate<class _Rp, class ..._ArgTypes>
188446035553Spatrickclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<_Rp(_ArgTypes...)>
188546035553Spatrick{
188646035553Spatrickpublic:
188746035553Spatrick    typedef _Rp result_type; // extension
188846035553Spatrick
188946035553Spatrickprivate:
189046035553Spatrick    __packaged_task_function<result_type(_ArgTypes...)> __f_;
189146035553Spatrick    promise<result_type>                                __p_;
189246035553Spatrick
189346035553Spatrickpublic:
189446035553Spatrick    // construction and destruction
189546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
189646035553Spatrick    packaged_task() _NOEXCEPT : __p_(nullptr) {}
189746035553Spatrick    template <class _Fp,
1898*4bdff4beSrobert              class = __enable_if_t<!is_same<__remove_cvref_t<_Fp>, packaged_task>::value> >
189946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
190046035553Spatrick        explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
190146035553Spatrick    template <class _Fp, class _Allocator,
1902*4bdff4beSrobert              class = __enable_if_t<!is_same<__remove_cvref_t<_Fp>, packaged_task>::value> >
190346035553Spatrick        _LIBCPP_INLINE_VISIBILITY
190446035553Spatrick        packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
190546035553Spatrick             : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
190646035553Spatrick               __p_(allocator_arg, __a) {}
190746035553Spatrick    // ~packaged_task() = default;
190846035553Spatrick
190946035553Spatrick    // no copy
191046035553Spatrick    packaged_task(const packaged_task&) = delete;
191146035553Spatrick    packaged_task& operator=(const packaged_task&) = delete;
191246035553Spatrick
191346035553Spatrick    // move support
191446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
191546035553Spatrick    packaged_task(packaged_task&& __other) _NOEXCEPT
191646035553Spatrick        : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
191746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
191846035553Spatrick    packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
191946035553Spatrick    {
192046035553Spatrick        __f_ = _VSTD::move(__other.__f_);
192146035553Spatrick        __p_ = _VSTD::move(__other.__p_);
192246035553Spatrick        return *this;
192346035553Spatrick    }
192446035553Spatrick    _LIBCPP_INLINE_VISIBILITY
192546035553Spatrick    void swap(packaged_task& __other) _NOEXCEPT
192646035553Spatrick    {
192746035553Spatrick        __f_.swap(__other.__f_);
192846035553Spatrick        __p_.swap(__other.__p_);
192946035553Spatrick    }
193046035553Spatrick
193146035553Spatrick    _LIBCPP_INLINE_VISIBILITY
193246035553Spatrick    bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
193346035553Spatrick
193446035553Spatrick    // result retrieval
193546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
193646035553Spatrick    future<result_type> get_future() {return __p_.get_future();}
193746035553Spatrick
193846035553Spatrick    // execution
193946035553Spatrick    void operator()(_ArgTypes... __args);
194046035553Spatrick    void make_ready_at_thread_exit(_ArgTypes... __args);
194146035553Spatrick
194246035553Spatrick    void reset();
194346035553Spatrick};
194446035553Spatrick
194546035553Spatricktemplate<class _Rp, class ..._ArgTypes>
194646035553Spatrickvoid
194746035553Spatrickpackaged_task<_Rp(_ArgTypes...)>::operator()(_ArgTypes... __args)
194846035553Spatrick{
194946035553Spatrick    if (__p_.__state_ == nullptr)
195046035553Spatrick        __throw_future_error(future_errc::no_state);
195146035553Spatrick    if (__p_.__state_->__has_value())
195246035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
195346035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
195446035553Spatrick    try
195546035553Spatrick    {
195646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
195746035553Spatrick        __p_.set_value(__f_(_VSTD::forward<_ArgTypes>(__args)...));
195846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
195946035553Spatrick    }
196046035553Spatrick    catch (...)
196146035553Spatrick    {
196246035553Spatrick        __p_.set_exception(current_exception());
196346035553Spatrick    }
196446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
196546035553Spatrick}
196646035553Spatrick
196746035553Spatricktemplate<class _Rp, class ..._ArgTypes>
196846035553Spatrickvoid
196946035553Spatrickpackaged_task<_Rp(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
197046035553Spatrick{
197146035553Spatrick    if (__p_.__state_ == nullptr)
197246035553Spatrick        __throw_future_error(future_errc::no_state);
197346035553Spatrick    if (__p_.__state_->__has_value())
197446035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
197546035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
197646035553Spatrick    try
197746035553Spatrick    {
197846035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
197946035553Spatrick        __p_.set_value_at_thread_exit(__f_(_VSTD::forward<_ArgTypes>(__args)...));
198046035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
198146035553Spatrick    }
198246035553Spatrick    catch (...)
198346035553Spatrick    {
198446035553Spatrick        __p_.set_exception_at_thread_exit(current_exception());
198546035553Spatrick    }
198646035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
198746035553Spatrick}
198846035553Spatrick
198946035553Spatricktemplate<class _Rp, class ..._ArgTypes>
199046035553Spatrickvoid
199146035553Spatrickpackaged_task<_Rp(_ArgTypes...)>::reset()
199246035553Spatrick{
199346035553Spatrick    if (!valid())
199446035553Spatrick        __throw_future_error(future_errc::no_state);
199546035553Spatrick    __p_ = promise<result_type>();
199646035553Spatrick}
199746035553Spatrick
199846035553Spatricktemplate<class ..._ArgTypes>
199946035553Spatrickclass _LIBCPP_TEMPLATE_VIS _LIBCPP_AVAILABILITY_FUTURE packaged_task<void(_ArgTypes...)>
200046035553Spatrick{
200146035553Spatrickpublic:
200246035553Spatrick    typedef void result_type; // extension
200346035553Spatrick
200446035553Spatrickprivate:
200546035553Spatrick    __packaged_task_function<result_type(_ArgTypes...)> __f_;
200646035553Spatrick    promise<result_type>                                __p_;
200746035553Spatrick
200846035553Spatrickpublic:
200946035553Spatrick    // construction and destruction
201046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
201146035553Spatrick    packaged_task() _NOEXCEPT : __p_(nullptr) {}
201246035553Spatrick    template <class _Fp,
2013*4bdff4beSrobert              class = __enable_if_t<!is_same<__remove_cvref_t<_Fp>, packaged_task>::value> >
201446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
201546035553Spatrick        explicit packaged_task(_Fp&& __f) : __f_(_VSTD::forward<_Fp>(__f)) {}
201646035553Spatrick    template <class _Fp, class _Allocator,
2017*4bdff4beSrobert              class = __enable_if_t<!is_same<__remove_cvref_t<_Fp>, packaged_task>::value> >
201846035553Spatrick        _LIBCPP_INLINE_VISIBILITY
201946035553Spatrick        packaged_task(allocator_arg_t, const _Allocator& __a, _Fp&& __f)
202046035553Spatrick             : __f_(allocator_arg, __a, _VSTD::forward<_Fp>(__f)),
202146035553Spatrick               __p_(allocator_arg, __a) {}
202246035553Spatrick    // ~packaged_task() = default;
202346035553Spatrick
202446035553Spatrick    // no copy
202546035553Spatrick    packaged_task(const packaged_task&) = delete;
202646035553Spatrick    packaged_task& operator=(const packaged_task&) = delete;
202746035553Spatrick
202846035553Spatrick    // move support
202946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
203046035553Spatrick    packaged_task(packaged_task&& __other) _NOEXCEPT
203146035553Spatrick        : __f_(_VSTD::move(__other.__f_)), __p_(_VSTD::move(__other.__p_)) {}
203246035553Spatrick    _LIBCPP_INLINE_VISIBILITY
203346035553Spatrick    packaged_task& operator=(packaged_task&& __other) _NOEXCEPT
203446035553Spatrick    {
203546035553Spatrick        __f_ = _VSTD::move(__other.__f_);
203646035553Spatrick        __p_ = _VSTD::move(__other.__p_);
203746035553Spatrick        return *this;
203846035553Spatrick    }
203946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
204046035553Spatrick    void swap(packaged_task& __other) _NOEXCEPT
204146035553Spatrick    {
204246035553Spatrick        __f_.swap(__other.__f_);
204346035553Spatrick        __p_.swap(__other.__p_);
204446035553Spatrick    }
204546035553Spatrick
204646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
204746035553Spatrick    bool valid() const _NOEXCEPT {return __p_.__state_ != nullptr;}
204846035553Spatrick
204946035553Spatrick    // result retrieval
205046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
205146035553Spatrick    future<result_type> get_future() {return __p_.get_future();}
205246035553Spatrick
205346035553Spatrick    // execution
205446035553Spatrick    void operator()(_ArgTypes... __args);
205546035553Spatrick    void make_ready_at_thread_exit(_ArgTypes... __args);
205646035553Spatrick
205746035553Spatrick    void reset();
205846035553Spatrick};
205946035553Spatrick
2060*4bdff4beSrobert#if _LIBCPP_STD_VER >= 17
2061*4bdff4beSrobert
2062*4bdff4beSroberttemplate <class _Rp, class... _Args>
2063*4bdff4beSrobertpackaged_task(_Rp(*)(_Args...)) -> packaged_task<_Rp(_Args...)>;
2064*4bdff4beSrobert
2065*4bdff4beSroberttemplate <class _Fp, class _Stripped = typename __strip_signature<decltype(&_Fp::operator())>::type>
2066*4bdff4beSrobertpackaged_task(_Fp) -> packaged_task<_Stripped>;
2067*4bdff4beSrobert
2068*4bdff4beSrobert#endif
2069*4bdff4beSrobert
207046035553Spatricktemplate<class ..._ArgTypes>
207146035553Spatrickvoid
207246035553Spatrickpackaged_task<void(_ArgTypes...)>::operator()(_ArgTypes... __args)
207346035553Spatrick{
207446035553Spatrick    if (__p_.__state_ == nullptr)
207546035553Spatrick        __throw_future_error(future_errc::no_state);
207646035553Spatrick    if (__p_.__state_->__has_value())
207746035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
207846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
207946035553Spatrick    try
208046035553Spatrick    {
208146035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
208246035553Spatrick        __f_(_VSTD::forward<_ArgTypes>(__args)...);
208346035553Spatrick        __p_.set_value();
208446035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
208546035553Spatrick    }
208646035553Spatrick    catch (...)
208746035553Spatrick    {
208846035553Spatrick        __p_.set_exception(current_exception());
208946035553Spatrick    }
209046035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
209146035553Spatrick}
209246035553Spatrick
209346035553Spatricktemplate<class ..._ArgTypes>
209446035553Spatrickvoid
209546035553Spatrickpackaged_task<void(_ArgTypes...)>::make_ready_at_thread_exit(_ArgTypes... __args)
209646035553Spatrick{
209746035553Spatrick    if (__p_.__state_ == nullptr)
209846035553Spatrick        __throw_future_error(future_errc::no_state);
209946035553Spatrick    if (__p_.__state_->__has_value())
210046035553Spatrick        __throw_future_error(future_errc::promise_already_satisfied);
210146035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
210246035553Spatrick    try
210346035553Spatrick    {
210446035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
210546035553Spatrick        __f_(_VSTD::forward<_ArgTypes>(__args)...);
210646035553Spatrick        __p_.set_value_at_thread_exit();
210746035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
210846035553Spatrick    }
210946035553Spatrick    catch (...)
211046035553Spatrick    {
211146035553Spatrick        __p_.set_exception_at_thread_exit(current_exception());
211246035553Spatrick    }
211346035553Spatrick#endif // _LIBCPP_NO_EXCEPTIONS
211446035553Spatrick}
211546035553Spatrick
211646035553Spatricktemplate<class ..._ArgTypes>
211746035553Spatrickvoid
211846035553Spatrickpackaged_task<void(_ArgTypes...)>::reset()
211946035553Spatrick{
212046035553Spatrick    if (!valid())
212146035553Spatrick        __throw_future_error(future_errc::no_state);
212246035553Spatrick    __p_ = promise<result_type>();
212346035553Spatrick}
212446035553Spatrick
212576d0caaeSpatricktemplate <class _Rp, class... _ArgTypes>
212646035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
212746035553Spatrickvoid
212876d0caaeSpatrickswap(packaged_task<_Rp(_ArgTypes...)>& __x, packaged_task<_Rp(_ArgTypes...)>& __y) _NOEXCEPT
212946035553Spatrick{
213046035553Spatrick    __x.swap(__y);
213146035553Spatrick}
213246035553Spatrick
213346035553Spatricktemplate <class _Callable, class _Alloc>
213446035553Spatrickstruct _LIBCPP_TEMPLATE_VIS uses_allocator<packaged_task<_Callable>, _Alloc>
213546035553Spatrick    : public true_type {};
213646035553Spatrick
213746035553Spatricktemplate <class _Rp, class _Fp>
213846035553Spatrick_LIBCPP_INLINE_VISIBILITY future<_Rp>
213946035553Spatrick__make_deferred_assoc_state(_Fp&& __f)
214046035553Spatrick{
214146035553Spatrick    unique_ptr<__deferred_assoc_state<_Rp, _Fp>, __release_shared_count>
214246035553Spatrick        __h(new __deferred_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
214346035553Spatrick    return future<_Rp>(__h.get());
214446035553Spatrick}
214546035553Spatrick
214646035553Spatricktemplate <class _Rp, class _Fp>
214746035553Spatrick_LIBCPP_INLINE_VISIBILITY future<_Rp>
214846035553Spatrick__make_async_assoc_state(_Fp&& __f)
214946035553Spatrick{
215046035553Spatrick    unique_ptr<__async_assoc_state<_Rp, _Fp>, __release_shared_count>
215146035553Spatrick        __h(new __async_assoc_state<_Rp, _Fp>(_VSTD::forward<_Fp>(__f)));
215246035553Spatrick    _VSTD::thread(&__async_assoc_state<_Rp, _Fp>::__execute, __h.get()).detach();
215346035553Spatrick    return future<_Rp>(__h.get());
215446035553Spatrick}
215546035553Spatrick
215676d0caaeSpatrick#ifndef _LIBCPP_CXX03_LANG
215776d0caaeSpatrick
215846035553Spatricktemplate <class _Fp, class... _Args>
215946035553Spatrickclass _LIBCPP_HIDDEN __async_func
216046035553Spatrick{
216146035553Spatrick    tuple<_Fp, _Args...> __f_;
216246035553Spatrick
216346035553Spatrickpublic:
216446035553Spatrick    typedef typename __invoke_of<_Fp, _Args...>::type _Rp;
216546035553Spatrick
216646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
216746035553Spatrick    explicit __async_func(_Fp&& __f, _Args&&... __args)
216846035553Spatrick        : __f_(_VSTD::move(__f), _VSTD::move(__args)...) {}
216946035553Spatrick
217046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
217146035553Spatrick    __async_func(__async_func&& __f) : __f_(_VSTD::move(__f.__f_)) {}
217246035553Spatrick
217346035553Spatrick    _Rp operator()()
217446035553Spatrick    {
217546035553Spatrick        typedef typename __make_tuple_indices<1+sizeof...(_Args), 1>::type _Index;
217646035553Spatrick        return __execute(_Index());
217746035553Spatrick    }
217846035553Spatrickprivate:
217946035553Spatrick    template <size_t ..._Indices>
218046035553Spatrick    _Rp
218146035553Spatrick    __execute(__tuple_indices<_Indices...>)
218246035553Spatrick    {
218376d0caaeSpatrick        return _VSTD::__invoke(_VSTD::move(_VSTD::get<0>(__f_)), _VSTD::move(_VSTD::get<_Indices>(__f_))...);
218446035553Spatrick    }
218546035553Spatrick};
218646035553Spatrick
218746035553Spatrickinline _LIBCPP_INLINE_VISIBILITY bool __does_policy_contain(launch __policy, launch __value )
218846035553Spatrick{ return (int(__policy) & int(__value)) != 0; }
218946035553Spatrick
219046035553Spatricktemplate <class _Fp, class... _Args>
2191*4bdff4beSrobert_LIBCPP_NODISCARD_AFTER_CXX17 _LIBCPP_HIDE_FROM_ABI
219246035553Spatrickfuture<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
219346035553Spatrickasync(launch __policy, _Fp&& __f, _Args&&... __args)
219446035553Spatrick{
219546035553Spatrick    typedef __async_func<typename decay<_Fp>::type, typename decay<_Args>::type...> _BF;
219646035553Spatrick    typedef typename _BF::_Rp _Rp;
219746035553Spatrick
219846035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
219946035553Spatrick    try
220046035553Spatrick    {
220146035553Spatrick#endif
220246035553Spatrick        if (__does_policy_contain(__policy, launch::async))
2203*4bdff4beSrobert        return _VSTD::__make_async_assoc_state<_Rp>(_BF(_LIBCPP_AUTO_CAST(_VSTD::forward<_Fp>(__f)),
2204*4bdff4beSrobert                                                        _LIBCPP_AUTO_CAST(_VSTD::forward<_Args>(__args))...));
220546035553Spatrick#ifndef _LIBCPP_NO_EXCEPTIONS
220646035553Spatrick    }
220746035553Spatrick    catch ( ... ) { if (__policy == launch::async) throw ; }
220846035553Spatrick#endif
220946035553Spatrick
221046035553Spatrick    if (__does_policy_contain(__policy, launch::deferred))
2211*4bdff4beSrobert        return _VSTD::__make_deferred_assoc_state<_Rp>(_BF(_LIBCPP_AUTO_CAST(_VSTD::forward<_Fp>(__f)),
2212*4bdff4beSrobert                                                           _LIBCPP_AUTO_CAST(_VSTD::forward<_Args>(__args))...));
221346035553Spatrick    return future<_Rp>{};
221446035553Spatrick}
221546035553Spatrick
221646035553Spatricktemplate <class _Fp, class... _Args>
221746035553Spatrick_LIBCPP_NODISCARD_AFTER_CXX17 inline _LIBCPP_INLINE_VISIBILITY
221846035553Spatrickfuture<typename __invoke_of<typename decay<_Fp>::type, typename decay<_Args>::type...>::type>
221946035553Spatrickasync(_Fp&& __f, _Args&&... __args)
222046035553Spatrick{
222146035553Spatrick    return _VSTD::async(launch::any, _VSTD::forward<_Fp>(__f),
222246035553Spatrick                                    _VSTD::forward<_Args>(__args)...);
222346035553Spatrick}
222446035553Spatrick
222576d0caaeSpatrick#endif // C++03
222646035553Spatrick
222746035553Spatrick// shared_future
222846035553Spatrick
222946035553Spatricktemplate <class _Rp>
223046035553Spatrickclass _LIBCPP_TEMPLATE_VIS shared_future
223146035553Spatrick{
223246035553Spatrick    __assoc_state<_Rp>* __state_;
223346035553Spatrick
223446035553Spatrickpublic:
223546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
223646035553Spatrick    shared_future() _NOEXCEPT : __state_(nullptr) {}
223746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
223846035553Spatrick    shared_future(const shared_future& __rhs)  _NOEXCEPT : __state_(__rhs.__state_)
223946035553Spatrick        {if (__state_) __state_->__add_shared();}
224046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
224146035553Spatrick    shared_future(future<_Rp>&& __f) _NOEXCEPT : __state_(__f.__state_)
224246035553Spatrick        {__f.__state_ = nullptr;}
224346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
224446035553Spatrick    shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
224546035553Spatrick        {__rhs.__state_ = nullptr;}
224646035553Spatrick    ~shared_future();
224746035553Spatrick    shared_future& operator=(const shared_future& __rhs) _NOEXCEPT;
224846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
224946035553Spatrick    shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
225046035553Spatrick        {
225176d0caaeSpatrick            shared_future(_VSTD::move(__rhs)).swap(*this);
225246035553Spatrick            return *this;
225346035553Spatrick        }
225446035553Spatrick
225546035553Spatrick    // retrieving the value
225646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
225746035553Spatrick    const _Rp& get() const {return __state_->copy();}
225846035553Spatrick
225946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
226046035553Spatrick    void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
226146035553Spatrick
226246035553Spatrick    // functions to check state
226346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
226446035553Spatrick    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
226546035553Spatrick
226646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
226746035553Spatrick    void wait() const {__state_->wait();}
226846035553Spatrick    template <class _Rep, class _Period>
226946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
227046035553Spatrick        future_status
227146035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
227246035553Spatrick            {return __state_->wait_for(__rel_time);}
227346035553Spatrick    template <class _Clock, class _Duration>
227446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
227546035553Spatrick        future_status
227646035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
227746035553Spatrick            {return __state_->wait_until(__abs_time);}
227846035553Spatrick};
227946035553Spatrick
228046035553Spatricktemplate <class _Rp>
228146035553Spatrickshared_future<_Rp>::~shared_future()
228246035553Spatrick{
228346035553Spatrick    if (__state_)
228446035553Spatrick        __state_->__release_shared();
228546035553Spatrick}
228646035553Spatrick
228746035553Spatricktemplate <class _Rp>
228846035553Spatrickshared_future<_Rp>&
228946035553Spatrickshared_future<_Rp>::operator=(const shared_future& __rhs) _NOEXCEPT
229046035553Spatrick{
229146035553Spatrick    if (__rhs.__state_)
229246035553Spatrick        __rhs.__state_->__add_shared();
229346035553Spatrick    if (__state_)
229446035553Spatrick        __state_->__release_shared();
229546035553Spatrick    __state_ = __rhs.__state_;
229646035553Spatrick    return *this;
229746035553Spatrick}
229846035553Spatrick
229946035553Spatricktemplate <class _Rp>
230046035553Spatrickclass _LIBCPP_TEMPLATE_VIS shared_future<_Rp&>
230146035553Spatrick{
230246035553Spatrick    __assoc_state<_Rp&>* __state_;
230346035553Spatrick
230446035553Spatrickpublic:
230546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
230646035553Spatrick    shared_future() _NOEXCEPT : __state_(nullptr) {}
230746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
230846035553Spatrick    shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
230946035553Spatrick        {if (__state_) __state_->__add_shared();}
231046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
231146035553Spatrick    shared_future(future<_Rp&>&& __f) _NOEXCEPT : __state_(__f.__state_)
231246035553Spatrick        {__f.__state_ = nullptr;}
231346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
231446035553Spatrick    shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
231546035553Spatrick        {__rhs.__state_ = nullptr;}
231646035553Spatrick    ~shared_future();
231746035553Spatrick    shared_future& operator=(const shared_future& __rhs);
231846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
231946035553Spatrick    shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
232046035553Spatrick        {
232176d0caaeSpatrick            shared_future(_VSTD::move(__rhs)).swap(*this);
232246035553Spatrick            return *this;
232346035553Spatrick        }
232446035553Spatrick
232546035553Spatrick    // retrieving the value
232646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
232746035553Spatrick    _Rp& get() const {return __state_->copy();}
232846035553Spatrick
232946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
233046035553Spatrick    void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
233146035553Spatrick
233246035553Spatrick    // functions to check state
233346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
233446035553Spatrick    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
233546035553Spatrick
233646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
233746035553Spatrick    void wait() const {__state_->wait();}
233846035553Spatrick    template <class _Rep, class _Period>
233946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
234046035553Spatrick        future_status
234146035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
234246035553Spatrick            {return __state_->wait_for(__rel_time);}
234346035553Spatrick    template <class _Clock, class _Duration>
234446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
234546035553Spatrick        future_status
234646035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
234746035553Spatrick            {return __state_->wait_until(__abs_time);}
234846035553Spatrick};
234946035553Spatrick
235046035553Spatricktemplate <class _Rp>
235146035553Spatrickshared_future<_Rp&>::~shared_future()
235246035553Spatrick{
235346035553Spatrick    if (__state_)
235446035553Spatrick        __state_->__release_shared();
235546035553Spatrick}
235646035553Spatrick
235746035553Spatricktemplate <class _Rp>
235846035553Spatrickshared_future<_Rp&>&
235946035553Spatrickshared_future<_Rp&>::operator=(const shared_future& __rhs)
236046035553Spatrick{
236146035553Spatrick    if (__rhs.__state_)
236246035553Spatrick        __rhs.__state_->__add_shared();
236346035553Spatrick    if (__state_)
236446035553Spatrick        __state_->__release_shared();
236546035553Spatrick    __state_ = __rhs.__state_;
236646035553Spatrick    return *this;
236746035553Spatrick}
236846035553Spatrick
236946035553Spatricktemplate <>
237046035553Spatrickclass _LIBCPP_TYPE_VIS _LIBCPP_AVAILABILITY_FUTURE shared_future<void>
237146035553Spatrick{
237246035553Spatrick    __assoc_sub_state* __state_;
237346035553Spatrick
237446035553Spatrickpublic:
237546035553Spatrick    _LIBCPP_INLINE_VISIBILITY
237646035553Spatrick    shared_future() _NOEXCEPT : __state_(nullptr) {}
237746035553Spatrick    _LIBCPP_INLINE_VISIBILITY
237846035553Spatrick    shared_future(const shared_future& __rhs) : __state_(__rhs.__state_)
237946035553Spatrick        {if (__state_) __state_->__add_shared();}
238046035553Spatrick    _LIBCPP_INLINE_VISIBILITY
238146035553Spatrick    shared_future(future<void>&& __f) _NOEXCEPT : __state_(__f.__state_)
238246035553Spatrick        {__f.__state_ = nullptr;}
238346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
238446035553Spatrick    shared_future(shared_future&& __rhs) _NOEXCEPT : __state_(__rhs.__state_)
238546035553Spatrick        {__rhs.__state_ = nullptr;}
238646035553Spatrick    ~shared_future();
238746035553Spatrick    shared_future& operator=(const shared_future& __rhs);
238846035553Spatrick    _LIBCPP_INLINE_VISIBILITY
238946035553Spatrick    shared_future& operator=(shared_future&& __rhs) _NOEXCEPT
239046035553Spatrick        {
239176d0caaeSpatrick            shared_future(_VSTD::move(__rhs)).swap(*this);
239246035553Spatrick            return *this;
239346035553Spatrick        }
239446035553Spatrick
239546035553Spatrick    // retrieving the value
239646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
239746035553Spatrick    void get() const {__state_->copy();}
239846035553Spatrick
239946035553Spatrick    _LIBCPP_INLINE_VISIBILITY
240046035553Spatrick    void swap(shared_future& __rhs) _NOEXCEPT {_VSTD::swap(__state_, __rhs.__state_);}
240146035553Spatrick
240246035553Spatrick    // functions to check state
240346035553Spatrick    _LIBCPP_INLINE_VISIBILITY
240446035553Spatrick    bool valid() const _NOEXCEPT {return __state_ != nullptr;}
240546035553Spatrick
240646035553Spatrick    _LIBCPP_INLINE_VISIBILITY
240746035553Spatrick    void wait() const {__state_->wait();}
240846035553Spatrick    template <class _Rep, class _Period>
240946035553Spatrick        _LIBCPP_INLINE_VISIBILITY
241046035553Spatrick        future_status
241146035553Spatrick        wait_for(const chrono::duration<_Rep, _Period>& __rel_time) const
241246035553Spatrick            {return __state_->wait_for(__rel_time);}
241346035553Spatrick    template <class _Clock, class _Duration>
241446035553Spatrick        _LIBCPP_INLINE_VISIBILITY
241546035553Spatrick        future_status
241646035553Spatrick        wait_until(const chrono::time_point<_Clock, _Duration>& __abs_time) const
241746035553Spatrick            {return __state_->wait_until(__abs_time);}
241846035553Spatrick};
241946035553Spatrick
242046035553Spatricktemplate <class _Rp>
242146035553Spatrickinline _LIBCPP_INLINE_VISIBILITY
242246035553Spatrickvoid
242346035553Spatrickswap(shared_future<_Rp>& __x, shared_future<_Rp>& __y) _NOEXCEPT
242446035553Spatrick{
242546035553Spatrick    __x.swap(__y);
242646035553Spatrick}
242746035553Spatrick
242846035553Spatricktemplate <class _Rp>
242946035553Spatrickinline
243046035553Spatrickshared_future<_Rp>
243146035553Spatrickfuture<_Rp>::share() _NOEXCEPT
243246035553Spatrick{
243346035553Spatrick    return shared_future<_Rp>(_VSTD::move(*this));
243446035553Spatrick}
243546035553Spatrick
243646035553Spatricktemplate <class _Rp>
243746035553Spatrickinline
243846035553Spatrickshared_future<_Rp&>
243946035553Spatrickfuture<_Rp&>::share() _NOEXCEPT
244046035553Spatrick{
244146035553Spatrick    return shared_future<_Rp&>(_VSTD::move(*this));
244246035553Spatrick}
244346035553Spatrick
244446035553Spatrickinline
244546035553Spatrickshared_future<void>
244646035553Spatrickfuture<void>::share() _NOEXCEPT
244746035553Spatrick{
244846035553Spatrick    return shared_future<void>(_VSTD::move(*this));
244946035553Spatrick}
245046035553Spatrick
245146035553Spatrick_LIBCPP_END_NAMESPACE_STD
245246035553Spatrick
2453*4bdff4beSrobert#if !defined(_LIBCPP_REMOVE_TRANSITIVE_INCLUDES) && _LIBCPP_STD_VER <= 17
2454*4bdff4beSrobert#  include <chrono>
2455*4bdff4beSrobert#endif
245646035553Spatrick
245746035553Spatrick#endif // _LIBCPP_FUTURE
2458