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