Mercurial > hg > CbC > CbC_gcc
view gcc/testsuite/g++.dg/coroutines/ramp-return.h @ 152:2b5abeee2509
update gcc11
author | anatofuz |
---|---|
date | Mon, 25 May 2020 07:50:57 +0900 |
parents | |
children |
line wrap: on
line source
#include "coro.h" #include <exception> #include <vector> template <typename T> struct promise { T _value; coro::coroutine_handle<> _continuation = nullptr; struct final_awaitable { bool _has_continuation; final_awaitable(bool has_continuation) : _has_continuation(has_continuation) {} bool await_ready() const noexcept { return !_has_continuation; } template <typename Promise> coro::coroutine_handle<> await_suspend(coro::coroutine_handle<Promise> coro) noexcept { return coro.promise()._continuation; } void await_resume() noexcept {} }; auto get_return_object() noexcept { return coro::coroutine_handle<promise>::from_promise(*this); } auto initial_suspend() noexcept { return coro::suspend_always(); } auto final_suspend() noexcept { return final_awaitable(_continuation != nullptr); } void return_value(T value) { _value = value; } void unhandled_exception() { std::terminate(); } }; template <typename T> struct task { using promise_type = promise<T>; std::coroutine_handle<promise<T>> _handle; task (coro::coroutine_handle<promise<T>> handle) : _handle(handle) {} #if DELETE_COPY_CTOR task (const task &) = delete; // no copying #endif #if DELETE_MOVE_CTOR task(task&& t) noexcept : _handle(t._handle) { t._handle = nullptr; } #endif bool await_ready() noexcept { return _handle.done(); } std::coroutine_handle<> await_suspend(std::coroutine_handle<> handle) noexcept { _handle.promise()._continuation = handle; return _handle; } T await_resume() noexcept { return _handle.promise()._value; } };