// WARNING: This file is machine generated by fidlgen.

// fidl_experiment = output_index_json

#include <fidl/test.driverhandle/cpp/wire_types.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

#ifdef __Fuchsia__
void ::test_driverhandle::wire::ClientEndWrapper::_CloseHandles() {
  value.reset();
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__
void ::test_driverhandle::wire::ServerEndWrapper::_CloseHandles() {
  value.reset();
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__
void ::test_driverhandle::wire::HandlesInProtocolSendHandlesRequest::_CloseHandles() {
  t._CloseHandles();
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

bool ::fidl::WireTableFrame<::test_driverhandle::wire::T>::HasUnknownData() const {
  return false;
}

uint64_t fidl::WireTableFrame<::test_driverhandle::wire::T>::ComputeMaxOrdinal() const {
  uint64_t max_ordinal = 0;
  if (!zircon_handle_.has_data()) {
    max_ordinal = 1;
  }
  if (!fdf_handle_.has_data()) {
    max_ordinal = 2;
  }
  return max_ordinal;
}

bool ::test_driverhandle::wire::T::HasUnknownData() const {
  if (max_ordinal_ > 2) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

void ::test_driverhandle::wire::T::_CloseHandles() {
  if (has_zircon_handle()) {
    zircon_handle().reset();
  }
  if (has_fdf_handle()) {
    fdf_handle().reset();
  }
}

#endif  // __Fuchsia__

#pragma clang diagnostic pop
