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

// fidl_experiment = output_index_json

#pragma once

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding1ByteEnd> {
  using type = ::test_padding::Padding1ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding1ByteEnd> {
  using type = ::test_padding::wire::Padding1ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding2ByteEnd> {
  using type = ::test_padding::Padding2ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding2ByteEnd> {
  using type = ::test_padding::wire::Padding2ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding3ByteEnd> {
  using type = ::test_padding::Padding3ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding3ByteEnd> {
  using type = ::test_padding::wire::Padding3ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding4ByteEnd> {
  using type = ::test_padding::Padding4ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding4ByteEnd> {
  using type = ::test_padding::wire::Padding4ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding5ByteEnd> {
  using type = ::test_padding::Padding5ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding5ByteEnd> {
  using type = ::test_padding::wire::Padding5ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding6ByteEnd> {
  using type = ::test_padding::Padding6ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding6ByteEnd> {
  using type = ::test_padding::wire::Padding6ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding7ByteEnd> {
  using type = ::test_padding::Padding7ByteEnd;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding7ByteEnd> {
  using type = ::test_padding::wire::Padding7ByteEnd;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding1ByteMiddle> {
  using type = ::test_padding::Padding1ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding1ByteMiddle> {
  using type = ::test_padding::wire::Padding1ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding2ByteMiddle> {
  using type = ::test_padding::Padding2ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding2ByteMiddle> {
  using type = ::test_padding::wire::Padding2ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding3ByteMiddle> {
  using type = ::test_padding::Padding3ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding3ByteMiddle> {
  using type = ::test_padding::wire::Padding3ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding4ByteMiddle> {
  using type = ::test_padding::Padding4ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding4ByteMiddle> {
  using type = ::test_padding::wire::Padding4ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding5ByteMiddle> {
  using type = ::test_padding::Padding5ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding5ByteMiddle> {
  using type = ::test_padding::wire::Padding5ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding6ByteMiddle> {
  using type = ::test_padding::Padding6ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding6ByteMiddle> {
  using type = ::test_padding::wire::Padding6ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding7ByteMiddle> {
  using type = ::test_padding::Padding7ByteMiddle;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding7ByteMiddle> {
  using type = ::test_padding::wire::Padding7ByteMiddle;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding4ByteAlignmentLength12> {
  using type = ::test_padding::Padding4ByteAlignmentLength12;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding4ByteAlignmentLength12> {
  using type = ::test_padding::wire::Padding4ByteAlignmentLength12;
};

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

template <>
struct NaturalTypeForWireType<::test_padding::wire::Padding2ByteAlignmentLength6> {
  using type = ::test_padding::Padding2ByteAlignmentLength6;
};
template <>
struct WireTypeForNaturalType<::test_padding::Padding2ByteAlignmentLength6> {
  using type = ::test_padding::wire::Padding2ByteAlignmentLength6;
};

#ifdef __Fuchsia__

#endif  // __Fuchsia__
#pragma clang diagnostic pop

}  // namespace internal
}  // namespace fidl
