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

// fidl_experiment = output_index_json

#pragma once

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

#include <cinttypes>
#include <string>

#ifdef __Fuchsia__

#endif  // __Fuchsia__

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

namespace test_unionsandwich {

class SandwichUnionSize8Alignment4;

class SandwichUnionSize12Alignment4;

class StructSize16Alignment8;

class SandwichUnionSize24Alignment8;

class SandwichUnionSize36Alignment4;

class UnionSize8Alignment4;

class UnionSize12Alignment4;

class UnionSize24Alignment8;

class UnionSize36Alignment4;

class UnionSize8Alignment4 {
 private:
  using Storage_ =
      std::variant<
          std::monostate, uint32_t>;

 public:
  // TODO: share union tag types between wire & natural.
  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  UnionSize8Alignment4(UnionSize8Alignment4&& other) noexcept
      : UnionSize8Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{}) {
    *storage_ = std::move(*other.storage_);
  }
  UnionSize8Alignment4& operator=(UnionSize8Alignment4&& other) noexcept {
    if (this != &other) {
      *storage_ = std::move(*other.storage_);
    }
    return *this;
  }
  UnionSize8Alignment4(const UnionSize8Alignment4& other) noexcept : UnionSize8Alignment4(other.CloneStorage_()) {}
  UnionSize8Alignment4& operator=(const UnionSize8Alignment4& other) noexcept {
    if (this != &other) {
      storage_ = other.CloneStorage_();
    }
    return *this;
  }

  bool operator==(const UnionSize8Alignment4& other) const noexcept {
    return *storage_ == *other.storage_;
  }
  bool operator!=(const UnionSize8Alignment4& other) const noexcept {
    return *storage_ != *other.storage_;
  }

  constexpr ::test_unionsandwich::UnionSize8Alignment4::Tag Which() const {
    return UnionSize8Alignment4::IndexToTag(storage_->index()).value();
  }
  static UnionSize8Alignment4 WithVariant(uint32_t val) {
    return UnionSize8Alignment4(std::make_shared<Storage_>(
        std::in_place_index_t<1>{},
        std::move(val)));
  }

  const ::fidl::internal::UnionMemberView<1, Storage_> variant() const {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  ::fidl::internal::UnionMemberView<1, Storage_> variant() {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  // Sets the union to hold the variant member.
  //

  UnionSize8Alignment4& variant(uint32_t value) {
    storage_->emplace<1>(std::move(value));
    return *this;
  }

  UnionSize8Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag)
      : storage_(std::make_shared<Storage_>()) {}

 private:
  std::shared_ptr<Storage_> storage_;
  std::shared_ptr<Storage_> CloneStorage_() const;
  friend struct ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize8Alignment4>;
  static constexpr auto kMembers = std::make_tuple(
      ::fidl::internal::NaturalUnionMember<::fidl::internal::NaturalCodingConstraintEmpty>(), ::fidl::internal::NaturalUnionMember<fidl::internal::NaturalCodingConstraintEmpty>());

  explicit UnionSize8Alignment4(std::shared_ptr<Storage_> storage) : storage_(std::move(storage)) {}

  static constexpr size_t TagToIndex(::fidl::internal::NaturalDecoder* decoder, ::test_unionsandwich::UnionSize8Alignment4::Tag tag) {
    switch (tag) {
      case ::test_unionsandwich::UnionSize8Alignment4::Tag::kVariant:
        return 1;
      default: {
        decoder->SetError(::fidl::internal::kCodingErrorUnknownUnionTag);
        return 0;
      }
    }
  }

  static constexpr std::optional<::test_unionsandwich::UnionSize8Alignment4::Tag> IndexToTag(size_t index) {
    switch (index) {
      case 1:
        return ::test_unionsandwich::UnionSize8Alignment4::Tag::kVariant;
      default:
        return std::nullopt;
    }
  }
};

class SandwichUnionSize8Alignment4 {
 private:
  struct Storage_;

 public:
  SandwichUnionSize8Alignment4(Storage_ storage) noexcept;
  SandwichUnionSize8Alignment4(uint32_t before, ::test_unionsandwich::UnionSize8Alignment4 union_, uint32_t after) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |SandwichUnionSize8Alignment4| only if all of its members are default constructible.
  SandwichUnionSize8Alignment4() = default;
#pragma clang diagnostic pop

  SandwichUnionSize8Alignment4(SandwichUnionSize8Alignment4&&) noexcept = default;
  SandwichUnionSize8Alignment4& operator=(SandwichUnionSize8Alignment4&&) noexcept = default;
  SandwichUnionSize8Alignment4(const SandwichUnionSize8Alignment4& other) noexcept;
  SandwichUnionSize8Alignment4& operator=(const SandwichUnionSize8Alignment4& other) noexcept;

  bool operator==(const SandwichUnionSize8Alignment4& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize8Alignment4, 32>::Equal(this, &other);
  }
  bool operator!=(const SandwichUnionSize8Alignment4& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize8Alignment4, 32>::Equal(this, &other);
  }

  uint32_t
  before() const {
    return storage_.before;
  }

  uint32_t& before() {
    return storage_.before;
  }

  // Setter for before.
  //

  SandwichUnionSize8Alignment4& before(uint32_t value);

  const ::test_unionsandwich::UnionSize8Alignment4&
  union_() const {
    return storage_.union_;
  }

  ::test_unionsandwich::UnionSize8Alignment4& union_() {
    return storage_.union_;
  }

  // Setter for union_.
  //

  SandwichUnionSize8Alignment4& union_(::test_unionsandwich::UnionSize8Alignment4 value);

  uint32_t
  after() const {
    return storage_.after;
  }

  uint32_t& after() {
    return storage_.after;
  }

  // Setter for after.
  //

  SandwichUnionSize8Alignment4& after(uint32_t value);

  SandwichUnionSize8Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    uint32_t before = {};
    ::test_unionsandwich::UnionSize8Alignment4 union_;
    uint32_t after = {};
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize8Alignment4, 32>;
  friend struct ::fidl::internal::MemberVisitor<::test_unionsandwich::SandwichUnionSize8Alignment4>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       &Storage_::before, 0},
                                                   ::fidl::internal::NaturalStructMember<Storage_, ::test_unionsandwich::UnionSize8Alignment4, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::union_, 8}, ::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::after, 24});
  static constexpr auto kPadding = std::make_tuple(::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 0,
                                                       .mask = 0xffffffff00000000,
                                                   },
                                                   ::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 24,
                                                       .mask = 0xffffffff00000000,
                                                   });
};

class UnionSize12Alignment4 {
 private:
  using Storage_ =
      std::variant<
          std::monostate, ::std::array<uint8_t, 6>>;

 public:
  // TODO: share union tag types between wire & natural.
  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  UnionSize12Alignment4(UnionSize12Alignment4&& other) noexcept
      : UnionSize12Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{}) {
    *storage_ = std::move(*other.storage_);
  }
  UnionSize12Alignment4& operator=(UnionSize12Alignment4&& other) noexcept {
    if (this != &other) {
      *storage_ = std::move(*other.storage_);
    }
    return *this;
  }
  UnionSize12Alignment4(const UnionSize12Alignment4& other) noexcept : UnionSize12Alignment4(other.CloneStorage_()) {}
  UnionSize12Alignment4& operator=(const UnionSize12Alignment4& other) noexcept {
    if (this != &other) {
      storage_ = other.CloneStorage_();
    }
    return *this;
  }

  bool operator==(const UnionSize12Alignment4& other) const noexcept {
    return *storage_ == *other.storage_;
  }
  bool operator!=(const UnionSize12Alignment4& other) const noexcept {
    return *storage_ != *other.storage_;
  }

  constexpr ::test_unionsandwich::UnionSize12Alignment4::Tag Which() const {
    return UnionSize12Alignment4::IndexToTag(storage_->index()).value();
  }
  static UnionSize12Alignment4 WithVariant(::std::array<uint8_t, 6> val) {
    return UnionSize12Alignment4(std::make_shared<Storage_>(
        std::in_place_index_t<1>{},
        std::move(val)));
  }

  const ::fidl::internal::UnionMemberView<1, Storage_> variant() const {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  ::fidl::internal::UnionMemberView<1, Storage_> variant() {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  // Sets the union to hold the variant member.
  //

  UnionSize12Alignment4& variant(::std::array<uint8_t, 6> value) {
    storage_->emplace<1>(std::move(value));
    return *this;
  }

  UnionSize12Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag)
      : storage_(std::make_shared<Storage_>()) {}

 private:
  std::shared_ptr<Storage_> storage_;
  std::shared_ptr<Storage_> CloneStorage_() const;
  friend struct ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize12Alignment4>;
  static constexpr auto kMembers = std::make_tuple(
      ::fidl::internal::NaturalUnionMember<::fidl::internal::NaturalCodingConstraintEmpty>(), ::fidl::internal::NaturalUnionMember<fidl::internal::NaturalCodingConstraintEmpty>());

  explicit UnionSize12Alignment4(std::shared_ptr<Storage_> storage) : storage_(std::move(storage)) {}

  static constexpr size_t TagToIndex(::fidl::internal::NaturalDecoder* decoder, ::test_unionsandwich::UnionSize12Alignment4::Tag tag) {
    switch (tag) {
      case ::test_unionsandwich::UnionSize12Alignment4::Tag::kVariant:
        return 1;
      default: {
        decoder->SetError(::fidl::internal::kCodingErrorUnknownUnionTag);
        return 0;
      }
    }
  }

  static constexpr std::optional<::test_unionsandwich::UnionSize12Alignment4::Tag> IndexToTag(size_t index) {
    switch (index) {
      case 1:
        return ::test_unionsandwich::UnionSize12Alignment4::Tag::kVariant;
      default:
        return std::nullopt;
    }
  }
};

class SandwichUnionSize12Alignment4 {
 private:
  struct Storage_;

 public:
  SandwichUnionSize12Alignment4(Storage_ storage) noexcept;
  SandwichUnionSize12Alignment4(uint32_t before, ::test_unionsandwich::UnionSize12Alignment4 union_, int32_t after) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |SandwichUnionSize12Alignment4| only if all of its members are default constructible.
  SandwichUnionSize12Alignment4() = default;
#pragma clang diagnostic pop

  SandwichUnionSize12Alignment4(SandwichUnionSize12Alignment4&&) noexcept = default;
  SandwichUnionSize12Alignment4& operator=(SandwichUnionSize12Alignment4&&) noexcept = default;
  SandwichUnionSize12Alignment4(const SandwichUnionSize12Alignment4& other) noexcept;
  SandwichUnionSize12Alignment4& operator=(const SandwichUnionSize12Alignment4& other) noexcept;

  bool operator==(const SandwichUnionSize12Alignment4& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize12Alignment4, 32>::Equal(this, &other);
  }
  bool operator!=(const SandwichUnionSize12Alignment4& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize12Alignment4, 32>::Equal(this, &other);
  }

  uint32_t
  before() const {
    return storage_.before;
  }

  uint32_t& before() {
    return storage_.before;
  }

  // Setter for before.
  //

  SandwichUnionSize12Alignment4& before(uint32_t value);

  const ::test_unionsandwich::UnionSize12Alignment4&
  union_() const {
    return storage_.union_;
  }

  ::test_unionsandwich::UnionSize12Alignment4& union_() {
    return storage_.union_;
  }

  // Setter for union_.
  //

  SandwichUnionSize12Alignment4& union_(::test_unionsandwich::UnionSize12Alignment4 value);

  int32_t
  after() const {
    return storage_.after;
  }

  int32_t& after() {
    return storage_.after;
  }

  // Setter for after.
  //

  SandwichUnionSize12Alignment4& after(int32_t value);

  SandwichUnionSize12Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    uint32_t before = {};
    ::test_unionsandwich::UnionSize12Alignment4 union_;
    int32_t after = {};
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize12Alignment4, 32>;
  friend struct ::fidl::internal::MemberVisitor<::test_unionsandwich::SandwichUnionSize12Alignment4>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       &Storage_::before, 0},
                                                   ::fidl::internal::NaturalStructMember<Storage_, ::test_unionsandwich::UnionSize12Alignment4, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::union_, 8}, ::fidl::internal::NaturalStructMember<Storage_, int32_t, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::after, 24});
  static constexpr auto kPadding = std::make_tuple(::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 0,
                                                       .mask = 0xffffffff00000000,
                                                   },
                                                   ::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 24,
                                                       .mask = 0xffffffff00000000,
                                                   });
};

class StructSize16Alignment8 {
 private:
  struct Storage_;

 public:
  StructSize16Alignment8(Storage_ storage) noexcept;
  StructSize16Alignment8(uint64_t f1, uint64_t f2) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |StructSize16Alignment8| only if all of its members are default constructible.
  StructSize16Alignment8() = default;
#pragma clang diagnostic pop

  StructSize16Alignment8(StructSize16Alignment8&&) noexcept = default;
  StructSize16Alignment8& operator=(StructSize16Alignment8&&) noexcept = default;
  StructSize16Alignment8(const StructSize16Alignment8& other) noexcept;
  StructSize16Alignment8& operator=(const StructSize16Alignment8& other) noexcept;

  bool operator==(const StructSize16Alignment8& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::StructSize16Alignment8, 16>::Equal(this, &other);
  }
  bool operator!=(const StructSize16Alignment8& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::StructSize16Alignment8, 16>::Equal(this, &other);
  }

  uint64_t
  f1() const {
    return storage_.f1;
  }

  uint64_t& f1() {
    return storage_.f1;
  }

  // Setter for f1.
  //

  StructSize16Alignment8& f1(uint64_t value);

  uint64_t
  f2() const {
    return storage_.f2;
  }

  uint64_t& f2() {
    return storage_.f2;
  }

  // Setter for f2.
  //

  StructSize16Alignment8& f2(uint64_t value);

  StructSize16Alignment8(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    uint64_t f1 = {};
    uint64_t f2 = {};
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::StructSize16Alignment8, 16>;
  friend struct ::fidl::internal::MemberVisitor<::test_unionsandwich::StructSize16Alignment8>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, uint64_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       &Storage_::f1, 0},
                                                   ::fidl::internal::NaturalStructMember<Storage_, uint64_t, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::f2, 8});
  static constexpr auto kPadding = std::make_tuple();
};

class UnionSize24Alignment8 {
 private:
  using Storage_ =
      std::variant<
          std::monostate, ::test_unionsandwich::StructSize16Alignment8>;

 public:
  // TODO: share union tag types between wire & natural.
  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  UnionSize24Alignment8(UnionSize24Alignment8&& other) noexcept
      : UnionSize24Alignment8(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{}) {
    *storage_ = std::move(*other.storage_);
  }
  UnionSize24Alignment8& operator=(UnionSize24Alignment8&& other) noexcept {
    if (this != &other) {
      *storage_ = std::move(*other.storage_);
    }
    return *this;
  }
  UnionSize24Alignment8(const UnionSize24Alignment8& other) noexcept : UnionSize24Alignment8(other.CloneStorage_()) {}
  UnionSize24Alignment8& operator=(const UnionSize24Alignment8& other) noexcept {
    if (this != &other) {
      storage_ = other.CloneStorage_();
    }
    return *this;
  }

  bool operator==(const UnionSize24Alignment8& other) const noexcept {
    return *storage_ == *other.storage_;
  }
  bool operator!=(const UnionSize24Alignment8& other) const noexcept {
    return *storage_ != *other.storage_;
  }

  constexpr ::test_unionsandwich::UnionSize24Alignment8::Tag Which() const {
    return UnionSize24Alignment8::IndexToTag(storage_->index()).value();
  }
  static UnionSize24Alignment8 WithVariant(::test_unionsandwich::StructSize16Alignment8 val) {
    return UnionSize24Alignment8(std::make_shared<Storage_>(
        std::in_place_index_t<1>{},
        std::move(val)));
  }

  const ::fidl::internal::UnionMemberView<1, Storage_> variant() const {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  ::fidl::internal::UnionMemberView<1, Storage_> variant() {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  // Sets the union to hold the variant member.
  //

  UnionSize24Alignment8& variant(::test_unionsandwich::StructSize16Alignment8 value) {
    storage_->emplace<1>(std::move(value));
    return *this;
  }

  UnionSize24Alignment8(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag)
      : storage_(std::make_shared<Storage_>()) {}

 private:
  std::shared_ptr<Storage_> storage_;
  std::shared_ptr<Storage_> CloneStorage_() const;
  friend struct ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize24Alignment8>;
  static constexpr auto kMembers = std::make_tuple(
      ::fidl::internal::NaturalUnionMember<::fidl::internal::NaturalCodingConstraintEmpty>(), ::fidl::internal::NaturalUnionMember<fidl::internal::NaturalCodingConstraintEmpty>());

  explicit UnionSize24Alignment8(std::shared_ptr<Storage_> storage) : storage_(std::move(storage)) {}

  static constexpr size_t TagToIndex(::fidl::internal::NaturalDecoder* decoder, ::test_unionsandwich::UnionSize24Alignment8::Tag tag) {
    switch (tag) {
      case ::test_unionsandwich::UnionSize24Alignment8::Tag::kVariant:
        return 1;
      default: {
        decoder->SetError(::fidl::internal::kCodingErrorUnknownUnionTag);
        return 0;
      }
    }
  }

  static constexpr std::optional<::test_unionsandwich::UnionSize24Alignment8::Tag> IndexToTag(size_t index) {
    switch (index) {
      case 1:
        return ::test_unionsandwich::UnionSize24Alignment8::Tag::kVariant;
      default:
        return std::nullopt;
    }
  }
};

class SandwichUnionSize24Alignment8 {
 private:
  struct Storage_;

 public:
  SandwichUnionSize24Alignment8(Storage_ storage) noexcept;
  SandwichUnionSize24Alignment8(uint32_t before, ::test_unionsandwich::UnionSize24Alignment8 union_, uint32_t after) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |SandwichUnionSize24Alignment8| only if all of its members are default constructible.
  SandwichUnionSize24Alignment8() = default;
#pragma clang diagnostic pop

  SandwichUnionSize24Alignment8(SandwichUnionSize24Alignment8&&) noexcept = default;
  SandwichUnionSize24Alignment8& operator=(SandwichUnionSize24Alignment8&&) noexcept = default;
  SandwichUnionSize24Alignment8(const SandwichUnionSize24Alignment8& other) noexcept;
  SandwichUnionSize24Alignment8& operator=(const SandwichUnionSize24Alignment8& other) noexcept;

  bool operator==(const SandwichUnionSize24Alignment8& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize24Alignment8, 32>::Equal(this, &other);
  }
  bool operator!=(const SandwichUnionSize24Alignment8& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize24Alignment8, 32>::Equal(this, &other);
  }

  uint32_t
  before() const {
    return storage_.before;
  }

  uint32_t& before() {
    return storage_.before;
  }

  // Setter for before.
  //

  SandwichUnionSize24Alignment8& before(uint32_t value);

  const ::test_unionsandwich::UnionSize24Alignment8&
  union_() const {
    return storage_.union_;
  }

  ::test_unionsandwich::UnionSize24Alignment8& union_() {
    return storage_.union_;
  }

  // Setter for union_.
  //

  SandwichUnionSize24Alignment8& union_(::test_unionsandwich::UnionSize24Alignment8 value);

  uint32_t
  after() const {
    return storage_.after;
  }

  uint32_t& after() {
    return storage_.after;
  }

  // Setter for after.
  //

  SandwichUnionSize24Alignment8& after(uint32_t value);

  SandwichUnionSize24Alignment8(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    uint32_t before = {};
    ::test_unionsandwich::UnionSize24Alignment8 union_;
    uint32_t after = {};
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize24Alignment8, 32>;
  friend struct ::fidl::internal::MemberVisitor<::test_unionsandwich::SandwichUnionSize24Alignment8>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       &Storage_::before, 0},
                                                   ::fidl::internal::NaturalStructMember<Storage_, ::test_unionsandwich::UnionSize24Alignment8, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::union_, 8}, ::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::after, 24});
  static constexpr auto kPadding = std::make_tuple(::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 0,
                                                       .mask = 0xffffffff00000000,
                                                   },
                                                   ::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 24,
                                                       .mask = 0xffffffff00000000,
                                                   });
};

class UnionSize36Alignment4 {
 private:
  using Storage_ =
      std::variant<
          std::monostate, ::std::array<uint8_t, 32>>;

 public:
  // TODO: share union tag types between wire & natural.
  enum class Tag : fidl_xunion_tag_t {
    kVariant = 1,  // 0x1
  };

  UnionSize36Alignment4(UnionSize36Alignment4&& other) noexcept
      : UnionSize36Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{}) {
    *storage_ = std::move(*other.storage_);
  }
  UnionSize36Alignment4& operator=(UnionSize36Alignment4&& other) noexcept {
    if (this != &other) {
      *storage_ = std::move(*other.storage_);
    }
    return *this;
  }
  UnionSize36Alignment4(const UnionSize36Alignment4& other) noexcept : UnionSize36Alignment4(other.CloneStorage_()) {}
  UnionSize36Alignment4& operator=(const UnionSize36Alignment4& other) noexcept {
    if (this != &other) {
      storage_ = other.CloneStorage_();
    }
    return *this;
  }

  bool operator==(const UnionSize36Alignment4& other) const noexcept {
    return *storage_ == *other.storage_;
  }
  bool operator!=(const UnionSize36Alignment4& other) const noexcept {
    return *storage_ != *other.storage_;
  }

  constexpr ::test_unionsandwich::UnionSize36Alignment4::Tag Which() const {
    return UnionSize36Alignment4::IndexToTag(storage_->index()).value();
  }
  static UnionSize36Alignment4 WithVariant(::std::array<uint8_t, 32> val) {
    return UnionSize36Alignment4(std::make_shared<Storage_>(
        std::in_place_index_t<1>{},
        std::move(val)));
  }

  const ::fidl::internal::UnionMemberView<1, Storage_> variant() const {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  ::fidl::internal::UnionMemberView<1, Storage_> variant() {
    return ::fidl::internal::UnionMemberView<1, Storage_>(storage_);
  }

  // Sets the union to hold the variant member.
  //

  UnionSize36Alignment4& variant(::std::array<uint8_t, 32> value) {
    storage_->emplace<1>(std::move(value));
    return *this;
  }

  UnionSize36Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag)
      : storage_(std::make_shared<Storage_>()) {}

 private:
  std::shared_ptr<Storage_> storage_;
  std::shared_ptr<Storage_> CloneStorage_() const;
  friend struct ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize36Alignment4>;
  static constexpr auto kMembers = std::make_tuple(
      ::fidl::internal::NaturalUnionMember<::fidl::internal::NaturalCodingConstraintEmpty>(), ::fidl::internal::NaturalUnionMember<fidl::internal::NaturalCodingConstraintEmpty>());

  explicit UnionSize36Alignment4(std::shared_ptr<Storage_> storage) : storage_(std::move(storage)) {}

  static constexpr size_t TagToIndex(::fidl::internal::NaturalDecoder* decoder, ::test_unionsandwich::UnionSize36Alignment4::Tag tag) {
    switch (tag) {
      case ::test_unionsandwich::UnionSize36Alignment4::Tag::kVariant:
        return 1;
      default: {
        decoder->SetError(::fidl::internal::kCodingErrorUnknownUnionTag);
        return 0;
      }
    }
  }

  static constexpr std::optional<::test_unionsandwich::UnionSize36Alignment4::Tag> IndexToTag(size_t index) {
    switch (index) {
      case 1:
        return ::test_unionsandwich::UnionSize36Alignment4::Tag::kVariant;
      default:
        return std::nullopt;
    }
  }
};

class SandwichUnionSize36Alignment4 {
 private:
  struct Storage_;

 public:
  SandwichUnionSize36Alignment4(Storage_ storage) noexcept;
  SandwichUnionSize36Alignment4(uint32_t before, ::test_unionsandwich::UnionSize36Alignment4 union_, uint32_t after) noexcept;

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wdefaulted-function-deleted"
  // Default constructs a |SandwichUnionSize36Alignment4| only if all of its members are default constructible.
  SandwichUnionSize36Alignment4() = default;
#pragma clang diagnostic pop

  SandwichUnionSize36Alignment4(SandwichUnionSize36Alignment4&&) noexcept = default;
  SandwichUnionSize36Alignment4& operator=(SandwichUnionSize36Alignment4&&) noexcept = default;
  SandwichUnionSize36Alignment4(const SandwichUnionSize36Alignment4& other) noexcept;
  SandwichUnionSize36Alignment4& operator=(const SandwichUnionSize36Alignment4& other) noexcept;

  bool operator==(const SandwichUnionSize36Alignment4& other) const noexcept {
    return ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize36Alignment4, 32>::Equal(this, &other);
  }
  bool operator!=(const SandwichUnionSize36Alignment4& other) const noexcept {
    return !::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize36Alignment4, 32>::Equal(this, &other);
  }

  uint32_t
  before() const {
    return storage_.before;
  }

  uint32_t& before() {
    return storage_.before;
  }

  // Setter for before.
  //

  SandwichUnionSize36Alignment4& before(uint32_t value);

  const ::test_unionsandwich::UnionSize36Alignment4&
  union_() const {
    return storage_.union_;
  }

  ::test_unionsandwich::UnionSize36Alignment4& union_() {
    return storage_.union_;
  }

  // Setter for union_.
  //

  SandwichUnionSize36Alignment4& union_(::test_unionsandwich::UnionSize36Alignment4 value);

  uint32_t
  after() const {
    return storage_.after;
  }

  uint32_t& after() {
    return storage_.after;
  }

  // Setter for after.
  //

  SandwichUnionSize36Alignment4& after(uint32_t value);

  SandwichUnionSize36Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    uint32_t before = {};
    ::test_unionsandwich::UnionSize36Alignment4 union_;
    uint32_t after = {};
  };

  Storage_ storage_;
  Storage_ CloneStorage_() const;

  friend struct ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize36Alignment4, 32>;
  friend struct ::fidl::internal::MemberVisitor<::test_unionsandwich::SandwichUnionSize36Alignment4>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       &Storage_::before, 0},
                                                   ::fidl::internal::NaturalStructMember<Storage_, ::test_unionsandwich::UnionSize36Alignment4, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::union_, 8}, ::fidl::internal::NaturalStructMember<Storage_, uint32_t, fidl::internal::NaturalCodingConstraintEmpty>{&Storage_::after, 24});
  static constexpr auto kPadding = std::make_tuple(::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 0,
                                                       .mask = 0xffffffff00000000,
                                                   },
                                                   ::fidl::internal::NaturalStructPadding<uint64_t>{
                                                       .offset = 24,
                                                       .mask = 0xffffffff00000000,
                                                   });
};

inline SandwichUnionSize8Alignment4::SandwichUnionSize8Alignment4(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline SandwichUnionSize8Alignment4::SandwichUnionSize8Alignment4(uint32_t before, ::test_unionsandwich::UnionSize8Alignment4 union_, uint32_t after) noexcept
    : storage_({.before = std::move(before),
                .union_ = std::move(union_),
                .after = std::move(after)}) {}
inline SandwichUnionSize8Alignment4::SandwichUnionSize8Alignment4(const ::test_unionsandwich::SandwichUnionSize8Alignment4& other) noexcept : ::test_unionsandwich::SandwichUnionSize8Alignment4(other.CloneStorage_()) {}
inline SandwichUnionSize8Alignment4& ::test_unionsandwich::SandwichUnionSize8Alignment4::operator=(const ::test_unionsandwich::SandwichUnionSize8Alignment4 & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline SandwichUnionSize8Alignment4::SandwichUnionSize8Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : SandwichUnionSize8Alignment4(Storage_{
                                                                                                                                    .before = {},
                                                                                                                                    .union_ = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                                    .after = {},
                                                                                                                                }) {}
inline SandwichUnionSize8Alignment4& SandwichUnionSize8Alignment4::before(uint32_t value) {
  storage_.before = std::move(value);
  return *this;
}
inline SandwichUnionSize8Alignment4& SandwichUnionSize8Alignment4::union_(::test_unionsandwich::UnionSize8Alignment4 value) {
  storage_.union_ = std::move(value);
  return *this;
}
inline SandwichUnionSize8Alignment4& SandwichUnionSize8Alignment4::after(uint32_t value) {
  storage_.after = std::move(value);
  return *this;
}

inline SandwichUnionSize12Alignment4::SandwichUnionSize12Alignment4(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline SandwichUnionSize12Alignment4::SandwichUnionSize12Alignment4(uint32_t before, ::test_unionsandwich::UnionSize12Alignment4 union_, int32_t after) noexcept
    : storage_({.before = std::move(before),
                .union_ = std::move(union_),
                .after = std::move(after)}) {}
inline SandwichUnionSize12Alignment4::SandwichUnionSize12Alignment4(const ::test_unionsandwich::SandwichUnionSize12Alignment4& other) noexcept : ::test_unionsandwich::SandwichUnionSize12Alignment4(other.CloneStorage_()) {}
inline SandwichUnionSize12Alignment4& ::test_unionsandwich::SandwichUnionSize12Alignment4::operator=(const ::test_unionsandwich::SandwichUnionSize12Alignment4 & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline SandwichUnionSize12Alignment4::SandwichUnionSize12Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : SandwichUnionSize12Alignment4(Storage_{
                                                                                                                                      .before = {},
                                                                                                                                      .union_ = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                                      .after = {},
                                                                                                                                  }) {}
inline SandwichUnionSize12Alignment4& SandwichUnionSize12Alignment4::before(uint32_t value) {
  storage_.before = std::move(value);
  return *this;
}
inline SandwichUnionSize12Alignment4& SandwichUnionSize12Alignment4::union_(::test_unionsandwich::UnionSize12Alignment4 value) {
  storage_.union_ = std::move(value);
  return *this;
}
inline SandwichUnionSize12Alignment4& SandwichUnionSize12Alignment4::after(int32_t value) {
  storage_.after = std::move(value);
  return *this;
}

inline StructSize16Alignment8::StructSize16Alignment8(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline StructSize16Alignment8::StructSize16Alignment8(uint64_t f1, uint64_t f2) noexcept
    : storage_({.f1 = std::move(f1),
                .f2 = std::move(f2)}) {}
inline StructSize16Alignment8::StructSize16Alignment8(const ::test_unionsandwich::StructSize16Alignment8& other) noexcept : ::test_unionsandwich::StructSize16Alignment8(other.CloneStorage_()) {}
inline StructSize16Alignment8& ::test_unionsandwich::StructSize16Alignment8::operator=(const ::test_unionsandwich::StructSize16Alignment8 & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline StructSize16Alignment8::StructSize16Alignment8(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : StructSize16Alignment8(Storage_{
                                                                                                                        .f1 = {},
                                                                                                                        .f2 = {},
                                                                                                                    }) {}
inline StructSize16Alignment8& StructSize16Alignment8::f1(uint64_t value) {
  storage_.f1 = std::move(value);
  return *this;
}
inline StructSize16Alignment8& StructSize16Alignment8::f2(uint64_t value) {
  storage_.f2 = std::move(value);
  return *this;
}

inline SandwichUnionSize24Alignment8::SandwichUnionSize24Alignment8(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline SandwichUnionSize24Alignment8::SandwichUnionSize24Alignment8(uint32_t before, ::test_unionsandwich::UnionSize24Alignment8 union_, uint32_t after) noexcept
    : storage_({.before = std::move(before),
                .union_ = std::move(union_),
                .after = std::move(after)}) {}
inline SandwichUnionSize24Alignment8::SandwichUnionSize24Alignment8(const ::test_unionsandwich::SandwichUnionSize24Alignment8& other) noexcept : ::test_unionsandwich::SandwichUnionSize24Alignment8(other.CloneStorage_()) {}
inline SandwichUnionSize24Alignment8& ::test_unionsandwich::SandwichUnionSize24Alignment8::operator=(const ::test_unionsandwich::SandwichUnionSize24Alignment8 & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline SandwichUnionSize24Alignment8::SandwichUnionSize24Alignment8(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : SandwichUnionSize24Alignment8(Storage_{
                                                                                                                                      .before = {},
                                                                                                                                      .union_ = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                                      .after = {},
                                                                                                                                  }) {}
inline SandwichUnionSize24Alignment8& SandwichUnionSize24Alignment8::before(uint32_t value) {
  storage_.before = std::move(value);
  return *this;
}
inline SandwichUnionSize24Alignment8& SandwichUnionSize24Alignment8::union_(::test_unionsandwich::UnionSize24Alignment8 value) {
  storage_.union_ = std::move(value);
  return *this;
}
inline SandwichUnionSize24Alignment8& SandwichUnionSize24Alignment8::after(uint32_t value) {
  storage_.after = std::move(value);
  return *this;
}

inline SandwichUnionSize36Alignment4::SandwichUnionSize36Alignment4(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline SandwichUnionSize36Alignment4::SandwichUnionSize36Alignment4(uint32_t before, ::test_unionsandwich::UnionSize36Alignment4 union_, uint32_t after) noexcept
    : storage_({.before = std::move(before),
                .union_ = std::move(union_),
                .after = std::move(after)}) {}
inline SandwichUnionSize36Alignment4::SandwichUnionSize36Alignment4(const ::test_unionsandwich::SandwichUnionSize36Alignment4& other) noexcept : ::test_unionsandwich::SandwichUnionSize36Alignment4(other.CloneStorage_()) {}
inline SandwichUnionSize36Alignment4& ::test_unionsandwich::SandwichUnionSize36Alignment4::operator=(const ::test_unionsandwich::SandwichUnionSize36Alignment4 & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline SandwichUnionSize36Alignment4::SandwichUnionSize36Alignment4(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : SandwichUnionSize36Alignment4(Storage_{
                                                                                                                                      .before = {},
                                                                                                                                      .union_ = ::fidl::internal::DefaultConstructPossiblyInvalidObjectTag{},
                                                                                                                                      .after = {},
                                                                                                                                  }) {}
inline SandwichUnionSize36Alignment4& SandwichUnionSize36Alignment4::before(uint32_t value) {
  storage_.before = std::move(value);
  return *this;
}
inline SandwichUnionSize36Alignment4& SandwichUnionSize36Alignment4::union_(::test_unionsandwich::UnionSize36Alignment4 value) {
  storage_.union_ = std::move(value);
  return *this;
}
inline SandwichUnionSize36Alignment4& SandwichUnionSize36Alignment4::after(uint32_t value) {
  storage_.after = std::move(value);
  return *this;
}

}  // namespace test_unionsandwich
namespace fidl {

template <>
struct IsFidlType<::test_unionsandwich::SandwichUnionSize8Alignment4> : public std::true_type {};

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

template <>
struct IsStruct<::test_unionsandwich::SandwichUnionSize8Alignment4> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::SandwichUnionSize8Alignment4, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize8Alignment4, 32> {};

template <>
struct IsFidlType<::test_unionsandwich::SandwichUnionSize12Alignment4> : public std::true_type {};

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

template <>
struct IsStruct<::test_unionsandwich::SandwichUnionSize12Alignment4> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::SandwichUnionSize12Alignment4, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize12Alignment4, 32> {};

template <>
struct IsFidlType<::test_unionsandwich::StructSize16Alignment8> : public std::true_type {};

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

template <>
struct IsStruct<::test_unionsandwich::StructSize16Alignment8> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::StructSize16Alignment8, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::StructSize16Alignment8, 16> {};

template <>
struct IsFidlType<::test_unionsandwich::SandwichUnionSize24Alignment8> : public std::true_type {};

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

template <>
struct IsStruct<::test_unionsandwich::SandwichUnionSize24Alignment8> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::SandwichUnionSize24Alignment8, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize24Alignment8, 32> {};

template <>
struct IsFidlType<::test_unionsandwich::SandwichUnionSize36Alignment4> : public std::true_type {};

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

template <>
struct IsStruct<::test_unionsandwich::SandwichUnionSize36Alignment4> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::SandwichUnionSize36Alignment4, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalStructCodingTraits<::test_unionsandwich::SandwichUnionSize36Alignment4, 32> {};

template <>
struct IsFidlType<::test_unionsandwich::UnionSize8Alignment4> : public std::true_type {};

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

template <>
struct IsUnion<::test_unionsandwich::UnionSize8Alignment4> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::UnionSize8Alignment4, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize8Alignment4> {};

template <>
struct IsFidlType<::test_unionsandwich::UnionSize12Alignment4> : public std::true_type {};

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

template <>
struct IsUnion<::test_unionsandwich::UnionSize12Alignment4> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::UnionSize12Alignment4, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize12Alignment4> {};

template <>
struct IsFidlType<::test_unionsandwich::UnionSize24Alignment8> : public std::true_type {};

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

template <>
struct IsUnion<::test_unionsandwich::UnionSize24Alignment8> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::UnionSize24Alignment8, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize24Alignment8> {};

template <>
struct IsFidlType<::test_unionsandwich::UnionSize36Alignment4> : public std::true_type {};

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

template <>
struct IsUnion<::test_unionsandwich::UnionSize36Alignment4> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_unionsandwich::UnionSize36Alignment4, ::fidl::internal::NaturalCodingConstraintEmpty> final
    : public ::fidl::internal::NaturalUnionCodingTraits<::test_unionsandwich::UnionSize36Alignment4> {};

#pragma clang diagnostic pop

}  // namespace fidl
