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

// fidl_experiment = output_index_json

#pragma once

#include <lib/fidl/cpp/wire/array.h>
#include <lib/fidl/cpp/wire/envelope.h>
#include <lib/fidl/cpp/wire/internal/framework_err.h>
#include <lib/fidl/cpp/wire/message.h>
#include <lib/fidl/cpp/wire/message_storage.h>
#include <lib/fidl/cpp/wire/object_view.h>
#include <lib/fidl/cpp/wire/string_view.h>
#include <lib/fidl/cpp/wire/traits.h>
#include <lib/fidl/cpp/wire/wire_types.h>
#include <lib/stdcompat/optional.h>

#include <cinttypes>
#ifdef __Fuchsia__

#endif  // __Fuchsia__

#include <fidl/test.unionsandwich/cpp/common_types.h>
#include <fidl/test.unionsandwich/cpp/markers.h>

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wshadow"

namespace test_unionsandwich {

namespace wire {

struct SandwichUnionSize8Alignment4;

struct SandwichUnionSize12Alignment4;

struct StructSize16Alignment8;

struct SandwichUnionSize24Alignment8;

struct SandwichUnionSize36Alignment4;

class UnionSize8Alignment4;

class UnionSize12Alignment4;

class UnionSize24Alignment8;

class UnionSize36Alignment4;

class UnionSize8Alignment4 {
 public:
  UnionSize8Alignment4() : ordinal_(::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal::Invalid), envelope_{} {}

  UnionSize8Alignment4(const UnionSize8Alignment4&) = default;
  UnionSize8Alignment4& operator=(const UnionSize8Alignment4&) = default;
  UnionSize8Alignment4(UnionSize8Alignment4&&) = default;
  UnionSize8Alignment4& operator=(UnionSize8Alignment4&&) = default;

  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  bool has_invalid_tag() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal::Invalid; }

  bool is_variant() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal::kVariant; }

  static UnionSize8Alignment4 WithVariant(uint32_t val) {
    UnionSize8Alignment4 result;
    result.ordinal_ = ::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal::kVariant;
    result.envelope_.As<uint32_t>().set_data(std::move(val));
    return result;
  }

  uint32_t& variant() {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal::kVariant);
    return envelope_.As<uint32_t>().get_data();
  }
  const uint32_t& variant() const {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal::kVariant);
    return envelope_.As<uint32_t>().get_data();
  }
  ::test_unionsandwich::wire::UnionSize8Alignment4::Tag Which() const {
    ZX_ASSERT(!has_invalid_tag());
    return static_cast<::test_unionsandwich::wire::UnionSize8Alignment4::Tag>(ordinal_);
  }

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kVariant = 1,  // 0x1
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_unionsandwich::wire::UnionSize8Alignment4::Ordinal ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

class UnionSize12Alignment4 {
 public:
  UnionSize12Alignment4() : ordinal_(::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal::Invalid), envelope_{} {}

  UnionSize12Alignment4(const UnionSize12Alignment4&) = default;
  UnionSize12Alignment4& operator=(const UnionSize12Alignment4&) = default;
  UnionSize12Alignment4(UnionSize12Alignment4&&) = default;
  UnionSize12Alignment4& operator=(UnionSize12Alignment4&&) = default;

  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  bool has_invalid_tag() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal::Invalid; }

  bool is_variant() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal::kVariant; }

  static UnionSize12Alignment4 WithVariant(::fidl::ObjectView<::fidl::Array<uint8_t, 6>> val) {
    UnionSize12Alignment4 result;
    result.ordinal_ = ::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal::kVariant;
    result.envelope_.As<::fidl::Array<uint8_t, 6>>().set_data(std::move(val));
    return result;
  }

  template <typename... Args>
  static UnionSize12Alignment4 WithVariant(::fidl::AnyArena& allocator, Args&&... args) {
    return WithVariant(::fidl::ObjectView<::fidl::Array<uint8_t, 6>>(allocator,
                                                                     std::forward<Args>(args)...));
  }

  ::fidl::Array<uint8_t, 6>& variant() {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal::kVariant);
    return envelope_.As<::fidl::Array<uint8_t, 6>>().get_data();
  }
  const ::fidl::Array<uint8_t, 6>& variant() const {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal::kVariant);
    return envelope_.As<::fidl::Array<uint8_t, 6>>().get_data();
  }
  ::test_unionsandwich::wire::UnionSize12Alignment4::Tag Which() const {
    ZX_ASSERT(!has_invalid_tag());
    return static_cast<::test_unionsandwich::wire::UnionSize12Alignment4::Tag>(ordinal_);
  }

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kVariant = 1,  // 0x1
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_unionsandwich::wire::UnionSize12Alignment4::Ordinal ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

class UnionSize24Alignment8 {
 public:
  UnionSize24Alignment8() : ordinal_(::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal::Invalid), envelope_{} {}

  UnionSize24Alignment8(const UnionSize24Alignment8&) = default;
  UnionSize24Alignment8& operator=(const UnionSize24Alignment8&) = default;
  UnionSize24Alignment8(UnionSize24Alignment8&&) = default;
  UnionSize24Alignment8& operator=(UnionSize24Alignment8&&) = default;

  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  bool has_invalid_tag() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal::Invalid; }

  bool is_variant() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal::kVariant; }

  static UnionSize24Alignment8 WithVariant(::fidl::ObjectView<::test_unionsandwich::wire::StructSize16Alignment8> val) {
    UnionSize24Alignment8 result;
    result.ordinal_ = ::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal::kVariant;
    result.envelope_.As<::test_unionsandwich::wire::StructSize16Alignment8>().set_data(std::move(val));
    return result;
  }

  template <typename... Args>
  static UnionSize24Alignment8 WithVariant(::fidl::AnyArena& allocator, Args&&... args) {
    return WithVariant(::fidl::ObjectView<::test_unionsandwich::wire::StructSize16Alignment8>(allocator,
                                                                                              std::forward<Args>(args)...));
  }

  ::test_unionsandwich::wire::StructSize16Alignment8& variant() {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal::kVariant);
    return envelope_.As<::test_unionsandwich::wire::StructSize16Alignment8>().get_data();
  }
  const ::test_unionsandwich::wire::StructSize16Alignment8& variant() const {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal::kVariant);
    return envelope_.As<::test_unionsandwich::wire::StructSize16Alignment8>().get_data();
  }
  ::test_unionsandwich::wire::UnionSize24Alignment8::Tag Which() const {
    ZX_ASSERT(!has_invalid_tag());
    return static_cast<::test_unionsandwich::wire::UnionSize24Alignment8::Tag>(ordinal_);
  }

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kVariant = 1,  // 0x1
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_unionsandwich::wire::UnionSize24Alignment8::Ordinal ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

class UnionSize36Alignment4 {
 public:
  UnionSize36Alignment4() : ordinal_(::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal::Invalid), envelope_{} {}

  UnionSize36Alignment4(const UnionSize36Alignment4&) = default;
  UnionSize36Alignment4& operator=(const UnionSize36Alignment4&) = default;
  UnionSize36Alignment4(UnionSize36Alignment4&&) = default;
  UnionSize36Alignment4& operator=(UnionSize36Alignment4&&) = default;

  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  bool has_invalid_tag() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal::Invalid; }

  bool is_variant() const { return ordinal_ == ::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal::kVariant; }

  static UnionSize36Alignment4 WithVariant(::fidl::ObjectView<::fidl::Array<uint8_t, 32>> val) {
    UnionSize36Alignment4 result;
    result.ordinal_ = ::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal::kVariant;
    result.envelope_.As<::fidl::Array<uint8_t, 32>>().set_data(std::move(val));
    return result;
  }

  template <typename... Args>
  static UnionSize36Alignment4 WithVariant(::fidl::AnyArena& allocator, Args&&... args) {
    return WithVariant(::fidl::ObjectView<::fidl::Array<uint8_t, 32>>(allocator,
                                                                      std::forward<Args>(args)...));
  }

  ::fidl::Array<uint8_t, 32>& variant() {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal::kVariant);
    return envelope_.As<::fidl::Array<uint8_t, 32>>().get_data();
  }
  const ::fidl::Array<uint8_t, 32>& variant() const {
    ZX_ASSERT(ordinal_ == ::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal::kVariant);
    return envelope_.As<::fidl::Array<uint8_t, 32>>().get_data();
  }
  ::test_unionsandwich::wire::UnionSize36Alignment4::Tag Which() const {
    ZX_ASSERT(!has_invalid_tag());
    return static_cast<::test_unionsandwich::wire::UnionSize36Alignment4::Tag>(ordinal_);
  }

 private:
  enum class Ordinal : fidl_xunion_tag_t {
    Invalid = 0,
    kVariant = 1,  // 0x1
  };

  static void SizeAndOffsetAssertionHelper();
  ::test_unionsandwich::wire::UnionSize36Alignment4::Ordinal ordinal_;
  FIDL_ALIGNDECL
  ::fidl::UntypedEnvelope envelope_;
};

struct SandwichUnionSize8Alignment4 {
  uint32_t before = {};

  ::test_unionsandwich::wire::UnionSize8Alignment4 union_ = {};

  uint32_t after = {};
};

struct SandwichUnionSize12Alignment4 {
  uint32_t before = {};

  ::test_unionsandwich::wire::UnionSize12Alignment4 union_ = {};

  int32_t after = {};
};

struct StructSize16Alignment8 {
  uint64_t f1 = {};

  uint64_t f2 = {};
};

struct SandwichUnionSize24Alignment8 {
  uint32_t before = {};

  ::test_unionsandwich::wire::UnionSize24Alignment8 union_ = {};

  uint32_t after = {};
};

struct SandwichUnionSize36Alignment4 {
  uint32_t before = {};

  ::test_unionsandwich::wire::UnionSize36Alignment4 union_ = {};

  uint32_t after = {};
};

}  // namespace wire
}  // namespace test_unionsandwich
namespace fidl {

template <>
struct TypeTraits<::test_unionsandwich::wire::SandwichUnionSize8Alignment4> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 32;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::SandwichUnionSize8Alignment4> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::SandwichUnionSize8Alignment4> : public std::true_type {};
template <>
struct IsStruct<::test_unionsandwich::wire::SandwichUnionSize8Alignment4> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::SandwichUnionSize8Alignment4>);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize8Alignment4, before) == 0);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize8Alignment4, union_) == 8);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize8Alignment4, after) == 24);
static_assert(sizeof(::test_unionsandwich::wire::SandwichUnionSize8Alignment4) == TypeTraits<::test_unionsandwich::wire::SandwichUnionSize8Alignment4>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::SandwichUnionSize8Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 32;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::test_unionsandwich::wire::UnionSize8Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>());
  static constexpr bool kHasPadding = true;
  using Base = WireStructCodingTraitsBase<::test_unionsandwich::wire::SandwichUnionSize8Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_unionsandwich::wire::SandwichUnionSize8Alignment4* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_unionsandwich::wire::SandwichUnionSize8Alignment4));
    } else {
      internal::WireZeroPadding<uint64_t>(encoder, position + 0);
      internal::WireZeroPadding<uint64_t>(encoder, position + 24);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->before, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize8Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Encode(encoder, &value->union_, position + 8, recursion_depth);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->after, position + 24, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize8Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Decode(
          decoder, position + 8, recursion_depth);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 24, recursion_depth);
    }
    internal::WireCheckPadding<uint64_t>(decoder, position + 0, 0xffffffff00000000);
    internal::WireCheckPadding<uint64_t>(decoder, position + 24, 0xffffffff00000000);
  }
};

template <>
struct TypeTraits<::test_unionsandwich::wire::SandwichUnionSize12Alignment4> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 32;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::SandwichUnionSize12Alignment4> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::SandwichUnionSize12Alignment4> : public std::true_type {};
template <>
struct IsStruct<::test_unionsandwich::wire::SandwichUnionSize12Alignment4> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::SandwichUnionSize12Alignment4>);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize12Alignment4, before) == 0);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize12Alignment4, union_) == 8);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize12Alignment4, after) == 24);
static_assert(sizeof(::test_unionsandwich::wire::SandwichUnionSize12Alignment4) == TypeTraits<::test_unionsandwich::wire::SandwichUnionSize12Alignment4>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::SandwichUnionSize12Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 32;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::test_unionsandwich::wire::UnionSize12Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<int32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>());
  static constexpr bool kHasPadding = true;
  using Base = WireStructCodingTraitsBase<::test_unionsandwich::wire::SandwichUnionSize12Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_unionsandwich::wire::SandwichUnionSize12Alignment4* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_unionsandwich::wire::SandwichUnionSize12Alignment4));
    } else {
      internal::WireZeroPadding<uint64_t>(encoder, position + 0);
      internal::WireZeroPadding<uint64_t>(encoder, position + 24);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->before, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize12Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Encode(encoder, &value->union_, position + 8, recursion_depth);
      internal::WireCodingTraits<int32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->after, position + 24, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize12Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Decode(
          decoder, position + 8, recursion_depth);
      internal::WireCodingTraits<int32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 24, recursion_depth);
    }
    internal::WireCheckPadding<uint64_t>(decoder, position + 0, 0xffffffff00000000);
    internal::WireCheckPadding<uint64_t>(decoder, position + 24, 0xffffffff00000000);
  }
};

template <>
struct TypeTraits<::test_unionsandwich::wire::StructSize16Alignment8> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 0;
  static constexpr uint32_t kPrimarySize = 16;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = false;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::StructSize16Alignment8> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::StructSize16Alignment8> : public std::true_type {};
template <>
struct IsStruct<::test_unionsandwich::wire::StructSize16Alignment8> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::StructSize16Alignment8>);
static_assert(offsetof(::test_unionsandwich::wire::StructSize16Alignment8, f1) == 0);
static_assert(offsetof(::test_unionsandwich::wire::StructSize16Alignment8, f2) == 8);
static_assert(sizeof(::test_unionsandwich::wire::StructSize16Alignment8) == TypeTraits<::test_unionsandwich::wire::StructSize16Alignment8>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::StructSize16Alignment8, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 16;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<uint64_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<uint64_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>());
  static constexpr bool kHasPadding = false;
  using Base = WireStructCodingTraitsBase<::test_unionsandwich::wire::StructSize16Alignment8, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_unionsandwich::wire::StructSize16Alignment8* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_unionsandwich::wire::StructSize16Alignment8));
    } else {
      internal::WireCodingTraits<uint64_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->f1, position + 0, recursion_depth);
      internal::WireCodingTraits<uint64_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->f2, position + 8, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<uint64_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<uint64_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 8, recursion_depth);
    }
  }
};

template <>
struct TypeTraits<::test_unionsandwich::wire::SandwichUnionSize24Alignment8> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 32;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::SandwichUnionSize24Alignment8> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::SandwichUnionSize24Alignment8> : public std::true_type {};
template <>
struct IsStruct<::test_unionsandwich::wire::SandwichUnionSize24Alignment8> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::SandwichUnionSize24Alignment8>);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize24Alignment8, before) == 0);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize24Alignment8, union_) == 8);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize24Alignment8, after) == 24);
static_assert(sizeof(::test_unionsandwich::wire::SandwichUnionSize24Alignment8) == TypeTraits<::test_unionsandwich::wire::SandwichUnionSize24Alignment8>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::SandwichUnionSize24Alignment8, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 32;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::test_unionsandwich::wire::UnionSize24Alignment8, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>());
  static constexpr bool kHasPadding = true;
  using Base = WireStructCodingTraitsBase<::test_unionsandwich::wire::SandwichUnionSize24Alignment8, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_unionsandwich::wire::SandwichUnionSize24Alignment8* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_unionsandwich::wire::SandwichUnionSize24Alignment8));
    } else {
      internal::WireZeroPadding<uint64_t>(encoder, position + 0);
      internal::WireZeroPadding<uint64_t>(encoder, position + 24);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->before, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize24Alignment8, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Encode(encoder, &value->union_, position + 8, recursion_depth);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->after, position + 24, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize24Alignment8, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Decode(
          decoder, position + 8, recursion_depth);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 24, recursion_depth);
    }
    internal::WireCheckPadding<uint64_t>(decoder, position + 0, 0xffffffff00000000);
    internal::WireCheckPadding<uint64_t>(decoder, position + 24, 0xffffffff00000000);
  }
};

template <>
struct TypeTraits<::test_unionsandwich::wire::SandwichUnionSize36Alignment4> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 32;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::SandwichUnionSize36Alignment4> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::SandwichUnionSize36Alignment4> : public std::true_type {};
template <>
struct IsStruct<::test_unionsandwich::wire::SandwichUnionSize36Alignment4> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::SandwichUnionSize36Alignment4>);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize36Alignment4, before) == 0);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize36Alignment4, union_) == 8);
static_assert(offsetof(::test_unionsandwich::wire::SandwichUnionSize36Alignment4, after) == 24);
static_assert(sizeof(::test_unionsandwich::wire::SandwichUnionSize36Alignment4) == TypeTraits<::test_unionsandwich::wire::SandwichUnionSize36Alignment4>::kPrimarySize);

template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::SandwichUnionSize36Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive> {
  static constexpr size_t kInlineSize = 32;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<::test_unionsandwich::wire::UnionSize36Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>(), ::fidl::internal::WireStructMemberCodingInfo<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>());
  static constexpr bool kHasPadding = true;
  using Base = WireStructCodingTraitsBase<::test_unionsandwich::wire::SandwichUnionSize36Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>;
  static constexpr bool kIsMemcpyCompatible = Base::kIsMemcpyCompatible;

  static void Encode(
      internal::WireEncoder* encoder, ::test_unionsandwich::wire::SandwichUnionSize36Alignment4* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (kIsMemcpyCompatible) {
      memcpy(position.As<void>(), value, sizeof(::test_unionsandwich::wire::SandwichUnionSize36Alignment4));
    } else {
      internal::WireZeroPadding<uint64_t>(encoder, position + 0);
      internal::WireZeroPadding<uint64_t>(encoder, position + 24);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->before, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize36Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Encode(encoder, &value->union_, position + 8, recursion_depth);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Encode(encoder, &value->after, position + 24, recursion_depth);
    }
  }
  static void Decode(
      internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    if constexpr (!Base::are_members_memcpy_compatible) {
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 0, recursion_depth);
      internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize36Alignment4, fidl::internal::WireCodingConstraintUnion<false>, IsRecursive>::Decode(
          decoder, position + 8, recursion_depth);
      internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::Decode(
          decoder, position + 24, recursion_depth);
    }
    internal::WireCheckPadding<uint64_t>(decoder, position + 0, 0xffffffff00000000);
    internal::WireCheckPadding<uint64_t>(decoder, position + 24, 0xffffffff00000000);
  }
};

template <>
struct TypeTraits<::test_unionsandwich::wire::UnionSize8Alignment4> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 0;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::UnionSize8Alignment4> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::UnionSize8Alignment4> : public std::true_type {};
template <>
struct IsUnion<::test_unionsandwich::wire::UnionSize8Alignment4> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::UnionSize8Alignment4>);

template <typename Constraint, bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize8Alignment4, Constraint, IsRecursive> {
  static constexpr size_t kInlineSize = 16;
  static constexpr bool kIsMemcpyCompatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_unionsandwich::wire::UnionSize8Alignment4* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl_union_t* u = reinterpret_cast<fidl_union_t*>(value);

    if (unlikely(u->tag == 0)) {
      if constexpr (Constraint::is_optional) {
        *position.As<fidl_union_t>() = {};
        return;
      }
      encoder->SetError(kCodingErrorInvalidUnionTag);
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(encoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    *position.As<fidl_xunion_tag_t>() = u->tag;

    size_t encode_inline_size;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize8Alignment4::Tag::kVariant
        encode_inline_size = ::fidl::internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        encode_inline_size = 0;
        break;
    }
    ::fidl::internal::EncodeFn<IsRecursive> encode_fn;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize8Alignment4::Tag::kVariant
        encode_fn = ::fidl::internal::MakeEncodeFn<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        encode_fn = nullptr;
        break;
    }
    WireEncodeEnvelope(encode_inline_size, encode_fn, encoder, &u->envelope, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }

  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    ::test_unionsandwich::wire::UnionSize8Alignment4::Tag tag = *position.As<::test_unionsandwich::wire::UnionSize8Alignment4::Tag>();
    if (unlikely(static_cast<uint64_t>(tag) == 0)) {
      if constexpr (!Constraint::is_optional) {
        decoder->SetError(kCodingErrorInvalidUnionTag);
        return;
      }
      static_assert(sizeof(fidl_envelope_t) == sizeof(uint64_t));
      if (*(position + sizeof(fidl_xunion_tag_t)).As<uint64_t>() != 0) {
        decoder->SetError(kCodingErrorZeroTagButNonZeroEnvelope);
      }
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(decoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    size_t decode_inline_size;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize8Alignment4::Tag::kVariant:
        decode_inline_size = ::fidl::internal::WireCodingTraits<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        decode_inline_size = 0;
        break;
    }
    DecodeFn<IsRecursive> decode_fn;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize8Alignment4::Tag::kVariant:
        decode_fn = ::fidl::internal::MakeDecodeFn<uint32_t, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        decode_fn = nullptr;
        break;
    }
    ::fidl::internal::WireDecodeStrictEnvelope(decode_inline_size, decode_fn, decoder, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }
};

// Top-level union.
template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize8Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize8Alignment4, ::fidl::internal::WireCodingConstraintUnion<false>, IsRecursive> {};

template <>
struct TypeTraits<::test_unionsandwich::wire::UnionSize12Alignment4> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 8;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::UnionSize12Alignment4> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::UnionSize12Alignment4> : public std::true_type {};
template <>
struct IsUnion<::test_unionsandwich::wire::UnionSize12Alignment4> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::UnionSize12Alignment4>);

template <typename Constraint, bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize12Alignment4, Constraint, IsRecursive> {
  static constexpr size_t kInlineSize = 16;
  static constexpr bool kIsMemcpyCompatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_unionsandwich::wire::UnionSize12Alignment4* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl_union_t* u = reinterpret_cast<fidl_union_t*>(value);

    if (unlikely(u->tag == 0)) {
      if constexpr (Constraint::is_optional) {
        *position.As<fidl_union_t>() = {};
        return;
      }
      encoder->SetError(kCodingErrorInvalidUnionTag);
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(encoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    *position.As<fidl_xunion_tag_t>() = u->tag;

    size_t encode_inline_size;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize12Alignment4::Tag::kVariant
        encode_inline_size = ::fidl::internal::WireCodingTraits<::fidl::Array<uint8_t, 6>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        encode_inline_size = 0;
        break;
    }
    ::fidl::internal::EncodeFn<IsRecursive> encode_fn;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize12Alignment4::Tag::kVariant
        encode_fn = ::fidl::internal::MakeEncodeFn<::fidl::Array<uint8_t, 6>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        encode_fn = nullptr;
        break;
    }
    WireEncodeEnvelope(encode_inline_size, encode_fn, encoder, &u->envelope, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }

  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    ::test_unionsandwich::wire::UnionSize12Alignment4::Tag tag = *position.As<::test_unionsandwich::wire::UnionSize12Alignment4::Tag>();
    if (unlikely(static_cast<uint64_t>(tag) == 0)) {
      if constexpr (!Constraint::is_optional) {
        decoder->SetError(kCodingErrorInvalidUnionTag);
        return;
      }
      static_assert(sizeof(fidl_envelope_t) == sizeof(uint64_t));
      if (*(position + sizeof(fidl_xunion_tag_t)).As<uint64_t>() != 0) {
        decoder->SetError(kCodingErrorZeroTagButNonZeroEnvelope);
      }
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(decoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    size_t decode_inline_size;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize12Alignment4::Tag::kVariant:
        decode_inline_size = ::fidl::internal::WireCodingTraits<::fidl::Array<uint8_t, 6>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        decode_inline_size = 0;
        break;
    }
    DecodeFn<IsRecursive> decode_fn;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize12Alignment4::Tag::kVariant:
        decode_fn = ::fidl::internal::MakeDecodeFn<::fidl::Array<uint8_t, 6>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        decode_fn = nullptr;
        break;
    }
    ::fidl::internal::WireDecodeStrictEnvelope(decode_inline_size, decode_fn, decoder, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }
};

// Top-level union.
template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize12Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize12Alignment4, ::fidl::internal::WireCodingConstraintUnion<false>, IsRecursive> {};

template <>
struct TypeTraits<::test_unionsandwich::wire::UnionSize24Alignment8> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::UnionSize24Alignment8> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::UnionSize24Alignment8> : public std::true_type {};
template <>
struct IsUnion<::test_unionsandwich::wire::UnionSize24Alignment8> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::UnionSize24Alignment8>);

template <typename Constraint, bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize24Alignment8, Constraint, IsRecursive> {
  static constexpr size_t kInlineSize = 16;
  static constexpr bool kIsMemcpyCompatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_unionsandwich::wire::UnionSize24Alignment8* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl_union_t* u = reinterpret_cast<fidl_union_t*>(value);

    if (unlikely(u->tag == 0)) {
      if constexpr (Constraint::is_optional) {
        *position.As<fidl_union_t>() = {};
        return;
      }
      encoder->SetError(kCodingErrorInvalidUnionTag);
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(encoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    *position.As<fidl_xunion_tag_t>() = u->tag;

    size_t encode_inline_size;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize24Alignment8::Tag::kVariant
        encode_inline_size = ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::StructSize16Alignment8, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        encode_inline_size = 0;
        break;
    }
    ::fidl::internal::EncodeFn<IsRecursive> encode_fn;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize24Alignment8::Tag::kVariant
        encode_fn = ::fidl::internal::MakeEncodeFn<::test_unionsandwich::wire::StructSize16Alignment8, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        encode_fn = nullptr;
        break;
    }
    WireEncodeEnvelope(encode_inline_size, encode_fn, encoder, &u->envelope, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }

  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    ::test_unionsandwich::wire::UnionSize24Alignment8::Tag tag = *position.As<::test_unionsandwich::wire::UnionSize24Alignment8::Tag>();
    if (unlikely(static_cast<uint64_t>(tag) == 0)) {
      if constexpr (!Constraint::is_optional) {
        decoder->SetError(kCodingErrorInvalidUnionTag);
        return;
      }
      static_assert(sizeof(fidl_envelope_t) == sizeof(uint64_t));
      if (*(position + sizeof(fidl_xunion_tag_t)).As<uint64_t>() != 0) {
        decoder->SetError(kCodingErrorZeroTagButNonZeroEnvelope);
      }
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(decoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    size_t decode_inline_size;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize24Alignment8::Tag::kVariant:
        decode_inline_size = ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::StructSize16Alignment8, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        decode_inline_size = 0;
        break;
    }
    DecodeFn<IsRecursive> decode_fn;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize24Alignment8::Tag::kVariant:
        decode_fn = ::fidl::internal::MakeDecodeFn<::test_unionsandwich::wire::StructSize16Alignment8, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        decode_fn = nullptr;
        break;
    }
    ::fidl::internal::WireDecodeStrictEnvelope(decode_inline_size, decode_fn, decoder, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }
};

// Top-level union.
template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize24Alignment8, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize24Alignment8, ::fidl::internal::WireCodingConstraintUnion<false>, IsRecursive> {};

template <>
struct TypeTraits<::test_unionsandwich::wire::UnionSize36Alignment4> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 1;
  static constexpr uint32_t kPrimarySize = 16;
  [[maybe_unused]]
  static constexpr uint32_t kMaxOutOfLine = 32;
  static constexpr bool kHasFlexibleEnvelope = false;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsFidlType<::test_unionsandwich::wire::UnionSize36Alignment4> : public std::true_type {};
template <>
struct IsWire<::test_unionsandwich::wire::UnionSize36Alignment4> : public std::true_type {};
template <>
struct IsUnion<::test_unionsandwich::wire::UnionSize36Alignment4> : public std::true_type {};
static_assert(std::is_standard_layout_v<::test_unionsandwich::wire::UnionSize36Alignment4>);

template <typename Constraint, bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize36Alignment4, Constraint, IsRecursive> {
  static constexpr size_t kInlineSize = 16;
  static constexpr bool kIsMemcpyCompatible = false;

  static void Encode(internal::WireEncoder* encoder, ::test_unionsandwich::wire::UnionSize36Alignment4* value, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    fidl_union_t* u = reinterpret_cast<fidl_union_t*>(value);

    if (unlikely(u->tag == 0)) {
      if constexpr (Constraint::is_optional) {
        *position.As<fidl_union_t>() = {};
        return;
      }
      encoder->SetError(kCodingErrorInvalidUnionTag);
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(encoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    *position.As<fidl_xunion_tag_t>() = u->tag;

    size_t encode_inline_size;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize36Alignment4::Tag::kVariant
        encode_inline_size = ::fidl::internal::WireCodingTraits<::fidl::Array<uint8_t, 32>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        encode_inline_size = 0;
        break;
    }
    ::fidl::internal::EncodeFn<IsRecursive> encode_fn;
    switch (u->tag) {
      case 1:  // ::test_unionsandwich::wire::UnionSize36Alignment4::Tag::kVariant
        encode_fn = ::fidl::internal::MakeEncodeFn<::fidl::Array<uint8_t, 32>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        encode_fn = nullptr;
        break;
    }
    WireEncodeEnvelope(encode_inline_size, encode_fn, encoder, &u->envelope, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }

  static void Decode(internal::WireDecoder* decoder, ::fidl::internal::WirePosition position, RecursionDepth<IsRecursive> recursion_depth) {
    ::test_unionsandwich::wire::UnionSize36Alignment4::Tag tag = *position.As<::test_unionsandwich::wire::UnionSize36Alignment4::Tag>();
    if (unlikely(static_cast<uint64_t>(tag) == 0)) {
      if constexpr (!Constraint::is_optional) {
        decoder->SetError(kCodingErrorInvalidUnionTag);
        return;
      }
      static_assert(sizeof(fidl_envelope_t) == sizeof(uint64_t));
      if (*(position + sizeof(fidl_xunion_tag_t)).As<uint64_t>() != 0) {
        decoder->SetError(kCodingErrorZeroTagButNonZeroEnvelope);
      }
      return;
    }

    RecursionDepth<IsRecursive> inner_depth = recursion_depth.Add(decoder, 1);
    if (!inner_depth.IsValid()) {
      return;
    }

    size_t decode_inline_size;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize36Alignment4::Tag::kVariant:
        decode_inline_size = ::fidl::internal::WireCodingTraits<::fidl::Array<uint8_t, 32>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>::kInlineSize;
        break;
      default:
        decode_inline_size = 0;
        break;
    }
    DecodeFn<IsRecursive> decode_fn;
    switch (tag) {
      case ::test_unionsandwich::wire::UnionSize36Alignment4::Tag::kVariant:
        decode_fn = ::fidl::internal::MakeDecodeFn<::fidl::Array<uint8_t, 32>, fidl::internal::WireCodingConstraintEmpty, IsRecursive>();
        break;
      default:
        decode_fn = nullptr;
        break;
    }
    ::fidl::internal::WireDecodeStrictEnvelope(decode_inline_size, decode_fn, decoder, position + sizeof(fidl_xunion_tag_t), inner_depth);
  }
};

// Top-level union.
template <bool IsRecursive>
struct ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize36Alignment4, ::fidl::internal::WireCodingConstraintEmpty, IsRecursive>
    : public ::fidl::internal::WireCodingTraits<::test_unionsandwich::wire::UnionSize36Alignment4, ::fidl::internal::WireCodingConstraintUnion<false>, IsRecursive> {};

#pragma clang diagnostic pop

}  // namespace fidl
