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