11#ifdef TTG_HAVE_COROUTINE
12#include TTG_CXX_COROUTINE_HEADER
24 template <
typename Promise>
39 template <std::
size_t N>
50 std::atomic<bool> finished_ =
false;
69 inline bool ready()
const;
75 inline ttg::span<event*>
events();
129 for (std::size_t e = 0; e != nevents_; ++e)
130 if (!events_storage_[e]->finished())
return false;
137 ttg::span<event*>
events() {
return ttg::span(events_storage_.data(), nevents_); }
140 std::array<event*, MaxNumEvents> events_storage_;
141 std::size_t nevents_;
142 bool completed_ =
false;
144 template <std::
size_t N>
147 void reset_events() {
148 std::fill(events_storage_.begin(), events_storage_.begin() + nevents_,
nullptr);
152 template <std::
size_t N>
153 void set_events(
const std::array<event*, N>
events) {
155 std::copy(
events.begin(),
events.end(), events_storage_.begin());
168 template <std::
size_t N>
171 template <std::size_t... I>
172 constexpr bool await_ready(std::index_sequence<I...>)
const {
173 return (std::get<I>(events_)->finished() && ...);
177 template <
typename... Events>
186 pending_task_ = pending_task;
187 pending_task_.promise().set_events(events_);
192 pending_task_.promise().reset_events();
200 std::array<event*, N> events_;
205 template <
typename... Events>
217 namespace device::detail {
218 struct device_task_promise_type;
ttg::span< event * > events()
top-level TTG namespace contains runtime-neutral functionality
TTG_CXX_COROUTINE_NAMESPACE::suspend_always suspend_always
TTG_CXX_COROUTINE_NAMESPACE::suspend_never suspend_never
TTG_CXX_COROUTINE_NAMESPACE::coroutine_handle< Promise > coroutine_handle
@ ResumableTask
-> ttg::resumable_task
@ Invalid
not a coroutine, i.e. a standard task function, -> void
@ DeviceTask
-> ttg::device::Task
represents a generic one-time event
constexpr bool await_ready() const
constexpr resumable_task_events(Events &&... events)
void await_suspend(coroutine_handle< resumable_task_state > pending_task)
constexpr bool completed() const
resumable_task get_return_object()
resumable_task_state() noexcept=default
static constexpr std::size_t MaxNumEvents
constexpr bool ready() const
suspend_always final_suspend() noexcept
ttg::span< event * > events()
suspend_never initial_suspend() noexcept
coroutine_handle< resumable_task_state > handle_type
void unhandled_exception()
task that can be resumed after some events occur
resumable_task(base_type base)
ttg::coroutine_handle< resumable_task_state > base_type