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

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

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<
    ::test_arrays::wire::UnionSmallArray,
    std::unique_ptr<::test_arrays::UnionSmallArray>> {
  static std::unique_ptr<::test_arrays::UnionSmallArray> ToNatural(
      ::test_arrays::wire::UnionSmallArray src);
  static ::test_arrays::wire::UnionSmallArray ToWire(
      fidl::AnyArena& arena,
      std::unique_ptr<::test_arrays::UnionSmallArray> src);
};

template <>
struct NaturalTypeForWireType<::test_arrays::wire::UnionSmallArray> {
  using type = std::unique_ptr<::test_arrays::UnionSmallArray>;
};
template <>
struct WireTypeForNaturalType<::test_arrays::UnionSmallArray> {
  using type = ::test_arrays::wire::UnionSmallArray;
};
template <>
struct WireTypeForNaturalType<std::unique_ptr<::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<
    ::test_arrays::wire::UnionLargeArray,
    std::unique_ptr<::test_arrays::UnionLargeArray>> {
  static std::unique_ptr<::test_arrays::UnionLargeArray> ToNatural(
      ::test_arrays::wire::UnionLargeArray src);
  static ::test_arrays::wire::UnionLargeArray ToWire(
      fidl::AnyArena& arena,
      std::unique_ptr<::test_arrays::UnionLargeArray> src);
};

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

#ifdef __Fuchsia__

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