Dispatch Queue
Dispatch Queue / Thread Pool implementation for C++11 with built-in C++20 coroutine support
 
Loading...
Searching...
No Matches
promise.hpp
1#pragma once
2
3#ifdef __cpp_lib_coroutine
4
5#include <coroutine>
6
7#include "task.hpp"
8
9namespace dispatch_queue {
10
11namespace detail {
12
13template<typename T>
14class promise {
15public:
16 auto get_return_object() { return future; }
17 std::suspend_never initial_suspend() noexcept { return {}; }
18 std::suspend_always final_suspend() noexcept { return {}; }
19 void return_value(T&& value) {
20 future->set_value(std::move(value));
21 }
22 void unhandled_exception() {
23 future->set_exception(std::current_exception());
24 }
25
26private:
27 std::shared_ptr<detail::task_future<T>> future = detail::task_future<T>::create_pending();
28};
29
30
31template<>
32class promise<void> {
33public:
34 auto get_return_object() { return future; }
35 std::suspend_never initial_suspend() noexcept { return {}; }
36 std::suspend_always final_suspend() noexcept { return {}; }
37 void return_void() {
38 future->set_value();
39 }
40 void unhandled_exception() {
41 future->set_exception(std::current_exception());
42 }
43
44private:
45 std::shared_ptr<detail::task_future<void>> future = detail::task_future<void>::create_pending();
46};
47
48} // end namespace detail
49
50} // end namespace dispatch_queue
51
52template<typename T, typename... Args>
53struct std::coroutine_traits<dispatch_queue::task<T>, Args...> {
54 using promise_type = dispatch_queue::detail::promise<T>;
55};
56
57#endif
Definition promise.hpp:14