in include/unifex/let_done.hpp [87:113]
void set_done() noexcept {
UNIFEX_ASSERT(op_ != nullptr);
auto op = op_; // preserve pointer value.
if constexpr (
is_nothrow_callable_v<Done> &&
is_nothrow_connectable_v<final_sender_t, final_receiver>) {
op->startedOp_ = 0;
unifex::deactivate_union_member(op->sourceOp_);
unifex::activate_union_member_with(op->finalOp_, [&] {
return unifex::connect(std::move(op->done_)(), final_receiver{op});
});
op->startedOp_ = 0 - 1;
unifex::start(op->finalOp_.get());
} else {
UNIFEX_TRY {
op->startedOp_ = 0;
unifex::deactivate_union_member(op->sourceOp_);
unifex::activate_union_member_with(op->finalOp_, [&] {
return unifex::connect(std::move(op->done_)(), final_receiver{op});
});
op->startedOp_ = 0 - 1;
unifex::start(op->finalOp_.get());
} UNIFEX_CATCH (...) {
unifex::set_error(std::move(op->receiver_), std::current_exception());
}
}
}