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

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

namespace fidl {
namespace internal {

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::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::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::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::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::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::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::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::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::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::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::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::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::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;
};

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::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;
};

#ifdef __Fuchsia__

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