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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.driveroneway/cpp/markers.h>
#include <fidl/test.driveroneway/cpp/natural_types.h>
#include <fidl/test.driveroneway/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.driveroneway/cpp/natural_messaging.h>
#include <fidl/test.driveroneway/cpp/wire_messaging.h>

#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

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

namespace fidl {
namespace internal {

template <>
struct WireNaturalConversionTraits<::test_driveroneway::wire::Payload, ::test_driveroneway::Payload> {
  static ::test_driveroneway::Payload ToNatural(::test_driveroneway::wire::Payload src);
  static ::test_driveroneway::wire::Payload ToWire(fidl::AnyArena& arena, ::test_driveroneway::Payload src);
};

template <>
struct NaturalTypeForWireType<::test_driveroneway::wire::Payload> {
  using type = ::test_driveroneway::Payload;
};
template <>
struct WireTypeForNaturalType<::test_driveroneway::Payload> {
  using type = ::test_driveroneway::wire::Payload;
};

template <>
struct WireNaturalConversionTraits<::test_driveroneway::wire::OneWaySendRequest, ::test_driveroneway::OneWaySendRequest> {
  static ::test_driveroneway::OneWaySendRequest ToNatural(::test_driveroneway::wire::OneWaySendRequest src);
  static ::test_driveroneway::wire::OneWaySendRequest ToWire(fidl::AnyArena& arena, ::test_driveroneway::OneWaySendRequest src);
};

template <>
struct NaturalTypeForWireType<::test_driveroneway::wire::OneWaySendRequest> {
  using type = ::test_driveroneway::OneWaySendRequest;
};
template <>
struct WireTypeForNaturalType<::test_driveroneway::OneWaySendRequest> {
  using type = ::test_driveroneway::wire::OneWaySendRequest;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
