28 template<
typename T =
void>
33 template<
typename Self,
typename T>
38 auto operator new(
usize size)
noexcept ->
void* { return ::operator
new(
size, std::nothrow); }
39 void operator delete(
void* ptr,
usize size)
noexcept { ::operator
delete(ptr,
size); }
44 template<concepts::ConvertibleTo<T> U>
46 m_data.emplace(util::forward<U>(value));
58 m_data = util::move(error);
70 auto await_ready() noexcept ->
bool {
return false; }
72 template<
typename Promise>
76 auto was_error = !current.m_data.has_value();
87 void await_resume() noexcept {}
93 auto await_ready() noexcept ->
bool {
return false; }
95 template<
typename OtherPromise>
108 auto await_resume() ->
T {
110 auto& promise =
static_cast<PromiseBase&
>(coroutine.promise());
112 return *util::move(promise.m_data);
126 struct Promise : PromiseBase {
128 static auto get_return_object_on_allocation_failure()
noexcept ->
Lazy {
return Lazy {
AllocFailed {} }; }
133 using Awaiter = PromiseBase::Awaiter;
146 auto operator co_await() -> Awaiter {
148 return Awaiter {
nullptr };
150 auto& promise =
static_cast<PromiseBase&
>(m_handle.promise());
151 return Awaiter { ParentHandle::from_promise(promise) };
155 explicit Lazy(Handle handle) : m_handle(handle) {}
156 explicit Lazy(AllocFailed) {}
166template<concepts::Expected T,
typename Promise>
171template<concepts::Unexpected T,
typename Promise>
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition with_awaitable_senders.h:8
auto unhandled_error(Error error) -> CoroutineHandle<>
Definition with_awaitable_senders.h:39
auto unhandled_stopped() -> CoroutineHandle<>
Definition with_awaitable_senders.h:38
auto continuation() const -> CoroutineHandle<>
Definition with_awaitable_senders.h:37
~Lazy()
Definition lazy.h:140
Lazy(Lazy &&other)
Definition lazy.h:138
Promise promise_type
Definition lazy.h:136
void return_value(U &&value)
Definition lazy.h:45
auto initial_suspend() noexcept -> SuspendAlways
Definition lazy.h:41
void return_value(Stopped)
Definition lazy.h:61
void return_value(vocab::Unexpected< E > &&error)
Definition lazy.h:57
friend class Lazy
Definition lazy.h:67
auto final_suspend() noexcept
Definition lazy.h:42
void return_value(types::Void)
Definition lazy.h:49
void unhandled_exception()
Definition lazy.h:63
Definition unexpected.h:14
Definition operations.h:11
decltype(just_stopped()) Stopped
Definition just.h:90
constexpr auto just_error
Definition just.h:87
constexpr auto just_or_error
Definition just_or_error.h:86
constexpr as_awaitable_ns::Function as_awaitable
Definition as_awaitable.h:102
size_t usize
Definition integers.h:33
di::meta::Decay< decltype(T)> Tag
Definition tag_invoke.h:28
void unreachable()
Definition unreachable.h:4
Expected< T, Error > Result
Definition result.h:8
StatusCode< Erased< long > > Error
Definition error.h:8
Unexpected(E &&) -> Unexpected< meta::UnwrapRefDecay< E > >
Definition zstring_parser.h:9
constexpr tag_invoke_detail::TagInvokeFn tag_invoke
Definition tag_invoke.h:22
constexpr auto exchange(T &object, U &&new_value) -> T
Definition exchange.h:8
std::coroutine_handle< Promise > CoroutineHandle
Definition coroutine.h:164
constexpr auto size
Definition size.h:54
std::suspend_always SuspendAlways
Definition coroutine.h:169