Skip to content

Commit 2bfff1a

Browse files
committed
Allow Task<TaskVoid> when using coroutines to not require co_returning a value
1 parent c1cae85 commit 2bfff1a

File tree

1 file changed

+25
-10
lines changed

1 file changed

+25
-10
lines changed

loader/include/Geode/utils/Task.hpp

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace geode {
1111
namespace geode_internal {
1212
template <class T, class P>
13-
struct TaskPromise;
13+
struct TaskPromiseBase;
1414

1515
template <class T, class P>
1616
struct TaskAwaiter;
@@ -162,7 +162,7 @@ namespace geode {
162162
friend class Task;
163163

164164
template <class, class>
165-
friend struct geode_internal::TaskPromise;
165+
friend struct geode_internal::TaskPromiseBase;
166166

167167
template <class, class>
168168
friend struct geode_internal::TaskAwaiter;
@@ -323,7 +323,7 @@ namespace geode {
323323
friend class Task;
324324

325325
template <class, class>
326-
friend struct geode_internal::TaskPromise;
326+
friend struct geode_internal::TaskPromiseBase;
327327

328328
template <class, class>
329329
friend struct geode_internal::TaskAwaiter;
@@ -951,20 +951,22 @@ namespace geode {
951951
// ```
952952

953953
namespace geode {
954+
struct TaskVoid {};
955+
954956
namespace geode_internal {
955957
template <class T, class P>
956-
struct TaskPromise {
958+
struct TaskPromiseBase {
957959
using MyTask = Task<T, P>;
958960
std::weak_ptr<typename MyTask::Handle> m_handle;
959961

960-
~TaskPromise() {
962+
~TaskPromiseBase() {
961963
// does nothing if its not pending
962964
MyTask::cancel(m_handle.lock());
963965
}
964966

965967
std::suspend_always initial_suspend() noexcept {
966968
queueInMainThread([this] {
967-
std::coroutine_handle<TaskPromise>::from_promise(*this).resume();
969+
std::coroutine_handle<TaskPromiseBase>::from_promise(*this).resume();
968970
});
969971
return {};
970972
}
@@ -978,15 +980,15 @@ namespace geode {
978980
return handle;
979981
}
980982

981-
void return_value(T x) {
982-
MyTask::finish(m_handle.lock(), std::move(x));
983-
}
984-
985983
std::suspend_never yield_value(P value) {
986984
MyTask::progress(m_handle.lock(), std::move(value));
987985
return {};
988986
}
989987

988+
void return_base(T value) {
989+
MyTask::finish(m_handle.lock(), std::move(value));
990+
}
991+
990992
bool isCancelled() {
991993
if (auto p = m_handle.lock()) {
992994
return p->is(MyTask::Status::Cancelled);
@@ -995,6 +997,19 @@ namespace geode {
995997
}
996998
};
997999

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+
9981013
template <class T, class P>
9991014
struct TaskAwaiter {
10001015
Task<T, P> task;

0 commit comments

Comments
 (0)