void set_done()

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