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

#pragma once

#include <fidl/test.struct/cpp/markers.h>
#include <fidl/test.struct/cpp/natural_types.h>
#include <fidl/test.struct/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.struct/cpp/natural_messaging.h>
#include <fidl/test.struct/cpp/wire_messaging.h>
#endif  // __Fuchsia__
#include <lib/fidl/cpp/wire_natural_conversions.h>

namespace fidl {
namespace internal {

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

template <>
struct NaturalTypeForWireType<::test_struct::wire::Simple> {
  using type = ::test_struct::Simple;
};
template <>
struct WireTypeForNaturalType<::test_struct::Simple> {
  using type = ::test_struct::wire::Simple;
};

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

template <>
struct NaturalTypeForWireType<::test_struct::wire::BasicStruct> {
  using type = ::test_struct::BasicStruct;
};
template <>
struct WireTypeForNaturalType<::test_struct::BasicStruct> {
  using type = ::test_struct::wire::BasicStruct;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
}  // namespace internal
}  // namespace fidl
