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

// fidl_experiment = output_index_json

#pragma once

#include <fidl/test.table/cpp/common_types.h>
#include <fidl/test.table/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_table {

class EmptyTable;

class SimpleTable;

class OlderSimpleTable;

class NewerSimpleTable;

class ReverseOrdinalTable;

class TableWithAttributes;

class ExtensionTable;

class SixtyFourOrdinalTable;

class EmptyTable {
 private:
  struct Storage_;

 public:
  EmptyTable(Storage_ storage) noexcept;
  EmptyTable() noexcept = default;
  EmptyTable(EmptyTable&&) noexcept = default;
  EmptyTable& operator=(EmptyTable&&) noexcept = default;
  EmptyTable(const EmptyTable& other) noexcept;
  EmptyTable& operator=(const EmptyTable& other) noexcept;
  bool operator==(const EmptyTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::EmptyTable>::Equal(this, &other);
  }
  bool operator!=(const EmptyTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::EmptyTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return true;
  }

  EmptyTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::EmptyTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::EmptyTable>;
  static constexpr auto kMembers = std::make_tuple();
};

class SimpleTable {
 private:
  struct Storage_;

 public:
  SimpleTable(Storage_ storage) noexcept;
  SimpleTable() noexcept = default;
  SimpleTable(SimpleTable&&) noexcept = default;
  SimpleTable& operator=(SimpleTable&&) noexcept = default;
  SimpleTable(const SimpleTable& other) noexcept;
  SimpleTable& operator=(const SimpleTable& other) noexcept;
  bool operator==(const SimpleTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::SimpleTable>::Equal(this, &other);
  }
  bool operator!=(const SimpleTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::SimpleTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return !(storage_.x.has_value() || storage_.y.has_value());
  }

  const std::optional<int64_t>& x() const { return storage_.x; }
  ::std::optional<int64_t>& x() { return storage_.x; }

  // Setter for x.
  //

  SimpleTable& x(std::optional<int64_t> value);

  const std::optional<int64_t>& y() const { return storage_.y; }
  ::std::optional<int64_t>& y() { return storage_.y; }

  // Setter for y.
  //

  SimpleTable& y(std::optional<int64_t> value);

  SimpleTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::std::optional<int64_t> x;
    ::std::optional<int64_t> y;
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::SimpleTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::SimpleTable>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       1, &Storage_::x},
                                                   ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{5, &Storage_::y});
};

class OlderSimpleTable {
 private:
  struct Storage_;

 public:
  OlderSimpleTable(Storage_ storage) noexcept;
  OlderSimpleTable() noexcept = default;
  OlderSimpleTable(OlderSimpleTable&&) noexcept = default;
  OlderSimpleTable& operator=(OlderSimpleTable&&) noexcept = default;
  OlderSimpleTable(const OlderSimpleTable& other) noexcept;
  OlderSimpleTable& operator=(const OlderSimpleTable& other) noexcept;
  bool operator==(const OlderSimpleTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::OlderSimpleTable>::Equal(this, &other);
  }
  bool operator!=(const OlderSimpleTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::OlderSimpleTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return !(storage_.x.has_value());
  }

  const std::optional<int64_t>& x() const { return storage_.x; }
  ::std::optional<int64_t>& x() { return storage_.x; }

  // Setter for x.
  //

  OlderSimpleTable& x(std::optional<int64_t> value);

  OlderSimpleTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::std::optional<int64_t> x;
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::OlderSimpleTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::OlderSimpleTable>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{
      1, &Storage_::x});
};

class NewerSimpleTable {
 private:
  struct Storage_;

 public:
  NewerSimpleTable(Storage_ storage) noexcept;
  NewerSimpleTable() noexcept = default;
  NewerSimpleTable(NewerSimpleTable&&) noexcept = default;
  NewerSimpleTable& operator=(NewerSimpleTable&&) noexcept = default;
  NewerSimpleTable(const NewerSimpleTable& other) noexcept;
  NewerSimpleTable& operator=(const NewerSimpleTable& other) noexcept;
  bool operator==(const NewerSimpleTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::NewerSimpleTable>::Equal(this, &other);
  }
  bool operator!=(const NewerSimpleTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::NewerSimpleTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return !(storage_.x.has_value() || storage_.y.has_value() || storage_.z.has_value());
  }

  const std::optional<int64_t>& x() const { return storage_.x; }
  ::std::optional<int64_t>& x() { return storage_.x; }

  // Setter for x.
  //

  NewerSimpleTable& x(std::optional<int64_t> value);

  const std::optional<int64_t>& y() const { return storage_.y; }
  ::std::optional<int64_t>& y() { return storage_.y; }

  // Setter for y.
  //

  NewerSimpleTable& y(std::optional<int64_t> value);

  const std::optional<int64_t>& z() const { return storage_.z; }
  ::std::optional<int64_t>& z() { return storage_.z; }

  // Setter for z.
  //

  NewerSimpleTable& z(std::optional<int64_t> value);

  NewerSimpleTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::std::optional<int64_t> x;
    ::std::optional<int64_t> y;
    ::std::optional<int64_t> z;
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::NewerSimpleTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::NewerSimpleTable>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       1, &Storage_::x},
                                                   ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{5, &Storage_::y}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{6, &Storage_::z});
};

class ReverseOrdinalTable {
 private:
  struct Storage_;

 public:
  ReverseOrdinalTable(Storage_ storage) noexcept;
  ReverseOrdinalTable() noexcept = default;
  ReverseOrdinalTable(ReverseOrdinalTable&&) noexcept = default;
  ReverseOrdinalTable& operator=(ReverseOrdinalTable&&) noexcept = default;
  ReverseOrdinalTable(const ReverseOrdinalTable& other) noexcept;
  ReverseOrdinalTable& operator=(const ReverseOrdinalTable& other) noexcept;
  bool operator==(const ReverseOrdinalTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::ReverseOrdinalTable>::Equal(this, &other);
  }
  bool operator!=(const ReverseOrdinalTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::ReverseOrdinalTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return !(storage_.z.has_value() || storage_.y.has_value() || storage_.x.has_value());
  }

  const std::optional<int64_t>& z() const { return storage_.z; }
  ::std::optional<int64_t>& z() { return storage_.z; }

  // Setter for z.
  //

  ReverseOrdinalTable& z(std::optional<int64_t> value);

  const std::optional<int64_t>& y() const { return storage_.y; }
  ::std::optional<int64_t>& y() { return storage_.y; }

  // Setter for y.
  //

  ReverseOrdinalTable& y(std::optional<int64_t> value);

  const std::optional<int64_t>& x() const { return storage_.x; }
  ::std::optional<int64_t>& x() { return storage_.x; }

  // Setter for x.
  //

  ReverseOrdinalTable& x(std::optional<int64_t> value);

  ReverseOrdinalTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::std::optional<int64_t> z;
    ::std::optional<int64_t> y;
    ::std::optional<int64_t> x;
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::ReverseOrdinalTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::ReverseOrdinalTable>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       1, &Storage_::z},
                                                   ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{2, &Storage_::y}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{3, &Storage_::x});
};

class TableWithAttributes {
 private:
  struct Storage_;

 public:
  TableWithAttributes(Storage_ storage) noexcept;
  TableWithAttributes() noexcept = default;
  TableWithAttributes(TableWithAttributes&&) noexcept = default;
  TableWithAttributes& operator=(TableWithAttributes&&) noexcept = default;
  TableWithAttributes(const TableWithAttributes& other) noexcept;
  TableWithAttributes& operator=(const TableWithAttributes& other) noexcept;
  bool operator==(const TableWithAttributes& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::TableWithAttributes>::Equal(this, &other);
  }
  bool operator!=(const TableWithAttributes& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::TableWithAttributes>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return !(storage_.x.has_value());
  }

  const std::optional<int64_t>& x() const { return storage_.x; }
  ::std::optional<int64_t>& x() { return storage_.x; }

  // Setter for x.
  //

  TableWithAttributes& x(std::optional<int64_t> value);

  TableWithAttributes(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::std::optional<int64_t> x;
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::TableWithAttributes>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::TableWithAttributes>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{
      1, &Storage_::x});
};

class ExtensionTable {
 private:
  struct Storage_;

 public:
  ExtensionTable(Storage_ storage) noexcept;
  ExtensionTable() noexcept = default;
  ExtensionTable(ExtensionTable&&) noexcept = default;
  ExtensionTable& operator=(ExtensionTable&&) noexcept = default;
  ExtensionTable(const ExtensionTable& other) noexcept;
  ExtensionTable& operator=(const ExtensionTable& other) noexcept;
  bool operator==(const ExtensionTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::ExtensionTable>::Equal(this, &other);
  }
  bool operator!=(const ExtensionTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::ExtensionTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return true;
  }

  ExtensionTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::ExtensionTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::ExtensionTable>;
  static constexpr auto kMembers = std::make_tuple();
};

class SixtyFourOrdinalTable {
 private:
  struct Storage_;

 public:
  SixtyFourOrdinalTable(Storage_ storage) noexcept;
  SixtyFourOrdinalTable() noexcept = default;
  SixtyFourOrdinalTable(SixtyFourOrdinalTable&&) noexcept = default;
  SixtyFourOrdinalTable& operator=(SixtyFourOrdinalTable&&) noexcept = default;
  SixtyFourOrdinalTable(const SixtyFourOrdinalTable& other) noexcept;
  SixtyFourOrdinalTable& operator=(const SixtyFourOrdinalTable& other) noexcept;
  bool operator==(const SixtyFourOrdinalTable& other) const noexcept {
    return ::fidl::internal::NaturalTableCodingTraits<::test_table::SixtyFourOrdinalTable>::Equal(this, &other);
  }
  bool operator!=(const SixtyFourOrdinalTable& other) const noexcept {
    return !::fidl::internal::NaturalTableCodingTraits<::test_table::SixtyFourOrdinalTable>::Equal(this, &other);
  }

  bool IsEmpty() const {
    return !(storage_.v1.has_value() || storage_.v2.has_value() || storage_.v3.has_value() || storage_.v4.has_value() || storage_.v5.has_value() || storage_.v6.has_value() || storage_.v7.has_value() || storage_.v8.has_value() || storage_.v9.has_value() || storage_.v10.has_value() || storage_.v11.has_value() || storage_.v12.has_value() || storage_.v13.has_value() || storage_.v14.has_value() || storage_.v15.has_value() || storage_.v16.has_value() || storage_.v17.has_value() || storage_.v18.has_value() || storage_.v19.has_value() || storage_.v20.has_value() || storage_.v21.has_value() || storage_.v22.has_value() || storage_.v23.has_value() || storage_.v24.has_value() || storage_.v25.has_value() || storage_.v26.has_value() || storage_.v27.has_value() || storage_.v28.has_value() || storage_.v29.has_value() || storage_.v30.has_value() || storage_.v31.has_value() || storage_.v32.has_value() || storage_.v33.has_value() || storage_.v34.has_value() || storage_.v35.has_value() || storage_.v36.has_value() || storage_.v37.has_value() || storage_.v38.has_value() || storage_.v39.has_value() || storage_.v40.has_value() || storage_.v41.has_value() || storage_.v42.has_value() || storage_.v43.has_value() || storage_.v44.has_value() || storage_.v45.has_value() || storage_.v46.has_value() || storage_.v47.has_value() || storage_.v48.has_value() || storage_.v49.has_value() || storage_.v50.has_value() || storage_.v51.has_value() || storage_.v52.has_value() || storage_.v53.has_value() || storage_.v54.has_value() || storage_.v55.has_value() || storage_.v56.has_value() || storage_.v57.has_value() || storage_.v58.has_value() || storage_.v59.has_value() || storage_.v60.has_value() || storage_.v61.has_value() || storage_.v62.has_value() || storage_.v63.has_value() || storage_.v64.has_value());
  }

  const std::optional<int64_t>& v1() const { return storage_.v1; }
  ::std::optional<int64_t>& v1() { return storage_.v1; }

  // Setter for v1.
  //

  SixtyFourOrdinalTable& v1(std::optional<int64_t> value);

  const std::optional<int64_t>& v2() const { return storage_.v2; }
  ::std::optional<int64_t>& v2() { return storage_.v2; }

  // Setter for v2.
  //

  SixtyFourOrdinalTable& v2(std::optional<int64_t> value);

  const std::optional<int64_t>& v3() const { return storage_.v3; }
  ::std::optional<int64_t>& v3() { return storage_.v3; }

  // Setter for v3.
  //

  SixtyFourOrdinalTable& v3(std::optional<int64_t> value);

  const std::optional<int64_t>& v4() const { return storage_.v4; }
  ::std::optional<int64_t>& v4() { return storage_.v4; }

  // Setter for v4.
  //

  SixtyFourOrdinalTable& v4(std::optional<int64_t> value);

  const std::optional<int64_t>& v5() const { return storage_.v5; }
  ::std::optional<int64_t>& v5() { return storage_.v5; }

  // Setter for v5.
  //

  SixtyFourOrdinalTable& v5(std::optional<int64_t> value);

  const std::optional<int64_t>& v6() const { return storage_.v6; }
  ::std::optional<int64_t>& v6() { return storage_.v6; }

  // Setter for v6.
  //

  SixtyFourOrdinalTable& v6(std::optional<int64_t> value);

  const std::optional<int64_t>& v7() const { return storage_.v7; }
  ::std::optional<int64_t>& v7() { return storage_.v7; }

  // Setter for v7.
  //

  SixtyFourOrdinalTable& v7(std::optional<int64_t> value);

  const std::optional<int64_t>& v8() const { return storage_.v8; }
  ::std::optional<int64_t>& v8() { return storage_.v8; }

  // Setter for v8.
  //

  SixtyFourOrdinalTable& v8(std::optional<int64_t> value);

  const std::optional<int64_t>& v9() const { return storage_.v9; }
  ::std::optional<int64_t>& v9() { return storage_.v9; }

  // Setter for v9.
  //

  SixtyFourOrdinalTable& v9(std::optional<int64_t> value);

  const std::optional<int64_t>& v10() const { return storage_.v10; }
  ::std::optional<int64_t>& v10() { return storage_.v10; }

  // Setter for v10.
  //

  SixtyFourOrdinalTable& v10(std::optional<int64_t> value);

  const std::optional<int64_t>& v11() const { return storage_.v11; }
  ::std::optional<int64_t>& v11() { return storage_.v11; }

  // Setter for v11.
  //

  SixtyFourOrdinalTable& v11(std::optional<int64_t> value);

  const std::optional<int64_t>& v12() const { return storage_.v12; }
  ::std::optional<int64_t>& v12() { return storage_.v12; }

  // Setter for v12.
  //

  SixtyFourOrdinalTable& v12(std::optional<int64_t> value);

  const std::optional<int64_t>& v13() const { return storage_.v13; }
  ::std::optional<int64_t>& v13() { return storage_.v13; }

  // Setter for v13.
  //

  SixtyFourOrdinalTable& v13(std::optional<int64_t> value);

  const std::optional<int64_t>& v14() const { return storage_.v14; }
  ::std::optional<int64_t>& v14() { return storage_.v14; }

  // Setter for v14.
  //

  SixtyFourOrdinalTable& v14(std::optional<int64_t> value);

  const std::optional<int64_t>& v15() const { return storage_.v15; }
  ::std::optional<int64_t>& v15() { return storage_.v15; }

  // Setter for v15.
  //

  SixtyFourOrdinalTable& v15(std::optional<int64_t> value);

  const std::optional<int64_t>& v16() const { return storage_.v16; }
  ::std::optional<int64_t>& v16() { return storage_.v16; }

  // Setter for v16.
  //

  SixtyFourOrdinalTable& v16(std::optional<int64_t> value);

  const std::optional<int64_t>& v17() const { return storage_.v17; }
  ::std::optional<int64_t>& v17() { return storage_.v17; }

  // Setter for v17.
  //

  SixtyFourOrdinalTable& v17(std::optional<int64_t> value);

  const std::optional<int64_t>& v18() const { return storage_.v18; }
  ::std::optional<int64_t>& v18() { return storage_.v18; }

  // Setter for v18.
  //

  SixtyFourOrdinalTable& v18(std::optional<int64_t> value);

  const std::optional<int64_t>& v19() const { return storage_.v19; }
  ::std::optional<int64_t>& v19() { return storage_.v19; }

  // Setter for v19.
  //

  SixtyFourOrdinalTable& v19(std::optional<int64_t> value);

  const std::optional<int64_t>& v20() const { return storage_.v20; }
  ::std::optional<int64_t>& v20() { return storage_.v20; }

  // Setter for v20.
  //

  SixtyFourOrdinalTable& v20(std::optional<int64_t> value);

  const std::optional<int64_t>& v21() const { return storage_.v21; }
  ::std::optional<int64_t>& v21() { return storage_.v21; }

  // Setter for v21.
  //

  SixtyFourOrdinalTable& v21(std::optional<int64_t> value);

  const std::optional<int64_t>& v22() const { return storage_.v22; }
  ::std::optional<int64_t>& v22() { return storage_.v22; }

  // Setter for v22.
  //

  SixtyFourOrdinalTable& v22(std::optional<int64_t> value);

  const std::optional<int64_t>& v23() const { return storage_.v23; }
  ::std::optional<int64_t>& v23() { return storage_.v23; }

  // Setter for v23.
  //

  SixtyFourOrdinalTable& v23(std::optional<int64_t> value);

  const std::optional<int64_t>& v24() const { return storage_.v24; }
  ::std::optional<int64_t>& v24() { return storage_.v24; }

  // Setter for v24.
  //

  SixtyFourOrdinalTable& v24(std::optional<int64_t> value);

  const std::optional<int64_t>& v25() const { return storage_.v25; }
  ::std::optional<int64_t>& v25() { return storage_.v25; }

  // Setter for v25.
  //

  SixtyFourOrdinalTable& v25(std::optional<int64_t> value);

  const std::optional<int64_t>& v26() const { return storage_.v26; }
  ::std::optional<int64_t>& v26() { return storage_.v26; }

  // Setter for v26.
  //

  SixtyFourOrdinalTable& v26(std::optional<int64_t> value);

  const std::optional<int64_t>& v27() const { return storage_.v27; }
  ::std::optional<int64_t>& v27() { return storage_.v27; }

  // Setter for v27.
  //

  SixtyFourOrdinalTable& v27(std::optional<int64_t> value);

  const std::optional<int64_t>& v28() const { return storage_.v28; }
  ::std::optional<int64_t>& v28() { return storage_.v28; }

  // Setter for v28.
  //

  SixtyFourOrdinalTable& v28(std::optional<int64_t> value);

  const std::optional<int64_t>& v29() const { return storage_.v29; }
  ::std::optional<int64_t>& v29() { return storage_.v29; }

  // Setter for v29.
  //

  SixtyFourOrdinalTable& v29(std::optional<int64_t> value);

  const std::optional<int64_t>& v30() const { return storage_.v30; }
  ::std::optional<int64_t>& v30() { return storage_.v30; }

  // Setter for v30.
  //

  SixtyFourOrdinalTable& v30(std::optional<int64_t> value);

  const std::optional<int64_t>& v31() const { return storage_.v31; }
  ::std::optional<int64_t>& v31() { return storage_.v31; }

  // Setter for v31.
  //

  SixtyFourOrdinalTable& v31(std::optional<int64_t> value);

  const std::optional<int64_t>& v32() const { return storage_.v32; }
  ::std::optional<int64_t>& v32() { return storage_.v32; }

  // Setter for v32.
  //

  SixtyFourOrdinalTable& v32(std::optional<int64_t> value);

  const std::optional<int64_t>& v33() const { return storage_.v33; }
  ::std::optional<int64_t>& v33() { return storage_.v33; }

  // Setter for v33.
  //

  SixtyFourOrdinalTable& v33(std::optional<int64_t> value);

  const std::optional<int64_t>& v34() const { return storage_.v34; }
  ::std::optional<int64_t>& v34() { return storage_.v34; }

  // Setter for v34.
  //

  SixtyFourOrdinalTable& v34(std::optional<int64_t> value);

  const std::optional<int64_t>& v35() const { return storage_.v35; }
  ::std::optional<int64_t>& v35() { return storage_.v35; }

  // Setter for v35.
  //

  SixtyFourOrdinalTable& v35(std::optional<int64_t> value);

  const std::optional<int64_t>& v36() const { return storage_.v36; }
  ::std::optional<int64_t>& v36() { return storage_.v36; }

  // Setter for v36.
  //

  SixtyFourOrdinalTable& v36(std::optional<int64_t> value);

  const std::optional<int64_t>& v37() const { return storage_.v37; }
  ::std::optional<int64_t>& v37() { return storage_.v37; }

  // Setter for v37.
  //

  SixtyFourOrdinalTable& v37(std::optional<int64_t> value);

  const std::optional<int64_t>& v38() const { return storage_.v38; }
  ::std::optional<int64_t>& v38() { return storage_.v38; }

  // Setter for v38.
  //

  SixtyFourOrdinalTable& v38(std::optional<int64_t> value);

  const std::optional<int64_t>& v39() const { return storage_.v39; }
  ::std::optional<int64_t>& v39() { return storage_.v39; }

  // Setter for v39.
  //

  SixtyFourOrdinalTable& v39(std::optional<int64_t> value);

  const std::optional<int64_t>& v40() const { return storage_.v40; }
  ::std::optional<int64_t>& v40() { return storage_.v40; }

  // Setter for v40.
  //

  SixtyFourOrdinalTable& v40(std::optional<int64_t> value);

  const std::optional<int64_t>& v41() const { return storage_.v41; }
  ::std::optional<int64_t>& v41() { return storage_.v41; }

  // Setter for v41.
  //

  SixtyFourOrdinalTable& v41(std::optional<int64_t> value);

  const std::optional<int64_t>& v42() const { return storage_.v42; }
  ::std::optional<int64_t>& v42() { return storage_.v42; }

  // Setter for v42.
  //

  SixtyFourOrdinalTable& v42(std::optional<int64_t> value);

  const std::optional<int64_t>& v43() const { return storage_.v43; }
  ::std::optional<int64_t>& v43() { return storage_.v43; }

  // Setter for v43.
  //

  SixtyFourOrdinalTable& v43(std::optional<int64_t> value);

  const std::optional<int64_t>& v44() const { return storage_.v44; }
  ::std::optional<int64_t>& v44() { return storage_.v44; }

  // Setter for v44.
  //

  SixtyFourOrdinalTable& v44(std::optional<int64_t> value);

  const std::optional<int64_t>& v45() const { return storage_.v45; }
  ::std::optional<int64_t>& v45() { return storage_.v45; }

  // Setter for v45.
  //

  SixtyFourOrdinalTable& v45(std::optional<int64_t> value);

  const std::optional<int64_t>& v46() const { return storage_.v46; }
  ::std::optional<int64_t>& v46() { return storage_.v46; }

  // Setter for v46.
  //

  SixtyFourOrdinalTable& v46(std::optional<int64_t> value);

  const std::optional<int64_t>& v47() const { return storage_.v47; }
  ::std::optional<int64_t>& v47() { return storage_.v47; }

  // Setter for v47.
  //

  SixtyFourOrdinalTable& v47(std::optional<int64_t> value);

  const std::optional<int64_t>& v48() const { return storage_.v48; }
  ::std::optional<int64_t>& v48() { return storage_.v48; }

  // Setter for v48.
  //

  SixtyFourOrdinalTable& v48(std::optional<int64_t> value);

  const std::optional<int64_t>& v49() const { return storage_.v49; }
  ::std::optional<int64_t>& v49() { return storage_.v49; }

  // Setter for v49.
  //

  SixtyFourOrdinalTable& v49(std::optional<int64_t> value);

  const std::optional<int64_t>& v50() const { return storage_.v50; }
  ::std::optional<int64_t>& v50() { return storage_.v50; }

  // Setter for v50.
  //

  SixtyFourOrdinalTable& v50(std::optional<int64_t> value);

  const std::optional<int64_t>& v51() const { return storage_.v51; }
  ::std::optional<int64_t>& v51() { return storage_.v51; }

  // Setter for v51.
  //

  SixtyFourOrdinalTable& v51(std::optional<int64_t> value);

  const std::optional<int64_t>& v52() const { return storage_.v52; }
  ::std::optional<int64_t>& v52() { return storage_.v52; }

  // Setter for v52.
  //

  SixtyFourOrdinalTable& v52(std::optional<int64_t> value);

  const std::optional<int64_t>& v53() const { return storage_.v53; }
  ::std::optional<int64_t>& v53() { return storage_.v53; }

  // Setter for v53.
  //

  SixtyFourOrdinalTable& v53(std::optional<int64_t> value);

  const std::optional<int64_t>& v54() const { return storage_.v54; }
  ::std::optional<int64_t>& v54() { return storage_.v54; }

  // Setter for v54.
  //

  SixtyFourOrdinalTable& v54(std::optional<int64_t> value);

  const std::optional<int64_t>& v55() const { return storage_.v55; }
  ::std::optional<int64_t>& v55() { return storage_.v55; }

  // Setter for v55.
  //

  SixtyFourOrdinalTable& v55(std::optional<int64_t> value);

  const std::optional<int64_t>& v56() const { return storage_.v56; }
  ::std::optional<int64_t>& v56() { return storage_.v56; }

  // Setter for v56.
  //

  SixtyFourOrdinalTable& v56(std::optional<int64_t> value);

  const std::optional<int64_t>& v57() const { return storage_.v57; }
  ::std::optional<int64_t>& v57() { return storage_.v57; }

  // Setter for v57.
  //

  SixtyFourOrdinalTable& v57(std::optional<int64_t> value);

  const std::optional<int64_t>& v58() const { return storage_.v58; }
  ::std::optional<int64_t>& v58() { return storage_.v58; }

  // Setter for v58.
  //

  SixtyFourOrdinalTable& v58(std::optional<int64_t> value);

  const std::optional<int64_t>& v59() const { return storage_.v59; }
  ::std::optional<int64_t>& v59() { return storage_.v59; }

  // Setter for v59.
  //

  SixtyFourOrdinalTable& v59(std::optional<int64_t> value);

  const std::optional<int64_t>& v60() const { return storage_.v60; }
  ::std::optional<int64_t>& v60() { return storage_.v60; }

  // Setter for v60.
  //

  SixtyFourOrdinalTable& v60(std::optional<int64_t> value);

  const std::optional<int64_t>& v61() const { return storage_.v61; }
  ::std::optional<int64_t>& v61() { return storage_.v61; }

  // Setter for v61.
  //

  SixtyFourOrdinalTable& v61(std::optional<int64_t> value);

  const std::optional<int64_t>& v62() const { return storage_.v62; }
  ::std::optional<int64_t>& v62() { return storage_.v62; }

  // Setter for v62.
  //

  SixtyFourOrdinalTable& v62(std::optional<int64_t> value);

  const std::optional<int64_t>& v63() const { return storage_.v63; }
  ::std::optional<int64_t>& v63() { return storage_.v63; }

  // Setter for v63.
  //

  SixtyFourOrdinalTable& v63(std::optional<int64_t> value);

  const std::optional<::test_table::ExtensionTable>& v64() const { return storage_.v64; }
  ::std::optional<::test_table::ExtensionTable>& v64() { return storage_.v64; }

  // Setter for v64.
  //

  SixtyFourOrdinalTable& v64(std::optional<::test_table::ExtensionTable> value);

  SixtyFourOrdinalTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag);

 private:
  struct Storage_ final {
    ::std::optional<int64_t> v1;
    ::std::optional<int64_t> v2;
    ::std::optional<int64_t> v3;
    ::std::optional<int64_t> v4;
    ::std::optional<int64_t> v5;
    ::std::optional<int64_t> v6;
    ::std::optional<int64_t> v7;
    ::std::optional<int64_t> v8;
    ::std::optional<int64_t> v9;
    ::std::optional<int64_t> v10;
    ::std::optional<int64_t> v11;
    ::std::optional<int64_t> v12;
    ::std::optional<int64_t> v13;
    ::std::optional<int64_t> v14;
    ::std::optional<int64_t> v15;
    ::std::optional<int64_t> v16;
    ::std::optional<int64_t> v17;
    ::std::optional<int64_t> v18;
    ::std::optional<int64_t> v19;
    ::std::optional<int64_t> v20;
    ::std::optional<int64_t> v21;
    ::std::optional<int64_t> v22;
    ::std::optional<int64_t> v23;
    ::std::optional<int64_t> v24;
    ::std::optional<int64_t> v25;
    ::std::optional<int64_t> v26;
    ::std::optional<int64_t> v27;
    ::std::optional<int64_t> v28;
    ::std::optional<int64_t> v29;
    ::std::optional<int64_t> v30;
    ::std::optional<int64_t> v31;
    ::std::optional<int64_t> v32;
    ::std::optional<int64_t> v33;
    ::std::optional<int64_t> v34;
    ::std::optional<int64_t> v35;
    ::std::optional<int64_t> v36;
    ::std::optional<int64_t> v37;
    ::std::optional<int64_t> v38;
    ::std::optional<int64_t> v39;
    ::std::optional<int64_t> v40;
    ::std::optional<int64_t> v41;
    ::std::optional<int64_t> v42;
    ::std::optional<int64_t> v43;
    ::std::optional<int64_t> v44;
    ::std::optional<int64_t> v45;
    ::std::optional<int64_t> v46;
    ::std::optional<int64_t> v47;
    ::std::optional<int64_t> v48;
    ::std::optional<int64_t> v49;
    ::std::optional<int64_t> v50;
    ::std::optional<int64_t> v51;
    ::std::optional<int64_t> v52;
    ::std::optional<int64_t> v53;
    ::std::optional<int64_t> v54;
    ::std::optional<int64_t> v55;
    ::std::optional<int64_t> v56;
    ::std::optional<int64_t> v57;
    ::std::optional<int64_t> v58;
    ::std::optional<int64_t> v59;
    ::std::optional<int64_t> v60;
    ::std::optional<int64_t> v61;
    ::std::optional<int64_t> v62;
    ::std::optional<int64_t> v63;
    ::std::optional<::test_table::ExtensionTable> v64;
  };

  // TODO(https://fxbug.dev/42172795): Box the storage.
  Storage_ storage_;
  Storage_ CloneStorage_() const;
  friend struct ::fidl::internal::NaturalTableCodingTraits<::test_table::SixtyFourOrdinalTable>;
  friend struct ::fidl::internal::MemberVisitor<::test_table::SixtyFourOrdinalTable>;
  static constexpr auto kMembers = std::make_tuple(::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{
                                                       1, &Storage_::v1},
                                                   ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{2, &Storage_::v2}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{3, &Storage_::v3}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{4, &Storage_::v4}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{5, &Storage_::v5}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{6, &Storage_::v6}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{7, &Storage_::v7}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{8, &Storage_::v8}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{9, &Storage_::v9}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{10, &Storage_::v10}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{11, &Storage_::v11}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{12, &Storage_::v12}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{13, &Storage_::v13}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{14, &Storage_::v14}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{15, &Storage_::v15}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{16, &Storage_::v16}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{17, &Storage_::v17}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{18, &Storage_::v18}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{19, &Storage_::v19}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{20, &Storage_::v20}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{21, &Storage_::v21}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{22, &Storage_::v22}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{23, &Storage_::v23}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{24, &Storage_::v24}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{25, &Storage_::v25}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{26, &Storage_::v26}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{27, &Storage_::v27}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{28, &Storage_::v28}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{29, &Storage_::v29}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{30, &Storage_::v30}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{31, &Storage_::v31}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{32, &Storage_::v32}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{33, &Storage_::v33}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{34, &Storage_::v34}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{35, &Storage_::v35}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{36, &Storage_::v36}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{37, &Storage_::v37}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{38, &Storage_::v38}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{39, &Storage_::v39}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{40, &Storage_::v40}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{41, &Storage_::v41}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{42, &Storage_::v42}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{43, &Storage_::v43}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{44, &Storage_::v44}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{45, &Storage_::v45}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{46, &Storage_::v46}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{47, &Storage_::v47}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{48, &Storage_::v48}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{49, &Storage_::v49}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{50, &Storage_::v50}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{51, &Storage_::v51}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{52, &Storage_::v52}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{53, &Storage_::v53}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{54, &Storage_::v54}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{55, &Storage_::v55}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{56, &Storage_::v56}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{57, &Storage_::v57}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{58, &Storage_::v58}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{59, &Storage_::v59}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{60, &Storage_::v60}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{61, &Storage_::v61}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{62, &Storage_::v62}, ::fidl::internal::NaturalTableMember<Storage_, int64_t, fidl::internal::NaturalCodingConstraintEmpty>{63, &Storage_::v63}, ::fidl::internal::NaturalTableMember<Storage_, ::test_table::ExtensionTable, fidl::internal::NaturalCodingConstraintEmpty>{64, &Storage_::v64});
};

inline EmptyTable::EmptyTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline EmptyTable::EmptyTable(const ::test_table::EmptyTable& other) noexcept : EmptyTable(other.CloneStorage_()) {}
inline EmptyTable& ::test_table::EmptyTable::operator=(const EmptyTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline EmptyTable::EmptyTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : EmptyTable(Storage_{}) {}

inline SimpleTable::SimpleTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline SimpleTable::SimpleTable(const ::test_table::SimpleTable& other) noexcept : SimpleTable(other.CloneStorage_()) {}
inline SimpleTable& ::test_table::SimpleTable::operator=(const SimpleTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline SimpleTable::SimpleTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : SimpleTable(Storage_{}) {}
inline SimpleTable& SimpleTable::x(std::optional<int64_t> value) {
  storage_.x = std::move(value);
  return *this;
}
inline SimpleTable& SimpleTable::y(std::optional<int64_t> value) {
  storage_.y = std::move(value);
  return *this;
}

inline OlderSimpleTable::OlderSimpleTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline OlderSimpleTable::OlderSimpleTable(const ::test_table::OlderSimpleTable& other) noexcept : OlderSimpleTable(other.CloneStorage_()) {}
inline OlderSimpleTable& ::test_table::OlderSimpleTable::operator=(const OlderSimpleTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline OlderSimpleTable::OlderSimpleTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : OlderSimpleTable(Storage_{}) {}
inline OlderSimpleTable& OlderSimpleTable::x(std::optional<int64_t> value) {
  storage_.x = std::move(value);
  return *this;
}

inline NewerSimpleTable::NewerSimpleTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline NewerSimpleTable::NewerSimpleTable(const ::test_table::NewerSimpleTable& other) noexcept : NewerSimpleTable(other.CloneStorage_()) {}
inline NewerSimpleTable& ::test_table::NewerSimpleTable::operator=(const NewerSimpleTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline NewerSimpleTable::NewerSimpleTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : NewerSimpleTable(Storage_{}) {}
inline NewerSimpleTable& NewerSimpleTable::x(std::optional<int64_t> value) {
  storage_.x = std::move(value);
  return *this;
}
inline NewerSimpleTable& NewerSimpleTable::y(std::optional<int64_t> value) {
  storage_.y = std::move(value);
  return *this;
}
inline NewerSimpleTable& NewerSimpleTable::z(std::optional<int64_t> value) {
  storage_.z = std::move(value);
  return *this;
}

inline ReverseOrdinalTable::ReverseOrdinalTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline ReverseOrdinalTable::ReverseOrdinalTable(const ::test_table::ReverseOrdinalTable& other) noexcept : ReverseOrdinalTable(other.CloneStorage_()) {}
inline ReverseOrdinalTable& ::test_table::ReverseOrdinalTable::operator=(const ReverseOrdinalTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline ReverseOrdinalTable::ReverseOrdinalTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : ReverseOrdinalTable(Storage_{}) {}
inline ReverseOrdinalTable& ReverseOrdinalTable::z(std::optional<int64_t> value) {
  storage_.z = std::move(value);
  return *this;
}
inline ReverseOrdinalTable& ReverseOrdinalTable::y(std::optional<int64_t> value) {
  storage_.y = std::move(value);
  return *this;
}
inline ReverseOrdinalTable& ReverseOrdinalTable::x(std::optional<int64_t> value) {
  storage_.x = std::move(value);
  return *this;
}

inline TableWithAttributes::TableWithAttributes(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline TableWithAttributes::TableWithAttributes(const ::test_table::TableWithAttributes& other) noexcept : TableWithAttributes(other.CloneStorage_()) {}
inline TableWithAttributes& ::test_table::TableWithAttributes::operator=(const TableWithAttributes & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline TableWithAttributes::TableWithAttributes(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : TableWithAttributes(Storage_{}) {}
inline TableWithAttributes& TableWithAttributes::x(std::optional<int64_t> value) {
  storage_.x = std::move(value);
  return *this;
}

inline ExtensionTable::ExtensionTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline ExtensionTable::ExtensionTable(const ::test_table::ExtensionTable& other) noexcept : ExtensionTable(other.CloneStorage_()) {}
inline ExtensionTable& ::test_table::ExtensionTable::operator=(const ExtensionTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline ExtensionTable::ExtensionTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : ExtensionTable(Storage_{}) {}

inline SixtyFourOrdinalTable::SixtyFourOrdinalTable(Storage_ storage) noexcept : storage_(std::move(storage)) {}
inline SixtyFourOrdinalTable::SixtyFourOrdinalTable(const ::test_table::SixtyFourOrdinalTable& other) noexcept : SixtyFourOrdinalTable(other.CloneStorage_()) {}
inline SixtyFourOrdinalTable& ::test_table::SixtyFourOrdinalTable::operator=(const SixtyFourOrdinalTable & other) noexcept {
  storage_ = other.CloneStorage_();
  return *this;
}

inline SixtyFourOrdinalTable::SixtyFourOrdinalTable(::fidl::internal::DefaultConstructPossiblyInvalidObjectTag) : SixtyFourOrdinalTable(Storage_{}) {}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v1(std::optional<int64_t> value) {
  storage_.v1 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v2(std::optional<int64_t> value) {
  storage_.v2 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v3(std::optional<int64_t> value) {
  storage_.v3 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v4(std::optional<int64_t> value) {
  storage_.v4 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v5(std::optional<int64_t> value) {
  storage_.v5 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v6(std::optional<int64_t> value) {
  storage_.v6 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v7(std::optional<int64_t> value) {
  storage_.v7 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v8(std::optional<int64_t> value) {
  storage_.v8 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v9(std::optional<int64_t> value) {
  storage_.v9 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v10(std::optional<int64_t> value) {
  storage_.v10 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v11(std::optional<int64_t> value) {
  storage_.v11 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v12(std::optional<int64_t> value) {
  storage_.v12 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v13(std::optional<int64_t> value) {
  storage_.v13 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v14(std::optional<int64_t> value) {
  storage_.v14 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v15(std::optional<int64_t> value) {
  storage_.v15 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v16(std::optional<int64_t> value) {
  storage_.v16 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v17(std::optional<int64_t> value) {
  storage_.v17 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v18(std::optional<int64_t> value) {
  storage_.v18 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v19(std::optional<int64_t> value) {
  storage_.v19 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v20(std::optional<int64_t> value) {
  storage_.v20 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v21(std::optional<int64_t> value) {
  storage_.v21 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v22(std::optional<int64_t> value) {
  storage_.v22 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v23(std::optional<int64_t> value) {
  storage_.v23 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v24(std::optional<int64_t> value) {
  storage_.v24 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v25(std::optional<int64_t> value) {
  storage_.v25 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v26(std::optional<int64_t> value) {
  storage_.v26 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v27(std::optional<int64_t> value) {
  storage_.v27 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v28(std::optional<int64_t> value) {
  storage_.v28 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v29(std::optional<int64_t> value) {
  storage_.v29 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v30(std::optional<int64_t> value) {
  storage_.v30 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v31(std::optional<int64_t> value) {
  storage_.v31 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v32(std::optional<int64_t> value) {
  storage_.v32 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v33(std::optional<int64_t> value) {
  storage_.v33 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v34(std::optional<int64_t> value) {
  storage_.v34 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v35(std::optional<int64_t> value) {
  storage_.v35 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v36(std::optional<int64_t> value) {
  storage_.v36 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v37(std::optional<int64_t> value) {
  storage_.v37 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v38(std::optional<int64_t> value) {
  storage_.v38 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v39(std::optional<int64_t> value) {
  storage_.v39 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v40(std::optional<int64_t> value) {
  storage_.v40 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v41(std::optional<int64_t> value) {
  storage_.v41 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v42(std::optional<int64_t> value) {
  storage_.v42 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v43(std::optional<int64_t> value) {
  storage_.v43 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v44(std::optional<int64_t> value) {
  storage_.v44 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v45(std::optional<int64_t> value) {
  storage_.v45 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v46(std::optional<int64_t> value) {
  storage_.v46 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v47(std::optional<int64_t> value) {
  storage_.v47 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v48(std::optional<int64_t> value) {
  storage_.v48 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v49(std::optional<int64_t> value) {
  storage_.v49 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v50(std::optional<int64_t> value) {
  storage_.v50 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v51(std::optional<int64_t> value) {
  storage_.v51 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v52(std::optional<int64_t> value) {
  storage_.v52 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v53(std::optional<int64_t> value) {
  storage_.v53 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v54(std::optional<int64_t> value) {
  storage_.v54 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v55(std::optional<int64_t> value) {
  storage_.v55 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v56(std::optional<int64_t> value) {
  storage_.v56 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v57(std::optional<int64_t> value) {
  storage_.v57 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v58(std::optional<int64_t> value) {
  storage_.v58 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v59(std::optional<int64_t> value) {
  storage_.v59 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v60(std::optional<int64_t> value) {
  storage_.v60 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v61(std::optional<int64_t> value) {
  storage_.v61 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v62(std::optional<int64_t> value) {
  storage_.v62 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v63(std::optional<int64_t> value) {
  storage_.v63 = std::move(value);
  return *this;
}
inline SixtyFourOrdinalTable& SixtyFourOrdinalTable::v64(std::optional<::test_table::ExtensionTable> value) {
  storage_.v64 = std::move(value);
  return *this;
}

}  // namespace test_table
namespace fidl {

template <>
struct IsFidlType<::test_table::EmptyTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::EmptyTable> {
  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 IsTable<::test_table::EmptyTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::EmptyTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::EmptyTable> {};

template <>
struct IsFidlType<::test_table::SimpleTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::SimpleTable> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 56;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsTable<::test_table::SimpleTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::SimpleTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::SimpleTable> {};

template <>
struct IsFidlType<::test_table::OlderSimpleTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::OlderSimpleTable> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsTable<::test_table::OlderSimpleTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::OlderSimpleTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::OlderSimpleTable> {};

template <>
struct IsFidlType<::test_table::NewerSimpleTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::NewerSimpleTable> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 72;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsTable<::test_table::NewerSimpleTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::NewerSimpleTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::NewerSimpleTable> {};

template <>
struct IsFidlType<::test_table::ReverseOrdinalTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::ReverseOrdinalTable> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 48;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsTable<::test_table::ReverseOrdinalTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::ReverseOrdinalTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::ReverseOrdinalTable> {};

template <>
struct IsFidlType<::test_table::TableWithAttributes> : public std::true_type {};

template <>
struct TypeTraits<::test_table::TableWithAttributes> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 2;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 16;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsTable<::test_table::TableWithAttributes> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::TableWithAttributes, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::TableWithAttributes> {};

template <>
struct IsFidlType<::test_table::ExtensionTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::ExtensionTable> {
  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 IsTable<::test_table::ExtensionTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::ExtensionTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::ExtensionTable> {};

template <>
struct IsFidlType<::test_table::SixtyFourOrdinalTable> : public std::true_type {};

template <>
struct TypeTraits<::test_table::SixtyFourOrdinalTable> {
  static constexpr uint32_t kMaxNumHandles = 0;
  static constexpr uint32_t kMaxDepth = 3;
  static constexpr uint32_t kPrimarySize = 16;
  static constexpr uint32_t kMaxOutOfLine = 1032;
  static constexpr bool kHasPointer = true;
};

template <>
struct IsTable<::test_table::SixtyFourOrdinalTable> : public std::true_type {};

template <>
struct internal::NaturalCodingTraits<::test_table::SixtyFourOrdinalTable, ::fidl::internal::NaturalCodingConstraintEmpty> : public ::fidl::internal::NaturalTableCodingTraits<::test_table::SixtyFourOrdinalTable> {};

#pragma clang diagnostic pop

}  // namespace fidl
