blob: 374cd710077afcbe9ae9de62e106c028d6d99dd0 [file] [log] [blame]
#ifdef __clang__
#include <experimental/coroutine>
namespace std {
using namespace std::experimental;
}
#else
#include <coroutine>
#endif
#include <optional>
struct future
{
using value_type = int;
struct promise_type;
using handle_type = std::coroutine_handle<promise_type>;
handle_type _coroutine;
future(handle_type h) : _coroutine{h} {}
~future() noexcept{
if (_coroutine) {
_coroutine.destroy();
}
}
value_type get() {
auto ptr = _coroutine.promise()._value;
return *ptr;
}
struct promise_type {
std::optional<value_type> _value = std::nullopt;
future get_return_object() {
return future{handle_type::from_promise(*this)};
}
void return_value(value_type val) {
_value = static_cast<value_type &&>(val);
}
auto initial_suspend() noexcept {
class awaiter {
std::optional<value_type> & value;
public:
explicit awaiter(std::optional<value_type> & val) noexcept : value{val} {}
bool await_ready() noexcept { return value.has_value(); }
void await_suspend(handle_type) noexcept { }
value_type & await_resume() noexcept { return *value; }
};
return awaiter{_value};
}
std::suspend_always final_suspend() noexcept {
return {};
}
//void return_void() {}
void unhandled_exception() {}
};
};
future create_future()
{ co_return 2021; }
int main()
{ auto f = create_future(); }