10
10
namespace geode {
11
11
namespace geode_internal {
12
12
template <class T , class P >
13
- struct TaskPromise ;
13
+ struct TaskPromiseBase ;
14
14
15
15
template <class T , class P >
16
16
struct TaskAwaiter ;
@@ -162,7 +162,7 @@ namespace geode {
162
162
friend class Task ;
163
163
164
164
template <class , class >
165
- friend struct geode_internal ::TaskPromise ;
165
+ friend struct geode_internal ::TaskPromiseBase ;
166
166
167
167
template <class , class >
168
168
friend struct geode_internal ::TaskAwaiter;
@@ -323,7 +323,7 @@ namespace geode {
323
323
friend class Task ;
324
324
325
325
template <class , class >
326
- friend struct geode_internal ::TaskPromise ;
326
+ friend struct geode_internal ::TaskPromiseBase ;
327
327
328
328
template <class , class >
329
329
friend struct geode_internal ::TaskAwaiter;
@@ -951,20 +951,22 @@ namespace geode {
951
951
// ```
952
952
953
953
namespace geode {
954
+ struct TaskVoid {};
955
+
954
956
namespace geode_internal {
955
957
template <class T , class P >
956
- struct TaskPromise {
958
+ struct TaskPromiseBase {
957
959
using MyTask = Task<T, P>;
958
960
std::weak_ptr<typename MyTask::Handle> m_handle;
959
961
960
- ~TaskPromise () {
962
+ ~TaskPromiseBase () {
961
963
// does nothing if its not pending
962
964
MyTask::cancel (m_handle.lock ());
963
965
}
964
966
965
967
std::suspend_always initial_suspend () noexcept {
966
968
queueInMainThread ([this ] {
967
- std::coroutine_handle<TaskPromise >::from_promise (*this ).resume ();
969
+ std::coroutine_handle<TaskPromiseBase >::from_promise (*this ).resume ();
968
970
});
969
971
return {};
970
972
}
@@ -978,15 +980,15 @@ namespace geode {
978
980
return handle;
979
981
}
980
982
981
- void return_value (T x) {
982
- MyTask::finish (m_handle.lock (), std::move (x));
983
- }
984
-
985
983
std::suspend_never yield_value (P value) {
986
984
MyTask::progress (m_handle.lock (), std::move (value));
987
985
return {};
988
986
}
989
987
988
+ void return_base (T value) {
989
+ MyTask::finish (m_handle.lock (), std::move (value));
990
+ }
991
+
990
992
bool isCancelled () {
991
993
if (auto p = m_handle.lock ()) {
992
994
return p->is (MyTask::Status::Cancelled);
@@ -995,6 +997,19 @@ namespace geode {
995
997
}
996
998
};
997
999
1000
+ template <class T , class P >
1001
+ struct TaskPromise : public TaskPromiseBase <T, P> {
1002
+ void return_value (T value) {
1003
+ this ->return_base (value);
1004
+ }
1005
+ };
1006
+ template <class P >
1007
+ struct TaskPromise <TaskVoid, P> : public TaskPromiseBase<TaskVoid, P> {
1008
+ void return_void () {
1009
+ this ->return_base ({});
1010
+ }
1011
+ };
1012
+
998
1013
template <class T , class P >
999
1014
struct TaskAwaiter {
1000
1015
Task<T, P> task;
0 commit comments