in include/unifex/retry_when.hpp [183:216]
void set_error(Error error) noexcept {
UNIFEX_ASSERT(op_ != nullptr);
auto* const op = op_;
op->isSourceOpConstructed_ = false;
unifex::deactivate_union_member(op->sourceOp_);
using trigger_sender_t = std::invoke_result_t<Func&, Error>;
using trigger_receiver_t = trigger_receiver<Source, Func, Receiver, trigger_sender_t>;
using trigger_op_t = unifex::connect_result_t<trigger_sender_t, trigger_receiver_t>;
if constexpr (std::is_nothrow_invocable_v<Func&, Error> &&
is_nothrow_connectable_v<trigger_sender_t, trigger_receiver_t>) {
auto& triggerOp = unifex::activate_union_member_with<trigger_op_t>(
op->triggerOps_,
[&]() noexcept {
return unifex::connect(
std::invoke(op->func_, (Error&&)error), trigger_receiver_t{op});
});
unifex::start(triggerOp);
} else {
UNIFEX_TRY {
auto& triggerOp = unifex::activate_union_member_with<trigger_op_t>(
op->triggerOps_,
[&]() {
return unifex::connect(
std::invoke(op->func_, (Error&&)error), trigger_receiver_t{op});
});
unifex::start(triggerOp);
} UNIFEX_CATCH (...) {
unifex::set_error((Receiver&&)op->receiver_, std::current_exception());
}
}
}