static void on_complete()

in include/unifex/win32/low_latency_iocp_context.hpp [501:531]


    static void on_complete(operation_base* op) noexcept {
      type& self = *static_cast<type*>(op);

      std::error_code ec;
      std::size_t totalBytesTransferred = self.get_result(ec);

      self.context.release_io_state(self.ioState);

      // Treat partial failure as a success case.
      // TODO: Should we be sending tuple of (bytesTransferred, ec) here
      // instead?
      if (!ec || totalBytesTransferred > 0) {
        if constexpr (is_nothrow_callable_v<
                          decltype(set_value),
                          Receiver,
                          std::size_t>) {
          unifex::set_value(std::move(self.receiver_), totalBytesTransferred);
        } else {
          UNIFEX_TRY {
            unifex::set_value(std::move(self.receiver_), totalBytesTransferred);
          } UNIFEX_CATCH (...) {
            unifex::set_error(
                std::move(self.receiver_), std::current_exception());
          }
        }
      } else if (ec == std::errc::operation_canceled) {
        unifex::set_done(std::move(self.receiver_));
      } else {
        unifex::set_error(std::move(self.receiver_), std::move(ec));
      }
    }