Struct Task< void >
Synopsis
#include <lib/inc/drogon/utils/coroutine.h>
template <>
struct [[nodiscard]] Task<void>
Description
No description yet.
Structures
promise_type |
Methods
await_ready | ||
await_suspend | ||
operator co_await overload | ||
operator= overload | ||
Task overload | ||
~Task |
Source
Lines 246-372 in lib/inc/drogon/utils/coroutine.h.
template <>
struct [[nodiscard]] Task<void>
{
struct promise_type;
using handle_type = std::coroutine_handle<promise_type>;
Task(handle_type handle) : coro_(handle)
{
}
Task(const Task &) = delete;
Task(Task && other)
{
coro_ = other.coro_;
other.coro_ = nullptr;
}
~Task()
{
if (coro_)
coro_.destroy();
}
Task &operator=(const Task &) = delete;
Task &operator=(Task &&other)
{
coro_ = other.coro_;
other.coro_ = nullptr;
return *this;
}
struct promise_type
{
Task<> get_return_object()
{
return Task<>{handle_type::from_promise(*this)};
}
std::suspend_always initial_suspend()
{
return {};
}
void return_void()
{
}
auto final_suspend() noexcept
{
return final_awaiter{};
}
void unhandled_exception()
{
exception_ = std::current_exception();
}
void result()
{
if (exception_ != nullptr)
std::rethrow_exception(exception_);
}
void setContinuation(std::coroutine_handle<> handle)
{
continuation_ = handle;
}
std::exception_ptr exception_;
std::coroutine_handle<> continuation_;
};
bool await_ready()
{
return coro_.done();
}
std::coroutine_handle<> await_suspend(std::coroutine_handle<> awaiting)
{
coro_.promise().setContinuation(awaiting);
return coro_;
}
auto operator co_await() const &noexcept
{
struct awaiter
{
public:
explicit awaiter(handle_type coro) : coro_(coro)
{
}
bool await_ready() noexcept
{
return !coro_ || coro_.done();
}
auto await_suspend(std::coroutine_handle<> handle) noexcept
{
coro_.promise().setContinuation(handle);
return coro_;
}
auto await_resume()
{
coro_.promise().result();
}
private:
handle_type coro_;
};
return awaiter(coro_);
}
auto operator co_await() const &&noexcept
{
struct awaiter
{
public:
explicit awaiter(handle_type coro) : coro_(coro)
{
}
bool await_ready() noexcept
{
return false;
}
auto await_suspend(std::coroutine_handle<> handle) noexcept
{
coro_.promise().setContinuation(handle);
return coro_;
}
void await_resume()
{
coro_.promise().result();
}
private:
handle_type coro_;
};
return awaiter(coro_);
}
handle_type coro_;
};