8#ifndef ADOBE_FUTURE_HPP
9#define ADOBE_FUTURE_HPP
28struct any_packaged_task_ {
30 any_packaged_task_() =
default;
33 any_packaged_task_(T&& task) : object_(new model_<T>(std::forward<T>(task))) {}
35 any_packaged_task_(any_packaged_task_&& x)
noexcept =
default;
36 any_packaged_task_& operator=(any_packaged_task_&& x)
noexcept =
default;
38 void operator()()
const {
44 virtual ~concept_t() {}
45 virtual void call() = 0;
49 struct model_ : concept_t {
50 model_(T&& task) : task_(std::move(task)) {}
51 void call()
override { task_(); }
56 std::unique_ptr<concept_t> object_;
59void async_(any_packaged_task_&&);
60void async_(
const std::chrono::steady_clock::time_point&, any_packaged_task_&&);
66template <
class F,
class... Args>
71 using packaged_t = packaged_task<result_t()>;
73 auto p = packaged_t(forward<F>(f), forward<Args>(args)...);
74 auto result = p.get_future();
76 detail::async_(move(p));
83template <
class Duration,
class F,
class... Args>
84auto async(
const std::chrono::time_point<std::chrono::steady_clock, Duration>& when, F&& f,
87 using namespace chrono;
90 using packaged_t = packaged_task<result_t()>;
92 auto p = packaged_t(forward<F>(f), forward<Args>(args)...);
93 auto result = p.get_future();
95 detail::async_(when, move(p));
105 using queue_t = std::list<T>;
106 using lock_t = std::lock_guard<std::mutex>;
116 tmp.push_back(move(x));
119 q_.splice(q_.end(), tmp);
133 tmp.splice(tmp.end(), q_, q_.begin());
137 out = move(tmp.back());
147 template <
typename P>
148 struct move_binder_ {
149 move_binder_(std::shared_ptr<task_queue_> q, P&& p) : q_(std::move(q)), p_(std::move(p)) {}
156 std::shared_ptr<task_queue_> q_;
160 static auto make_task_queue_() -> std::shared_ptr<task_queue_>;
161 void async_(detail::any_packaged_task_&&);
163 static void continue_(
const std::shared_ptr<task_queue_>&);
164 static void suspend_(
const std::shared_ptr<task_queue_>&);
165 static void resume_(
const std::shared_ptr<task_queue_>&);
167 std::shared_ptr<task_queue_> object_ = make_task_queue_();
170 template <
class F,
class... Args>
175 using packaged_t = packaged_task<result_t()>;
177 auto p = packaged_t(forward<F>(f), forward<Args>(args)...);
178 auto result = p.get_future();
180 async_(move_binder_<packaged_t>(object_, move(p)));
auto async(F &&f, Args &&... args) -> std::future< adobe::invoke_result_t< F, Args... > >
std::result_of_t< F(Args...)> invoke_result_t
auto async(F &&f, Args &&... args) -> std::future< typename adobe::invoke_result_t< F, Args... > >