28 template<
typename Receiver>
37 explicit Promise(
auto&, Receiver& receiver_) : receiver(receiver_) {}
41 auto operator new(
usize size)
noexcept ->
void* { return ::operator
new(
size, std::nothrow); }
43 void operator delete(
void* ptr,
usize size)
noexcept { ::operator
delete(ptr,
size); }
45 static auto get_return_object_on_allocation_failure() {
return Type {
AllocFailed {} }; }
48 auto yield_value(Fn&&
function)
noexcept {
52 auto await_ready()
noexcept ->
bool {
return false; }
57 return Awaiter { util::forward<Fn>(
function) };
61 set_error(util::move(receiver), util::move(error));
62 return noop_coroutine();
67 return noop_coroutine();
70 auto initial_suspend()
noexcept ->
SuspendAlways {
return {}; }
88 m_coroutine.destroy();
92 void set_receiver(Receiver&& receiver) { m_receiver = util::move(receiver); }
98 explicit Type(AllocFailed) {}
101 if (!self.m_coroutine) {
105 self.m_coroutine.resume();
114 template<
typename Receiver>
117 template<
typename Receiver>
120 template<
typename Awaitable,
typename Receiver,
typename Result = meta::AwaitResult<Awaitable, Promise<Receiver>>>
122 :
meta::TypeConstant<types::CompletionSignatures<SetValue(Result), SetError(vocab::Error), SetStopped()>> {};
124 template<
typename Awaitable,
typename Receiver,
typename Result>
130 template<concepts::Receiver Receiver, concepts::IsAwaitable<Promise<Receiver>> Awaitable>
132 auto operator()(Awaitable&& awaitable, Receiver receiver)
const {
133 auto result = impl(util::forward<Awaitable>(awaitable), util::move(receiver));
134 if (result.allocation_failed()) {
136 result.set_receiver(util::move(receiver));
142#pragma GCC diagnostic push
144#pragma GCC diagnostic ignored "-Wsubobject-linkage"
146 template<
typename Awaitable,
typename Receiver>
159 co_await util::move(awaitable);
164 auto&& value =
co_await util::move(awaitable);
166 set_value(util::move(receiver), util::forward<
decltype(value)>(value));
170#pragma GCC diagnostic pop
#define DI_ASSERT(...)
Definition assert_bool.h:7
Definition optional_forward_declaration.h:5
Definition receiver_of.h:25
Definition awaitable_sender.h:7
Definition connect_awaitable.h:27
constexpr auto connect_awaitable
Definition connect_awaitable.h:173
OperationState< Receiver >::promise_type Promise
Definition connect_awaitable.h:118
meta::Type< OperationStateT< Receiver > > OperationState
Definition connect_awaitable.h:115
constexpr auto set_error
Definition set_error.h:14
constexpr auto set_stopped
Definition set_stopped.h:14
constexpr auto get_env
Definition get_env.h:27
constexpr auto set_value
Definition set_value.h:14
constexpr auto invoke
Definition invoke.h:100
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
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
Definition set_stopped.h:6
Definition as_awaitable.h:86
Definition connect_awaitable.h:122
Definition connect_awaitable.h:129
auto operator()(Awaitable &&awaitable, Receiver receiver) const
Definition connect_awaitable.h:132
Definition connect_awaitable.h:30
friend void tag_invoke(types::Tag< start >, Type &self)
Definition connect_awaitable.h:100
auto allocation_failed() const -> bool
Definition connect_awaitable.h:94
~Type()
Definition connect_awaitable.h:86
Type(Type &&other)
Definition connect_awaitable.h:84
Promise promise_type
Definition connect_awaitable.h:82
void set_receiver(Receiver &&receiver)
Definition connect_awaitable.h:92
Definition connect_awaitable.h:29