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

// fidl_experiment = output_index_json

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

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

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__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
