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

// fidl_experiment = output_index_json

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

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

namespace fidl {
namespace internal {

::test_driveroneway::Payload WireNaturalConversionTraits<::test_driveroneway::wire::Payload, ::test_driveroneway::Payload>::ToNatural(::test_driveroneway::wire::Payload src) {
  return ::test_driveroneway::Payload(WireNaturalConversionTraits<uint32_t, uint32_t>::ToNatural(std::move(src.value)));
}
::test_driveroneway::wire::Payload WireNaturalConversionTraits<::test_driveroneway::wire::Payload, ::test_driveroneway::Payload>::ToWire(fidl::AnyArena& arena, ::test_driveroneway::Payload src) {
  return ::test_driveroneway::wire::Payload{
      .value = WireNaturalConversionTraits<uint32_t, uint32_t>::ToWire(arena, std::move(src.value())),
  };
}

::test_driveroneway::OneWaySendRequest WireNaturalConversionTraits<::test_driveroneway::wire::OneWaySendRequest, ::test_driveroneway::OneWaySendRequest>::ToNatural(::test_driveroneway::wire::OneWaySendRequest src) {
  return ::test_driveroneway::OneWaySendRequest(WireNaturalConversionTraits<::test_driveroneway::wire::Payload, ::test_driveroneway::Payload>::ToNatural(std::move(src.payload)));
}
::test_driveroneway::wire::OneWaySendRequest WireNaturalConversionTraits<::test_driveroneway::wire::OneWaySendRequest, ::test_driveroneway::OneWaySendRequest>::ToWire(fidl::AnyArena& arena, ::test_driveroneway::OneWaySendRequest src) {
  return ::test_driveroneway::wire::OneWaySendRequest{
      .payload = WireNaturalConversionTraits<::test_driveroneway::wire::Payload, ::test_driveroneway::Payload>::ToWire(arena, std::move(src.payload())),
  };
}

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
