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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.arrays/cpp/markers.h>
#include <fidl/test.arrays/cpp/natural_types.h>
#include <fidl/test.arrays/cpp/wire_types.h>
#ifdef __Fuchsia__
#include <fidl/test.arrays/cpp/natural_messaging.h>
#include <fidl/test.arrays/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_arrays::wire::StructSmallArray, ::test_arrays::StructSmallArray> {
  static ::test_arrays::StructSmallArray ToNatural(::test_arrays::wire::StructSmallArray src);
  static ::test_arrays::wire::StructSmallArray ToWire(fidl::AnyArena& arena, ::test_arrays::StructSmallArray src);
};

template <>
struct NaturalTypeForWireType<::test_arrays::wire::StructSmallArray> {
  using type = ::test_arrays::StructSmallArray;
};
template <>
struct WireTypeForNaturalType<::test_arrays::StructSmallArray> {
  using type = ::test_arrays::wire::StructSmallArray;
};

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

template <>
struct NaturalTypeForWireType<::test_arrays::wire::StructLargeArray> {
  using type = ::test_arrays::StructLargeArray;
};
template <>
struct WireTypeForNaturalType<::test_arrays::StructLargeArray> {
  using type = ::test_arrays::wire::StructLargeArray;
};

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

template <>
struct NaturalTypeForWireType<::test_arrays::wire::TableSmallArray> {
  using type = ::test_arrays::TableSmallArray;
};
template <>
struct WireTypeForNaturalType<::test_arrays::TableSmallArray> {
  using type = ::test_arrays::wire::TableSmallArray;
};

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

template <>
struct NaturalTypeForWireType<::test_arrays::wire::TableLargeArray> {
  using type = ::test_arrays::TableLargeArray;
};
template <>
struct WireTypeForNaturalType<::test_arrays::TableLargeArray> {
  using type = ::test_arrays::wire::TableLargeArray;
};

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

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

template <>
struct NaturalTypeForWireType<::test_arrays::wire::UnionSmallArray> {
  using type = ::test_arrays::UnionSmallArray;
};
template <>
struct WireTypeForNaturalType<::test_arrays::UnionSmallArray> {
  using type = ::test_arrays::wire::UnionSmallArray;
};

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

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

template <>
struct NaturalTypeForWireType<::test_arrays::wire::UnionLargeArray> {
  using type = ::test_arrays::UnionLargeArray;
};
template <>
struct WireTypeForNaturalType<::test_arrays::UnionLargeArray> {
  using type = ::test_arrays::wire::UnionLargeArray;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
