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

#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>

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__
}  // namespace internal
}  // namespace fidl
