The member impls-for<associate_t>::get-state
is initialized with a callable object equivalent to the following lambda:
[]<class Sndr, class Rcvr>(Sndr&& sndr, Rcvr& rcvr) noexcept(see below) {
auto [_, data] = std::forward<Sndr>(sndr);
auto dataParts = std::move(data).release();
using scope_tkn = decltype(dataParts->first);
using wrap_sender = decltype(dataParts->second);
using op_t = connect_result_t<wrap_sender, Rcvr>;
struct op_state {
bool associated = false;
union {
Rcvr* rcvr;
struct {
scope_tkn token;
op_t op;
} assoc;
};
explicit op_state(Rcvr& r) noexcept
: rcvr(addressof(r)) {}
explicit op_state(scope_tkn tkn, wrap_sender&& sndr, Rcvr& r) try
: associated(true),
assoc(tkn, connect(std::move(sndr), std::move(r))) {
}
catch (...) {
tkn.disassociate();
throw;
}
op_state(op_state&&) = delete;
~op_state() {
if (associated) {
assoc.op.~op_t();
assoc.token.disassociate();
assoc.token.~scope_tkn();
}
}
void run() noexcept {
if (associated)
start(assoc.op);
else
set_stopped(std::move(*rcvr));
}
};
if (dataParts)
return op_state{std::move(dataParts->first), std::move(dataParts->second), rcvr};
else
return op_state{rcvr};
}