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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_emptystruct::Empty WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToNatural(::test_emptystruct::wire::Empty src) {
  return ::test_emptystruct::Empty(WireNaturalConversionTraits<uint8_t, uint8_t>::ToNatural(std::move(src.__reserved)));
}
::test_emptystruct::wire::Empty WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToWire(fidl::AnyArena& arena, ::test_emptystruct::Empty src) {
  return ::test_emptystruct::wire::Empty{
      .__reserved = WireNaturalConversionTraits<uint8_t, uint8_t>::ToWire(arena, std::move(src.__reserved())),
  };
}

::test_emptystruct::EmptyProtocolSendRequest WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendRequest, ::test_emptystruct::EmptyProtocolSendRequest>::ToNatural(::test_emptystruct::wire::EmptyProtocolSendRequest src) {
  return ::test_emptystruct::EmptyProtocolSendRequest(WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToNatural(std::move(src.e)));
}
::test_emptystruct::wire::EmptyProtocolSendRequest WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendRequest, ::test_emptystruct::EmptyProtocolSendRequest>::ToWire(fidl::AnyArena& arena, ::test_emptystruct::EmptyProtocolSendRequest src) {
  return ::test_emptystruct::wire::EmptyProtocolSendRequest{
      .e = WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToWire(arena, std::move(src.e())),
  };
}

::test_emptystruct::EmptyProtocolReceiveRequest WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolReceiveRequest, ::test_emptystruct::EmptyProtocolReceiveRequest>::ToNatural(::test_emptystruct::wire::EmptyProtocolReceiveRequest src) {
  return ::test_emptystruct::EmptyProtocolReceiveRequest(WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToNatural(std::move(src.e)));
}
::test_emptystruct::wire::EmptyProtocolReceiveRequest WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolReceiveRequest, ::test_emptystruct::EmptyProtocolReceiveRequest>::ToWire(fidl::AnyArena& arena, ::test_emptystruct::EmptyProtocolReceiveRequest src) {
  return ::test_emptystruct::wire::EmptyProtocolReceiveRequest{
      .e = WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToWire(arena, std::move(src.e())),
  };
}

::test_emptystruct::EmptyProtocolSendAndReceiveRequest WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest, ::test_emptystruct::EmptyProtocolSendAndReceiveRequest>::ToNatural(::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest src) {
  return ::test_emptystruct::EmptyProtocolSendAndReceiveRequest(WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToNatural(std::move(src.e)));
}
::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest, ::test_emptystruct::EmptyProtocolSendAndReceiveRequest>::ToWire(fidl::AnyArena& arena, ::test_emptystruct::EmptyProtocolSendAndReceiveRequest src) {
  return ::test_emptystruct::wire::EmptyProtocolSendAndReceiveRequest{
      .e = WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToWire(arena, std::move(src.e())),
  };
}

::test_emptystruct::EmptyProtocolSendAndReceiveResponse WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse, ::test_emptystruct::EmptyProtocolSendAndReceiveResponse>::ToNatural(::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse src) {
  return ::test_emptystruct::EmptyProtocolSendAndReceiveResponse(WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToNatural(std::move(src.e)));
}
::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse, ::test_emptystruct::EmptyProtocolSendAndReceiveResponse>::ToWire(fidl::AnyArena& arena, ::test_emptystruct::EmptyProtocolSendAndReceiveResponse src) {
  return ::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse{
      .e = WireNaturalConversionTraits<::test_emptystruct::wire::Empty, ::test_emptystruct::Empty>::ToWire(arena, std::move(src.e())),
  };
}

#ifdef __Fuchsia__

::fidl::Response<::test_emptystruct::EmptyProtocol::SendAndReceive> WireNaturalConversionTraits<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::Response<::test_emptystruct::EmptyProtocol::SendAndReceive>>::ToNatural(::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive> src) {
  return ::fidl::Response<::test_emptystruct::EmptyProtocol::SendAndReceive>(
      WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse, ::test_emptystruct::EmptyProtocolSendAndReceiveResponse>::ToNatural(std::move(src)));
}
::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive> WireNaturalConversionTraits<::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>, ::fidl::Response<::test_emptystruct::EmptyProtocol::SendAndReceive>>::ToWire(fidl::AnyArena& arena, ::fidl::Response<::test_emptystruct::EmptyProtocol::SendAndReceive> src) {
  return ::fidl::WireResponse<::test_emptystruct::EmptyProtocol::SendAndReceive>(
      WireNaturalConversionTraits<::test_emptystruct::wire::EmptyProtocolSendAndReceiveResponse, ::test_emptystruct::EmptyProtocolSendAndReceiveResponse>::ToWire(arena, std::move(src)));
}

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
