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

#include <fidl/test/handles/llcpp/fidl.h>

#include <memory>

#ifdef __Fuchsia__
void ::fidl_test_handles::wire::Handles::_CloseHandles() {
  plain_handle.reset();
  bti_handle.reset();
  channel_handle.reset();
  clock_handle.reset();
  debuglog_handle.reset();
  event_handle.reset();
  eventpair_handle.reset();
  exception_handle.reset();
  fifo_handle.reset();
  guest_handle.reset();
  interrupt_handle.reset();
  iommu_handle.reset();
  job_handle.reset();
  pager_handle.reset();
  pcidevice_handle.reset();
  pmt_handle.reset();
  port_handle.reset();
  process_handle.reset();
  profile_handle.reset();
  resource_handle.reset();
  socket_handle.reset();
  suspendtoken_handle.reset();
  thread_handle.reset();
  timer_handle.reset();
  vcpu_handle.reset();
  vmar_handle.reset();
  vmo_handle.reset();
  rights_handle.reset();
  aliased_plain_handle_field.reset();
  aliased_subtype_handle_field.reset();
  aliased_rights_handle_field.reset();
  some_protocol.reset();
  request_some_protocol.reset();
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__
std::optional<::fidl::UnbindInfo> fidl::internal::WireClientImpl<
    ::fidl_test_handles::SomeProtocol>::DispatchEvent(fidl_incoming_msg_t*
                                                          msg) {
  FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
  return ::fidl::UnbindInfo{::fidl::UnbindInfo::kUnexpectedMessage,
                            ZX_ERR_NOT_SUPPORTED};
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

::fidl::DispatchResult fidl::internal::
    WireServerDispatcher<::fidl_test_handles::SomeProtocol>::TryDispatch(
        ::fidl::WireServer<::fidl_test_handles::SomeProtocol>* impl,
        fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return ::fidl::DispatchResult::kNotFound;
}

::fidl::DispatchResult fidl::internal::
    WireServerDispatcher<::fidl_test_handles::SomeProtocol>::Dispatch(
        ::fidl::WireServer<::fidl_test_handles::SomeProtocol>* impl,
        fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
  txn->InternalError(
      {::fidl::UnbindInfo::kUnexpectedMessage, ZX_ERR_NOT_SUPPORTED});
  return ::fidl::DispatchResult::kNotFound;
}
::fidl::DispatchResult
fidl::WireServer<::fidl_test_handles::SomeProtocol>::dispatch_message(
    fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return ::fidl::internal::WireServerDispatcher<
      ::fidl_test_handles::SomeProtocol>::Dispatch(this, msg, txn);
}

::fidl::DispatchResult
fidl::internal::WireDispatcher<::fidl_test_handles::SomeProtocol>::TryDispatch(
    ::fidl::WireInterface<::fidl_test_handles::SomeProtocol>* impl,
    fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return ::fidl::DispatchResult::kNotFound;
}

::fidl::DispatchResult
fidl::internal::WireDispatcher<::fidl_test_handles::SomeProtocol>::Dispatch(
    ::fidl::WireInterface<::fidl_test_handles::SomeProtocol>* impl,
    fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  FidlHandleInfoCloseMany(msg->handles, msg->num_handles);
  txn->InternalError(
      {::fidl::UnbindInfo::kUnexpectedMessage, ZX_ERR_NOT_SUPPORTED});
  return ::fidl::DispatchResult::kNotFound;
}
::fidl::DispatchResult
fidl::WireInterface<::fidl_test_handles::SomeProtocol>::dispatch_message(
    fidl_incoming_msg_t* msg, ::fidl::Transaction* txn) {
  return ::fidl::internal::WireDispatcher<
      ::fidl_test_handles::SomeProtocol>::Dispatch(this, msg, txn);
}
#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__
