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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.versions/cpp/markers.h>
#include <fidl/test.versions/cpp/natural_types.h>
#include <fidl/test.versions/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.versions/cpp/natural_messaging.h>
#include <fidl/test.versions/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 NaturalTypeForWireType<::test_versions::wire::Bits> {
  using type = ::test_versions::Bits;
};
template <>
struct WireTypeForNaturalType<::test_versions::Bits> {
  using type = ::test_versions::wire::Bits;
};

template <>
struct NaturalTypeForWireType<::test_versions::wire::Enum> {
  using type = ::test_versions::Enum;
};
template <>
struct WireTypeForNaturalType<::test_versions::Enum> {
  using type = ::test_versions::wire::Enum;
};

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

template <>
struct NaturalTypeForWireType<::test_versions::wire::Struct> {
  using type = ::test_versions::Struct;
};
template <>
struct WireTypeForNaturalType<::test_versions::Struct> {
  using type = ::test_versions::wire::Struct;
};

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

template <>
struct NaturalTypeForWireType<::test_versions::wire::Table> {
  using type = ::test_versions::Table;
};
template <>
struct WireTypeForNaturalType<::test_versions::Table> {
  using type = ::test_versions::wire::Table;
};

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

template <>
struct WireNaturalConversionTraits<::fidl::WireOptional<::test_versions::wire::Union>, std::unique_ptr<::test_versions::Union>> {
  static std::unique_ptr<::test_versions::Union> ToNatural(::fidl::WireOptional<::test_versions::wire::Union> src);
  static ::fidl::WireOptional<::test_versions::wire::Union> ToWire(fidl::AnyArena& arena, std::unique_ptr<::test_versions::Union> src);
};

template <>
struct NaturalTypeForWireType<::test_versions::wire::Union> {
  using type = ::test_versions::Union;
};
template <>
struct WireTypeForNaturalType<::test_versions::Union> {
  using type = ::test_versions::wire::Union;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
