void set_error()

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());
      }
    }
  }