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