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

// fidl_experiment = output_index_json

#include <fidl/test.handles/cpp/type_conversions.h>

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

namespace fidl {
namespace internal {

#ifdef __Fuchsia__

::test_handles::Handles WireNaturalConversionTraits<::test_handles::wire::Handles, ::test_handles::Handles>::ToNatural(::test_handles::wire::Handles src) {
  return ::test_handles::Handles{{
      .plain_handle = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToNatural(std::move(src.plain_handle)),
      .bti_handle = WireNaturalConversionTraits<::zx::bti, ::zx::bti>::ToNatural(std::move(src.bti_handle)),
      .channel_handle = WireNaturalConversionTraits<::zx::channel, ::zx::channel>::ToNatural(std::move(src.channel_handle)),
      .clock_handle = WireNaturalConversionTraits<::zx::clock, ::zx::clock>::ToNatural(std::move(src.clock_handle)),
      .debuglog_handle = WireNaturalConversionTraits<::zx::debuglog, ::zx::debuglog>::ToNatural(std::move(src.debuglog_handle)),
      .event_handle = WireNaturalConversionTraits<::zx::event, ::zx::event>::ToNatural(std::move(src.event_handle)),
      .eventpair_handle = WireNaturalConversionTraits<::zx::eventpair, ::zx::eventpair>::ToNatural(std::move(src.eventpair_handle)),
      .exception_handle = WireNaturalConversionTraits<::zx::exception, ::zx::exception>::ToNatural(std::move(src.exception_handle)),
      .fifo_handle = WireNaturalConversionTraits<::zx::fifo, ::zx::fifo>::ToNatural(std::move(src.fifo_handle)),
      .guest_handle = WireNaturalConversionTraits<::zx::guest, ::zx::guest>::ToNatural(std::move(src.guest_handle)),
      .interrupt_handle = WireNaturalConversionTraits<::zx::interrupt, ::zx::interrupt>::ToNatural(std::move(src.interrupt_handle)),
      .iommu_handle = WireNaturalConversionTraits<::zx::iommu, ::zx::iommu>::ToNatural(std::move(src.iommu_handle)),
      .job_handle = WireNaturalConversionTraits<::zx::job, ::zx::job>::ToNatural(std::move(src.job_handle)),
      .msi_handle = WireNaturalConversionTraits<::zx::msi, ::zx::msi>::ToNatural(std::move(src.msi_handle)),
      .pager_handle = WireNaturalConversionTraits<::zx::pager, ::zx::pager>::ToNatural(std::move(src.pager_handle)),
      .pmt_handle = WireNaturalConversionTraits<::zx::pmt, ::zx::pmt>::ToNatural(std::move(src.pmt_handle)),
      .port_handle = WireNaturalConversionTraits<::zx::port, ::zx::port>::ToNatural(std::move(src.port_handle)),
      .process_handle = WireNaturalConversionTraits<::zx::process, ::zx::process>::ToNatural(std::move(src.process_handle)),
      .profile_handle = WireNaturalConversionTraits<::zx::profile, ::zx::profile>::ToNatural(std::move(src.profile_handle)),
      .resource_handle = WireNaturalConversionTraits<::zx::resource, ::zx::resource>::ToNatural(std::move(src.resource_handle)),
      .socket_handle = WireNaturalConversionTraits<::zx::socket, ::zx::socket>::ToNatural(std::move(src.socket_handle)),
      .stream_handle = WireNaturalConversionTraits<::zx::stream, ::zx::stream>::ToNatural(std::move(src.stream_handle)),
      .suspendtoken_handle = WireNaturalConversionTraits<::zx::suspend_token, ::zx::suspend_token>::ToNatural(std::move(src.suspendtoken_handle)),
      .thread_handle = WireNaturalConversionTraits<::zx::thread, ::zx::thread>::ToNatural(std::move(src.thread_handle)),
      .timer_handle = WireNaturalConversionTraits<::zx::timer, ::zx::timer>::ToNatural(std::move(src.timer_handle)),
      .vcpu_handle = WireNaturalConversionTraits<::zx::vcpu, ::zx::vcpu>::ToNatural(std::move(src.vcpu_handle)),
      .vmar_handle = WireNaturalConversionTraits<::zx::vmar, ::zx::vmar>::ToNatural(std::move(src.vmar_handle)),
      .vmo_handle = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(std::move(src.vmo_handle)),
      .rights_handle = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(std::move(src.rights_handle)),
      .aliased_plain_handle_field = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToNatural(std::move(src.aliased_plain_handle_field)),
      .aliased_subtype_handle_field = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(std::move(src.aliased_subtype_handle_field)),
      .aliased_rights_handle_field = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToNatural(std::move(src.aliased_rights_handle_field)),
      .some_protocol = WireNaturalConversionTraits<::fidl::ClientEnd<::test_handles::SomeProtocol>, ::fidl::ClientEnd<::test_handles::SomeProtocol>>::ToNatural(std::move(src.some_protocol)),
      .request_some_protocol = WireNaturalConversionTraits<::fidl::ServerEnd<::test_handles::SomeProtocol>, ::fidl::ServerEnd<::test_handles::SomeProtocol>>::ToNatural(std::move(src.request_some_protocol)),
  }};
}
::test_handles::wire::Handles WireNaturalConversionTraits<::test_handles::wire::Handles, ::test_handles::Handles>::ToWire(fidl::AnyArena& arena, ::test_handles::Handles src) {
  return ::test_handles::wire::Handles{
      .plain_handle = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToWire(arena, std::move(src.plain_handle())),
      .bti_handle = WireNaturalConversionTraits<::zx::bti, ::zx::bti>::ToWire(arena, std::move(src.bti_handle())),
      .channel_handle = WireNaturalConversionTraits<::zx::channel, ::zx::channel>::ToWire(arena, std::move(src.channel_handle())),
      .clock_handle = WireNaturalConversionTraits<::zx::clock, ::zx::clock>::ToWire(arena, std::move(src.clock_handle())),
      .debuglog_handle = WireNaturalConversionTraits<::zx::debuglog, ::zx::debuglog>::ToWire(arena, std::move(src.debuglog_handle())),
      .event_handle = WireNaturalConversionTraits<::zx::event, ::zx::event>::ToWire(arena, std::move(src.event_handle())),
      .eventpair_handle = WireNaturalConversionTraits<::zx::eventpair, ::zx::eventpair>::ToWire(arena, std::move(src.eventpair_handle())),
      .exception_handle = WireNaturalConversionTraits<::zx::exception, ::zx::exception>::ToWire(arena, std::move(src.exception_handle())),
      .fifo_handle = WireNaturalConversionTraits<::zx::fifo, ::zx::fifo>::ToWire(arena, std::move(src.fifo_handle())),
      .guest_handle = WireNaturalConversionTraits<::zx::guest, ::zx::guest>::ToWire(arena, std::move(src.guest_handle())),
      .interrupt_handle = WireNaturalConversionTraits<::zx::interrupt, ::zx::interrupt>::ToWire(arena, std::move(src.interrupt_handle())),
      .iommu_handle = WireNaturalConversionTraits<::zx::iommu, ::zx::iommu>::ToWire(arena, std::move(src.iommu_handle())),
      .job_handle = WireNaturalConversionTraits<::zx::job, ::zx::job>::ToWire(arena, std::move(src.job_handle())),
      .msi_handle = WireNaturalConversionTraits<::zx::msi, ::zx::msi>::ToWire(arena, std::move(src.msi_handle())),
      .pager_handle = WireNaturalConversionTraits<::zx::pager, ::zx::pager>::ToWire(arena, std::move(src.pager_handle())),
      .pmt_handle = WireNaturalConversionTraits<::zx::pmt, ::zx::pmt>::ToWire(arena, std::move(src.pmt_handle())),
      .port_handle = WireNaturalConversionTraits<::zx::port, ::zx::port>::ToWire(arena, std::move(src.port_handle())),
      .process_handle = WireNaturalConversionTraits<::zx::process, ::zx::process>::ToWire(arena, std::move(src.process_handle())),
      .profile_handle = WireNaturalConversionTraits<::zx::profile, ::zx::profile>::ToWire(arena, std::move(src.profile_handle())),
      .resource_handle = WireNaturalConversionTraits<::zx::resource, ::zx::resource>::ToWire(arena, std::move(src.resource_handle())),
      .socket_handle = WireNaturalConversionTraits<::zx::socket, ::zx::socket>::ToWire(arena, std::move(src.socket_handle())),
      .stream_handle = WireNaturalConversionTraits<::zx::stream, ::zx::stream>::ToWire(arena, std::move(src.stream_handle())),
      .suspendtoken_handle = WireNaturalConversionTraits<::zx::suspend_token, ::zx::suspend_token>::ToWire(arena, std::move(src.suspendtoken_handle())),
      .thread_handle = WireNaturalConversionTraits<::zx::thread, ::zx::thread>::ToWire(arena, std::move(src.thread_handle())),
      .timer_handle = WireNaturalConversionTraits<::zx::timer, ::zx::timer>::ToWire(arena, std::move(src.timer_handle())),
      .vcpu_handle = WireNaturalConversionTraits<::zx::vcpu, ::zx::vcpu>::ToWire(arena, std::move(src.vcpu_handle())),
      .vmar_handle = WireNaturalConversionTraits<::zx::vmar, ::zx::vmar>::ToWire(arena, std::move(src.vmar_handle())),
      .vmo_handle = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(arena, std::move(src.vmo_handle())),
      .rights_handle = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(arena, std::move(src.rights_handle())),
      .aliased_plain_handle_field = WireNaturalConversionTraits<::zx::handle, ::zx::handle>::ToWire(arena, std::move(src.aliased_plain_handle_field())),
      .aliased_subtype_handle_field = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(arena, std::move(src.aliased_subtype_handle_field())),
      .aliased_rights_handle_field = WireNaturalConversionTraits<::zx::vmo, ::zx::vmo>::ToWire(arena, std::move(src.aliased_rights_handle_field())),
      .some_protocol = WireNaturalConversionTraits<::fidl::ClientEnd<::test_handles::SomeProtocol>, ::fidl::ClientEnd<::test_handles::SomeProtocol>>::ToWire(arena, std::move(src.some_protocol())),
      .request_some_protocol = WireNaturalConversionTraits<::fidl::ServerEnd<::test_handles::SomeProtocol>, ::fidl::ServerEnd<::test_handles::SomeProtocol>>::ToWire(arena, std::move(src.request_some_protocol())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

::test_handles::FdfHandles WireNaturalConversionTraits<::test_handles::wire::FdfHandles, ::test_handles::FdfHandles>::ToNatural(::test_handles::wire::FdfHandles src) {
  return ::test_handles::FdfHandles{{
      .fdf_channel_handle = WireNaturalConversionTraits<::fdf::Channel, ::fdf::Channel>::ToNatural(std::move(src.fdf_channel_handle)),
      .client_end_driver = WireNaturalConversionTraits<::fdf::ClientEnd<::test_handles::DriverProtocol>, ::fdf::ClientEnd<::test_handles::DriverProtocol>>::ToNatural(std::move(src.client_end_driver)),
      .server_end_driver = WireNaturalConversionTraits<::fdf::ServerEnd<::test_handles::DriverProtocol>, ::fdf::ServerEnd<::test_handles::DriverProtocol>>::ToNatural(std::move(src.server_end_driver)),
  }};
}
::test_handles::wire::FdfHandles WireNaturalConversionTraits<::test_handles::wire::FdfHandles, ::test_handles::FdfHandles>::ToWire(fidl::AnyArena& arena, ::test_handles::FdfHandles src) {
  return ::test_handles::wire::FdfHandles{
      .fdf_channel_handle = WireNaturalConversionTraits<::fdf::Channel, ::fdf::Channel>::ToWire(arena, std::move(src.fdf_channel_handle())),
      .client_end_driver = WireNaturalConversionTraits<::fdf::ClientEnd<::test_handles::DriverProtocol>, ::fdf::ClientEnd<::test_handles::DriverProtocol>>::ToWire(arena, std::move(src.client_end_driver())),
      .server_end_driver = WireNaturalConversionTraits<::fdf::ServerEnd<::test_handles::DriverProtocol>, ::fdf::ServerEnd<::test_handles::DriverProtocol>>::ToWire(arena, std::move(src.server_end_driver())),
  };
}

#endif  // __Fuchsia__

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
