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

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

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::EmptyProtocolSendAndReceiveTopResponse
WireNaturalConversionTraits<
    ::test_emptystruct::wire::EmptyProtocolSendAndReceiveTopResponse,
    ::test_emptystruct::EmptyProtocolSendAndReceiveTopResponse>::
    ToNatural(
        ::test_emptystruct::wire::EmptyProtocolSendAndReceiveTopResponse src) {
  return ::test_emptystruct::EmptyProtocolSendAndReceiveTopResponse(
      WireNaturalConversionTraits<
          ::test_emptystruct::wire::Empty,
          ::test_emptystruct::Empty>::ToNatural(std::move(src.e)));
}
::test_emptystruct::wire::EmptyProtocolSendAndReceiveTopResponse
WireNaturalConversionTraits<
    ::test_emptystruct::wire::EmptyProtocolSendAndReceiveTopResponse,
    ::test_emptystruct::EmptyProtocolSendAndReceiveTopResponse>::
    ToWire(fidl::AnyArena& arena,
           ::test_emptystruct::EmptyProtocolSendAndReceiveTopResponse src) {
  return ::test_emptystruct::wire::EmptyProtocolSendAndReceiveTopResponse{
      .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::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())),
  };
}

#ifdef __Fuchsia__

::fidl::Request<::test_emptystruct::EmptyProtocol::Send>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_emptystruct::EmptyProtocol::Send>,
    ::fidl::Request<::test_emptystruct::EmptyProtocol::Send>>::
    ToNatural(
        ::fidl::WireRequest<::test_emptystruct::EmptyProtocol::Send> src) {
  return ::fidl::Request<::test_emptystruct::EmptyProtocol::Send>(
      WireNaturalConversionTraits<
          ::test_emptystruct::wire::EmptyProtocolSendRequest,
          ::test_emptystruct::EmptyProtocolSendRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireRequest<::test_emptystruct::EmptyProtocol::Send>
WireNaturalConversionTraits<
    ::fidl::WireRequest<::test_emptystruct::EmptyProtocol::Send>,
    ::fidl::Request<::test_emptystruct::EmptyProtocol::Send>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Request<::test_emptystruct::EmptyProtocol::Send> src) {
  return ::fidl::WireRequest<::test_emptystruct::EmptyProtocol::Send>(
      WireNaturalConversionTraits<
          ::test_emptystruct::wire::EmptyProtocolSendRequest,
          ::test_emptystruct::EmptyProtocolSendRequest>::ToWire(arena,
                                                                std::move(
                                                                    src)));
}

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

::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::EmptyProtocolSendAndReceiveTopResponse,
          ::test_emptystruct::EmptyProtocolSendAndReceiveTopResponse>::
          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::EmptyProtocolSendAndReceiveTopResponse,
          ::test_emptystruct::EmptyProtocolSendAndReceiveTopResponse>::
          ToWire(arena, std::move(src)));
}

::fidl::Event<::test_emptystruct::EmptyProtocol::Receive>
WireNaturalConversionTraits<
    ::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>,
    ::fidl::Event<::test_emptystruct::EmptyProtocol::Receive>>::
    ToNatural(
        ::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive> src) {
  return ::fidl::Event<::test_emptystruct::EmptyProtocol::Receive>(
      WireNaturalConversionTraits<
          ::test_emptystruct::wire::EmptyProtocolReceiveRequest,
          ::test_emptystruct::EmptyProtocolReceiveRequest>::
          ToNatural(std::move(src)));
}
::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>
WireNaturalConversionTraits<
    ::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>,
    ::fidl::Event<::test_emptystruct::EmptyProtocol::Receive>>::
    ToWire(fidl::AnyArena& arena,
           ::fidl::Event<::test_emptystruct::EmptyProtocol::Receive> src) {
  return ::fidl::WireEvent<::test_emptystruct::EmptyProtocol::Receive>(
      WireNaturalConversionTraits<
          ::test_emptystruct::wire::EmptyProtocolReceiveRequest,
          ::test_emptystruct::EmptyProtocolReceiveRequest>::ToWire(arena,
                                                                   std::move(
                                                                       src)));
}
#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
