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

// fidl_experiment = output_index_json

#pragma once

#include "lib/fidl/cpp/internal/header.h"

namespace test {
namespace padding {

//
// Domain objects declarations
//

class Padding1ByteEnd;

class Padding2ByteEnd;

class Padding3ByteEnd;

class Padding4ByteEnd;

class Padding5ByteEnd;

class Padding6ByteEnd;

class Padding7ByteEnd;

class Padding1ByteMiddle;

class Padding2ByteMiddle;

class Padding3ByteMiddle;

class Padding4ByteMiddle;

class Padding5ByteMiddle;

class Padding6ByteMiddle;

class Padding7ByteMiddle;

class Padding4ByteAlignmentLength12;

class Padding2ByteAlignmentLength6;

class Padding1ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint16_t a{};

  uint8_t b{};

  static inline ::std::unique_ptr<Padding1ByteEnd> New() { return ::std::make_unique<Padding1ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding1ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding1ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding1ByteEnd& _value,
                         ::test::padding::Padding1ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding1ByteEndPtr = ::std::unique_ptr<Padding1ByteEnd>;

class Padding2ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint32_t a{};

  uint16_t b{};

  static inline ::std::unique_ptr<Padding2ByteEnd> New() { return ::std::make_unique<Padding2ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding2ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding2ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding2ByteEnd& _value,
                         ::test::padding::Padding2ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding2ByteEndPtr = ::std::unique_ptr<Padding2ByteEnd>;

class Padding3ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint32_t a{};

  uint8_t b{};

  static inline ::std::unique_ptr<Padding3ByteEnd> New() { return ::std::make_unique<Padding3ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding3ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding3ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding3ByteEnd& _value,
                         ::test::padding::Padding3ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding3ByteEndPtr = ::std::unique_ptr<Padding3ByteEnd>;

class Padding4ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint64_t a{};

  uint32_t b{};

  static inline ::std::unique_ptr<Padding4ByteEnd> New() { return ::std::make_unique<Padding4ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding4ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding4ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding4ByteEnd& _value,
                         ::test::padding::Padding4ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding4ByteEndPtr = ::std::unique_ptr<Padding4ByteEnd>;

class Padding5ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint64_t a{};

  uint16_t b{};

  uint8_t c{};

  static inline ::std::unique_ptr<Padding5ByteEnd> New() { return ::std::make_unique<Padding5ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding5ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding5ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding5ByteEnd& _value,
                         ::test::padding::Padding5ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding5ByteEndPtr = ::std::unique_ptr<Padding5ByteEnd>;

class Padding6ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint64_t a{};

  uint16_t b{};

  static inline ::std::unique_ptr<Padding6ByteEnd> New() { return ::std::make_unique<Padding6ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding6ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding6ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding6ByteEnd& _value,
                         ::test::padding::Padding6ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding6ByteEndPtr = ::std::unique_ptr<Padding6ByteEnd>;

class Padding7ByteEnd final {
 public:
  static const fidl_type_t* FidlType;

  uint64_t a{};

  uint8_t b{};

  static inline ::std::unique_ptr<Padding7ByteEnd> New() { return ::std::make_unique<Padding7ByteEnd>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding7ByteEnd* value, size_t _offset);
  zx_status_t Clone(Padding7ByteEnd* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding7ByteEnd& _value,
                         ::test::padding::Padding7ByteEnd* _result) {
  return _value.Clone(_result);
}

using Padding7ByteEndPtr = ::std::unique_ptr<Padding7ByteEnd>;

class Padding1ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint8_t a{};

  uint16_t b{};

  static inline ::std::unique_ptr<Padding1ByteMiddle> New() { return ::std::make_unique<Padding1ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding1ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding1ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding1ByteMiddle& _value,
                         ::test::padding::Padding1ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding1ByteMiddlePtr = ::std::unique_ptr<Padding1ByteMiddle>;

class Padding2ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint16_t a{};

  uint32_t b{};

  static inline ::std::unique_ptr<Padding2ByteMiddle> New() { return ::std::make_unique<Padding2ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding2ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding2ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding2ByteMiddle& _value,
                         ::test::padding::Padding2ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding2ByteMiddlePtr = ::std::unique_ptr<Padding2ByteMiddle>;

class Padding3ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint8_t a{};

  uint32_t b{};

  static inline ::std::unique_ptr<Padding3ByteMiddle> New() { return ::std::make_unique<Padding3ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding3ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding3ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding3ByteMiddle& _value,
                         ::test::padding::Padding3ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding3ByteMiddlePtr = ::std::unique_ptr<Padding3ByteMiddle>;

class Padding4ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint32_t a{};

  uint64_t b{};

  static inline ::std::unique_ptr<Padding4ByteMiddle> New() { return ::std::make_unique<Padding4ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding4ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding4ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding4ByteMiddle& _value,
                         ::test::padding::Padding4ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding4ByteMiddlePtr = ::std::unique_ptr<Padding4ByteMiddle>;

class Padding5ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint16_t a{};

  uint8_t b{};

  uint64_t c{};

  static inline ::std::unique_ptr<Padding5ByteMiddle> New() { return ::std::make_unique<Padding5ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding5ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding5ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding5ByteMiddle& _value,
                         ::test::padding::Padding5ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding5ByteMiddlePtr = ::std::unique_ptr<Padding5ByteMiddle>;

class Padding6ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint16_t a{};

  uint64_t b{};

  static inline ::std::unique_ptr<Padding6ByteMiddle> New() { return ::std::make_unique<Padding6ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding6ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding6ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding6ByteMiddle& _value,
                         ::test::padding::Padding6ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding6ByteMiddlePtr = ::std::unique_ptr<Padding6ByteMiddle>;

class Padding7ByteMiddle final {
 public:
  static const fidl_type_t* FidlType;

  uint8_t a{};

  uint64_t b{};

  static inline ::std::unique_ptr<Padding7ByteMiddle> New() { return ::std::make_unique<Padding7ByteMiddle>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding7ByteMiddle* value, size_t _offset);
  zx_status_t Clone(Padding7ByteMiddle* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding7ByteMiddle& _value,
                         ::test::padding::Padding7ByteMiddle* _result) {
  return _value.Clone(_result);
}

using Padding7ByteMiddlePtr = ::std::unique_ptr<Padding7ByteMiddle>;

class Padding4ByteAlignmentLength12 final {
 public:
  static const fidl_type_t* FidlType;

  uint32_t a{};

  uint8_t b{};

  uint16_t c{};

  uint16_t d{};

  static inline ::std::unique_ptr<Padding4ByteAlignmentLength12> New() { return ::std::make_unique<Padding4ByteAlignmentLength12>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding4ByteAlignmentLength12* value, size_t _offset);
  zx_status_t Clone(Padding4ByteAlignmentLength12* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding4ByteAlignmentLength12& _value,
                         ::test::padding::Padding4ByteAlignmentLength12* _result) {
  return _value.Clone(_result);
}

using Padding4ByteAlignmentLength12Ptr = ::std::unique_ptr<Padding4ByteAlignmentLength12>;

class Padding2ByteAlignmentLength6 final {
 public:
  static const fidl_type_t* FidlType;

  uint8_t a{};

  uint16_t b{};

  uint8_t c{};

  static inline ::std::unique_ptr<Padding2ByteAlignmentLength6> New() { return ::std::make_unique<Padding2ByteAlignmentLength6>(); }

  void Encode(::fidl::Encoder* _encoder, size_t _offset,
              cpp17::optional<::fidl::HandleInformation> maybe_handle_info = cpp17::nullopt);
  static void Decode(::fidl::Decoder* _decoder, Padding2ByteAlignmentLength6* value, size_t _offset);
  zx_status_t Clone(Padding2ByteAlignmentLength6* result) const;
};

inline zx_status_t Clone(const ::test::padding::Padding2ByteAlignmentLength6& _value,
                         ::test::padding::Padding2ByteAlignmentLength6* _result) {
  return _value.Clone(_result);
}

using Padding2ByteAlignmentLength6Ptr = ::std::unique_ptr<Padding2ByteAlignmentLength6>;

}  // namespace padding
}  // namespace test
namespace fidl {

template <>
struct CodingTraits<::test::padding::Padding1ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding1ByteEnd, 4> {};

template <>
struct HasPadding<::test::padding::Padding1ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding1ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding1ByteEnd>::value && IsMemcpyCompatible<uint16_t>::value && IsMemcpyCompatible<uint8_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding1ByteEnd& value,
                         ::test::padding::Padding1ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding1ByteEnd> {
  bool operator()(const ::test::padding::Padding1ByteEnd& _lhs, const ::test::padding::Padding1ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding2ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding2ByteEnd, 8> {};

template <>
struct HasPadding<::test::padding::Padding2ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding2ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding2ByteEnd>::value && IsMemcpyCompatible<uint32_t>::value && IsMemcpyCompatible<uint16_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding2ByteEnd& value,
                         ::test::padding::Padding2ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding2ByteEnd> {
  bool operator()(const ::test::padding::Padding2ByteEnd& _lhs, const ::test::padding::Padding2ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding3ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding3ByteEnd, 8> {};

template <>
struct HasPadding<::test::padding::Padding3ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding3ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding3ByteEnd>::value && IsMemcpyCompatible<uint32_t>::value && IsMemcpyCompatible<uint8_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding3ByteEnd& value,
                         ::test::padding::Padding3ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding3ByteEnd> {
  bool operator()(const ::test::padding::Padding3ByteEnd& _lhs, const ::test::padding::Padding3ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding4ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding4ByteEnd, 16> {};

template <>
struct HasPadding<::test::padding::Padding4ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding4ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding4ByteEnd>::value && IsMemcpyCompatible<uint64_t>::value && IsMemcpyCompatible<uint32_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding4ByteEnd& value,
                         ::test::padding::Padding4ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding4ByteEnd> {
  bool operator()(const ::test::padding::Padding4ByteEnd& _lhs, const ::test::padding::Padding4ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding5ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding5ByteEnd, 16> {};

template <>
struct HasPadding<::test::padding::Padding5ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding5ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding5ByteEnd>::value && IsMemcpyCompatible<uint64_t>::value && IsMemcpyCompatible<uint16_t>::value && IsMemcpyCompatible<uint8_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding5ByteEnd& value,
                         ::test::padding::Padding5ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding5ByteEnd> {
  bool operator()(const ::test::padding::Padding5ByteEnd& _lhs, const ::test::padding::Padding5ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.c, _rhs.c)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding6ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding6ByteEnd, 16> {};

template <>
struct HasPadding<::test::padding::Padding6ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding6ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding6ByteEnd>::value && IsMemcpyCompatible<uint64_t>::value && IsMemcpyCompatible<uint16_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding6ByteEnd& value,
                         ::test::padding::Padding6ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding6ByteEnd> {
  bool operator()(const ::test::padding::Padding6ByteEnd& _lhs, const ::test::padding::Padding6ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding7ByteEnd>
    : public EncodableCodingTraits<::test::padding::Padding7ByteEnd, 16> {};

template <>
struct HasPadding<::test::padding::Padding7ByteEnd> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding7ByteEnd> : public internal::BoolConstant<
                                                                  !HasPadding<::test::padding::Padding7ByteEnd>::value && IsMemcpyCompatible<uint64_t>::value && IsMemcpyCompatible<uint8_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding7ByteEnd& value,
                         ::test::padding::Padding7ByteEnd* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding7ByteEnd> {
  bool operator()(const ::test::padding::Padding7ByteEnd& _lhs, const ::test::padding::Padding7ByteEnd& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding1ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding1ByteMiddle, 4> {};

template <>
struct HasPadding<::test::padding::Padding1ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding1ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding1ByteMiddle>::value && IsMemcpyCompatible<uint8_t>::value && IsMemcpyCompatible<uint16_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding1ByteMiddle& value,
                         ::test::padding::Padding1ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding1ByteMiddle> {
  bool operator()(const ::test::padding::Padding1ByteMiddle& _lhs, const ::test::padding::Padding1ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding2ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding2ByteMiddle, 8> {};

template <>
struct HasPadding<::test::padding::Padding2ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding2ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding2ByteMiddle>::value && IsMemcpyCompatible<uint16_t>::value && IsMemcpyCompatible<uint32_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding2ByteMiddle& value,
                         ::test::padding::Padding2ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding2ByteMiddle> {
  bool operator()(const ::test::padding::Padding2ByteMiddle& _lhs, const ::test::padding::Padding2ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding3ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding3ByteMiddle, 8> {};

template <>
struct HasPadding<::test::padding::Padding3ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding3ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding3ByteMiddle>::value && IsMemcpyCompatible<uint8_t>::value && IsMemcpyCompatible<uint32_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding3ByteMiddle& value,
                         ::test::padding::Padding3ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding3ByteMiddle> {
  bool operator()(const ::test::padding::Padding3ByteMiddle& _lhs, const ::test::padding::Padding3ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding4ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding4ByteMiddle, 16> {};

template <>
struct HasPadding<::test::padding::Padding4ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding4ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding4ByteMiddle>::value && IsMemcpyCompatible<uint32_t>::value && IsMemcpyCompatible<uint64_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding4ByteMiddle& value,
                         ::test::padding::Padding4ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding4ByteMiddle> {
  bool operator()(const ::test::padding::Padding4ByteMiddle& _lhs, const ::test::padding::Padding4ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding5ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding5ByteMiddle, 16> {};

template <>
struct HasPadding<::test::padding::Padding5ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding5ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding5ByteMiddle>::value && IsMemcpyCompatible<uint16_t>::value && IsMemcpyCompatible<uint8_t>::value && IsMemcpyCompatible<uint64_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding5ByteMiddle& value,
                         ::test::padding::Padding5ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding5ByteMiddle> {
  bool operator()(const ::test::padding::Padding5ByteMiddle& _lhs, const ::test::padding::Padding5ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.c, _rhs.c)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding6ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding6ByteMiddle, 16> {};

template <>
struct HasPadding<::test::padding::Padding6ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding6ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding6ByteMiddle>::value && IsMemcpyCompatible<uint16_t>::value && IsMemcpyCompatible<uint64_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding6ByteMiddle& value,
                         ::test::padding::Padding6ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding6ByteMiddle> {
  bool operator()(const ::test::padding::Padding6ByteMiddle& _lhs, const ::test::padding::Padding6ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding7ByteMiddle>
    : public EncodableCodingTraits<::test::padding::Padding7ByteMiddle, 16> {};

template <>
struct HasPadding<::test::padding::Padding7ByteMiddle> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding7ByteMiddle> : public internal::BoolConstant<
                                                                     !HasPadding<::test::padding::Padding7ByteMiddle>::value && IsMemcpyCompatible<uint8_t>::value && IsMemcpyCompatible<uint64_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding7ByteMiddle& value,
                         ::test::padding::Padding7ByteMiddle* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding7ByteMiddle> {
  bool operator()(const ::test::padding::Padding7ByteMiddle& _lhs, const ::test::padding::Padding7ByteMiddle& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding4ByteAlignmentLength12>
    : public EncodableCodingTraits<::test::padding::Padding4ByteAlignmentLength12, 12> {};

template <>
struct HasPadding<::test::padding::Padding4ByteAlignmentLength12> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding4ByteAlignmentLength12> : public internal::BoolConstant<
                                                                                !HasPadding<::test::padding::Padding4ByteAlignmentLength12>::value && IsMemcpyCompatible<uint32_t>::value && IsMemcpyCompatible<uint8_t>::value && IsMemcpyCompatible<uint16_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding4ByteAlignmentLength12& value,
                         ::test::padding::Padding4ByteAlignmentLength12* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding4ByteAlignmentLength12> {
  bool operator()(const ::test::padding::Padding4ByteAlignmentLength12& _lhs, const ::test::padding::Padding4ByteAlignmentLength12& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.c, _rhs.c)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.d, _rhs.d)) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::padding::Padding2ByteAlignmentLength6>
    : public EncodableCodingTraits<::test::padding::Padding2ByteAlignmentLength6, 6> {};

template <>
struct HasPadding<::test::padding::Padding2ByteAlignmentLength6> : public std::true_type{};

template <>
struct IsMemcpyCompatible<::test::padding::Padding2ByteAlignmentLength6> : public internal::BoolConstant<
                                                                               !HasPadding<::test::padding::Padding2ByteAlignmentLength6>::value && IsMemcpyCompatible<uint8_t>::value && IsMemcpyCompatible<uint16_t>::value> {};

inline zx_status_t Clone(const ::test::padding::Padding2ByteAlignmentLength6& value,
                         ::test::padding::Padding2ByteAlignmentLength6* result) {
  return ::test::padding::Clone(value, result);
}

template <>
struct Equality<::test::padding::Padding2ByteAlignmentLength6> {
  bool operator()(const ::test::padding::Padding2ByteAlignmentLength6& _lhs, const ::test::padding::Padding2ByteAlignmentLength6& _rhs) const {
    if (!::fidl::Equals(_lhs.a, _rhs.a)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.b, _rhs.b)) {
      return false;
    }
    if (!::fidl::Equals(_lhs.c, _rhs.c)) {
      return false;
    }
    return true;
  }
};

//
// Proxies and stubs declarations
//
}  // namespace fidl
