-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathAwaitableDataProducingCoroutine.h
More file actions
64 lines (48 loc) · 1.54 KB
/
AwaitableDataProducingCoroutine.h
File metadata and controls
64 lines (48 loc) · 1.54 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#pragma once
#include <experimental\coroutine>
template<typename T>
class AwaitableDataProducingCoroutine
{
public:
struct promise_type
{
T m_value;
AwaitableDataProducingCoroutine get_return_object() {
return AwaitableDataProducingCoroutine(HandleType::from_promise(*this));
}
std::experimental::suspend_never initial_suspend() { return {}; }
std::experimental::suspend_always final_suspend() { return {}; }
void return_value(T value) {
m_value = value;
}
void unhandled_exception() {}
};
using HandleType = std::experimental::coroutine_handle<promise_type>;
HandleType m_coroutineHandle;
HandleType m_waitingCoroutine;
AwaitableDataProducingCoroutine(HandleType h)
: m_coroutineHandle(h) {
}
T get() {
if (!m_coroutineHandle.done()) {
m_coroutineHandle.resume();
}
else {
return m_coroutineHandle.promise().m_value;
}
}
bool await_ready() {
cout << "AwaitableDataProducingCoroutine::await_ready\n";
return m_coroutineHandle.done();
}
auto await_resume() {
cout << "AwaitableDataProducingCoroutine::await_resume\n";
const auto returnValue = m_coroutineHandle.promise().m_value;
return returnValue;
}
void await_suspend(coroutine_handle<> waitingCoroutine) {
cout << "AwaitableDataProducingCoroutine::await_suspend\n";
m_coroutineHandle.resume();
waitingCoroutine.resume();
}
};