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