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

// fidl_experiment = output_index_json

#pragma once

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

namespace test {
namespace table {

//
// Domain objects declarations
//

class EmptyTable;

class SimpleTable;

class OlderSimpleTable;

class NewerSimpleTable;

class ReverseOrdinalTable;

class TableWithAttributes;

class ExtensionTable;

class SixtyFourOrdinalTable;

class EmptyTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  EmptyTable();
  EmptyTable(EmptyTable&& other);
  ~EmptyTable();
  EmptyTable& operator=(EmptyTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<0> field_presence_;
};

using EmptyTablePtr = ::std::unique_ptr<EmptyTable>;

class SimpleTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  const int64_t& x() const {
    ZX_ASSERT(field_presence_.IsSet<0>());
    return x_value_.value;
  }
  bool has_x() const {
    return field_presence_.IsSet<0>();
  }

  int64_t* mutable_x() {
    if (!field_presence_.IsSet<0>()) {
      field_presence_.Set<0>();
      Construct(&x_value_.value);
    }
    return &x_value_.value;
  }
  SimpleTable& set_x(int64_t _value);
  void clear_x() {
    if (!field_presence_.IsSet<0>()) {
      return;
    }
    field_presence_.Clear<0>();
    Destruct(&x_value_.value);
  }

  const int64_t& y() const {
    ZX_ASSERT(field_presence_.IsSet<4>());
    return y_value_.value;
  }
  bool has_y() const {
    return field_presence_.IsSet<4>();
  }

  int64_t* mutable_y() {
    if (!field_presence_.IsSet<4>()) {
      field_presence_.Set<4>();
      Construct(&y_value_.value);
    }
    return &y_value_.value;
  }
  SimpleTable& set_y(int64_t _value);
  void clear_y() {
    if (!field_presence_.IsSet<4>()) {
      return;
    }
    field_presence_.Clear<4>();
    Destruct(&y_value_.value);
  }

  SimpleTable();
  SimpleTable(SimpleTable&& other);
  ~SimpleTable();
  SimpleTable& operator=(SimpleTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      case 1:
      case 5:
        return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<5> field_presence_;
  union ValueUnion_x {
    ValueUnion_x() {}
    ~ValueUnion_x() {}

    int64_t value;
  };
  ValueUnion_x x_value_;
  union ValueUnion_y {
    ValueUnion_y() {}
    ~ValueUnion_y() {}

    int64_t value;
  };
  ValueUnion_y y_value_;
};

using SimpleTablePtr = ::std::unique_ptr<SimpleTable>;

class OlderSimpleTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  const int64_t& x() const {
    ZX_ASSERT(field_presence_.IsSet<0>());
    return x_value_.value;
  }
  bool has_x() const {
    return field_presence_.IsSet<0>();
  }

  int64_t* mutable_x() {
    if (!field_presence_.IsSet<0>()) {
      field_presence_.Set<0>();
      Construct(&x_value_.value);
    }
    return &x_value_.value;
  }
  OlderSimpleTable& set_x(int64_t _value);
  void clear_x() {
    if (!field_presence_.IsSet<0>()) {
      return;
    }
    field_presence_.Clear<0>();
    Destruct(&x_value_.value);
  }

  OlderSimpleTable();
  OlderSimpleTable(OlderSimpleTable&& other);
  ~OlderSimpleTable();
  OlderSimpleTable& operator=(OlderSimpleTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      case 1:
        return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<1> field_presence_;
  union ValueUnion_x {
    ValueUnion_x() {}
    ~ValueUnion_x() {}

    int64_t value;
  };
  ValueUnion_x x_value_;
};

using OlderSimpleTablePtr = ::std::unique_ptr<OlderSimpleTable>;

class NewerSimpleTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  const int64_t& x() const {
    ZX_ASSERT(field_presence_.IsSet<0>());
    return x_value_.value;
  }
  bool has_x() const {
    return field_presence_.IsSet<0>();
  }

  int64_t* mutable_x() {
    if (!field_presence_.IsSet<0>()) {
      field_presence_.Set<0>();
      Construct(&x_value_.value);
    }
    return &x_value_.value;
  }
  NewerSimpleTable& set_x(int64_t _value);
  void clear_x() {
    if (!field_presence_.IsSet<0>()) {
      return;
    }
    field_presence_.Clear<0>();
    Destruct(&x_value_.value);
  }

  const int64_t& y() const {
    ZX_ASSERT(field_presence_.IsSet<4>());
    return y_value_.value;
  }
  bool has_y() const {
    return field_presence_.IsSet<4>();
  }

  int64_t* mutable_y() {
    if (!field_presence_.IsSet<4>()) {
      field_presence_.Set<4>();
      Construct(&y_value_.value);
    }
    return &y_value_.value;
  }
  NewerSimpleTable& set_y(int64_t _value);
  void clear_y() {
    if (!field_presence_.IsSet<4>()) {
      return;
    }
    field_presence_.Clear<4>();
    Destruct(&y_value_.value);
  }

  const int64_t& z() const {
    ZX_ASSERT(field_presence_.IsSet<5>());
    return z_value_.value;
  }
  bool has_z() const {
    return field_presence_.IsSet<5>();
  }

  int64_t* mutable_z() {
    if (!field_presence_.IsSet<5>()) {
      field_presence_.Set<5>();
      Construct(&z_value_.value);
    }
    return &z_value_.value;
  }
  NewerSimpleTable& set_z(int64_t _value);
  void clear_z() {
    if (!field_presence_.IsSet<5>()) {
      return;
    }
    field_presence_.Clear<5>();
    Destruct(&z_value_.value);
  }

  NewerSimpleTable();
  NewerSimpleTable(NewerSimpleTable&& other);
  ~NewerSimpleTable();
  NewerSimpleTable& operator=(NewerSimpleTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      case 1:
      case 5:
      case 6:
        return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<6> field_presence_;
  union ValueUnion_x {
    ValueUnion_x() {}
    ~ValueUnion_x() {}

    int64_t value;
  };
  ValueUnion_x x_value_;
  union ValueUnion_y {
    ValueUnion_y() {}
    ~ValueUnion_y() {}

    int64_t value;
  };
  ValueUnion_y y_value_;
  union ValueUnion_z {
    ValueUnion_z() {}
    ~ValueUnion_z() {}

    int64_t value;
  };
  ValueUnion_z z_value_;
};

using NewerSimpleTablePtr = ::std::unique_ptr<NewerSimpleTable>;

class ReverseOrdinalTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  const int64_t& z() const {
    ZX_ASSERT(field_presence_.IsSet<0>());
    return z_value_.value;
  }
  bool has_z() const {
    return field_presence_.IsSet<0>();
  }

  int64_t* mutable_z() {
    if (!field_presence_.IsSet<0>()) {
      field_presence_.Set<0>();
      Construct(&z_value_.value);
    }
    return &z_value_.value;
  }
  ReverseOrdinalTable& set_z(int64_t _value);
  void clear_z() {
    if (!field_presence_.IsSet<0>()) {
      return;
    }
    field_presence_.Clear<0>();
    Destruct(&z_value_.value);
  }

  const int64_t& y() const {
    ZX_ASSERT(field_presence_.IsSet<1>());
    return y_value_.value;
  }
  bool has_y() const {
    return field_presence_.IsSet<1>();
  }

  int64_t* mutable_y() {
    if (!field_presence_.IsSet<1>()) {
      field_presence_.Set<1>();
      Construct(&y_value_.value);
    }
    return &y_value_.value;
  }
  ReverseOrdinalTable& set_y(int64_t _value);
  void clear_y() {
    if (!field_presence_.IsSet<1>()) {
      return;
    }
    field_presence_.Clear<1>();
    Destruct(&y_value_.value);
  }

  const int64_t& x() const {
    ZX_ASSERT(field_presence_.IsSet<2>());
    return x_value_.value;
  }
  bool has_x() const {
    return field_presence_.IsSet<2>();
  }

  int64_t* mutable_x() {
    if (!field_presence_.IsSet<2>()) {
      field_presence_.Set<2>();
      Construct(&x_value_.value);
    }
    return &x_value_.value;
  }
  ReverseOrdinalTable& set_x(int64_t _value);
  void clear_x() {
    if (!field_presence_.IsSet<2>()) {
      return;
    }
    field_presence_.Clear<2>();
    Destruct(&x_value_.value);
  }

  ReverseOrdinalTable();
  ReverseOrdinalTable(ReverseOrdinalTable&& other);
  ~ReverseOrdinalTable();
  ReverseOrdinalTable& operator=(ReverseOrdinalTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      case 1:
      case 2:
      case 3:
        return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<3> field_presence_;
  union ValueUnion_z {
    ValueUnion_z() {}
    ~ValueUnion_z() {}

    int64_t value;
  };
  ValueUnion_z z_value_;
  union ValueUnion_y {
    ValueUnion_y() {}
    ~ValueUnion_y() {}

    int64_t value;
  };
  ValueUnion_y y_value_;
  union ValueUnion_x {
    ValueUnion_x() {}
    ~ValueUnion_x() {}

    int64_t value;
  };
  ValueUnion_x x_value_;
};

using ReverseOrdinalTablePtr = ::std::unique_ptr<ReverseOrdinalTable>;

class TableWithAttributes final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  const int64_t& x() const {
    ZX_ASSERT(field_presence_.IsSet<0>());
    return x_value_.value;
  }
  bool has_x() const {
    return field_presence_.IsSet<0>();
  }

  int64_t* mutable_x() {
    if (!field_presence_.IsSet<0>()) {
      field_presence_.Set<0>();
      Construct(&x_value_.value);
    }
    return &x_value_.value;
  }
  TableWithAttributes& set_x(int64_t _value);
  void clear_x() {
    if (!field_presence_.IsSet<0>()) {
      return;
    }
    field_presence_.Clear<0>();
    Destruct(&x_value_.value);
  }

  TableWithAttributes();
  TableWithAttributes(TableWithAttributes&& other);
  ~TableWithAttributes();
  TableWithAttributes& operator=(TableWithAttributes&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      case 1:
        return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<1> field_presence_;
  union ValueUnion_x {
    ValueUnion_x() {}
    ~ValueUnion_x() {}

    int64_t value;
  };
  ValueUnion_x x_value_;
};

using TableWithAttributesPtr = ::std::unique_ptr<TableWithAttributes>;

class ExtensionTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  ExtensionTable();
  ExtensionTable(ExtensionTable&& other);
  ~ExtensionTable();
  ExtensionTable& operator=(ExtensionTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<0> field_presence_;
};

using ExtensionTablePtr = ::std::unique_ptr<ExtensionTable>;

class SixtyFourOrdinalTable final {
 public:
  static const fidl_type_t* FidlType;
  /// Returns whether no field is set.
  bool IsEmpty() const;

  const int64_t& v1() const {
    ZX_ASSERT(field_presence_.IsSet<0>());
    return v1_value_.value;
  }
  bool has_v1() const {
    return field_presence_.IsSet<0>();
  }

  int64_t* mutable_v1() {
    if (!field_presence_.IsSet<0>()) {
      field_presence_.Set<0>();
      Construct(&v1_value_.value);
    }
    return &v1_value_.value;
  }
  SixtyFourOrdinalTable& set_v1(int64_t _value);
  void clear_v1() {
    if (!field_presence_.IsSet<0>()) {
      return;
    }
    field_presence_.Clear<0>();
    Destruct(&v1_value_.value);
  }

  const int64_t& v2() const {
    ZX_ASSERT(field_presence_.IsSet<1>());
    return v2_value_.value;
  }
  bool has_v2() const {
    return field_presence_.IsSet<1>();
  }

  int64_t* mutable_v2() {
    if (!field_presence_.IsSet<1>()) {
      field_presence_.Set<1>();
      Construct(&v2_value_.value);
    }
    return &v2_value_.value;
  }
  SixtyFourOrdinalTable& set_v2(int64_t _value);
  void clear_v2() {
    if (!field_presence_.IsSet<1>()) {
      return;
    }
    field_presence_.Clear<1>();
    Destruct(&v2_value_.value);
  }

  const int64_t& v3() const {
    ZX_ASSERT(field_presence_.IsSet<2>());
    return v3_value_.value;
  }
  bool has_v3() const {
    return field_presence_.IsSet<2>();
  }

  int64_t* mutable_v3() {
    if (!field_presence_.IsSet<2>()) {
      field_presence_.Set<2>();
      Construct(&v3_value_.value);
    }
    return &v3_value_.value;
  }
  SixtyFourOrdinalTable& set_v3(int64_t _value);
  void clear_v3() {
    if (!field_presence_.IsSet<2>()) {
      return;
    }
    field_presence_.Clear<2>();
    Destruct(&v3_value_.value);
  }

  const int64_t& v4() const {
    ZX_ASSERT(field_presence_.IsSet<3>());
    return v4_value_.value;
  }
  bool has_v4() const {
    return field_presence_.IsSet<3>();
  }

  int64_t* mutable_v4() {
    if (!field_presence_.IsSet<3>()) {
      field_presence_.Set<3>();
      Construct(&v4_value_.value);
    }
    return &v4_value_.value;
  }
  SixtyFourOrdinalTable& set_v4(int64_t _value);
  void clear_v4() {
    if (!field_presence_.IsSet<3>()) {
      return;
    }
    field_presence_.Clear<3>();
    Destruct(&v4_value_.value);
  }

  const int64_t& v5() const {
    ZX_ASSERT(field_presence_.IsSet<4>());
    return v5_value_.value;
  }
  bool has_v5() const {
    return field_presence_.IsSet<4>();
  }

  int64_t* mutable_v5() {
    if (!field_presence_.IsSet<4>()) {
      field_presence_.Set<4>();
      Construct(&v5_value_.value);
    }
    return &v5_value_.value;
  }
  SixtyFourOrdinalTable& set_v5(int64_t _value);
  void clear_v5() {
    if (!field_presence_.IsSet<4>()) {
      return;
    }
    field_presence_.Clear<4>();
    Destruct(&v5_value_.value);
  }

  const int64_t& v6() const {
    ZX_ASSERT(field_presence_.IsSet<5>());
    return v6_value_.value;
  }
  bool has_v6() const {
    return field_presence_.IsSet<5>();
  }

  int64_t* mutable_v6() {
    if (!field_presence_.IsSet<5>()) {
      field_presence_.Set<5>();
      Construct(&v6_value_.value);
    }
    return &v6_value_.value;
  }
  SixtyFourOrdinalTable& set_v6(int64_t _value);
  void clear_v6() {
    if (!field_presence_.IsSet<5>()) {
      return;
    }
    field_presence_.Clear<5>();
    Destruct(&v6_value_.value);
  }

  const int64_t& v7() const {
    ZX_ASSERT(field_presence_.IsSet<6>());
    return v7_value_.value;
  }
  bool has_v7() const {
    return field_presence_.IsSet<6>();
  }

  int64_t* mutable_v7() {
    if (!field_presence_.IsSet<6>()) {
      field_presence_.Set<6>();
      Construct(&v7_value_.value);
    }
    return &v7_value_.value;
  }
  SixtyFourOrdinalTable& set_v7(int64_t _value);
  void clear_v7() {
    if (!field_presence_.IsSet<6>()) {
      return;
    }
    field_presence_.Clear<6>();
    Destruct(&v7_value_.value);
  }

  const int64_t& v8() const {
    ZX_ASSERT(field_presence_.IsSet<7>());
    return v8_value_.value;
  }
  bool has_v8() const {
    return field_presence_.IsSet<7>();
  }

  int64_t* mutable_v8() {
    if (!field_presence_.IsSet<7>()) {
      field_presence_.Set<7>();
      Construct(&v8_value_.value);
    }
    return &v8_value_.value;
  }
  SixtyFourOrdinalTable& set_v8(int64_t _value);
  void clear_v8() {
    if (!field_presence_.IsSet<7>()) {
      return;
    }
    field_presence_.Clear<7>();
    Destruct(&v8_value_.value);
  }

  const int64_t& v9() const {
    ZX_ASSERT(field_presence_.IsSet<8>());
    return v9_value_.value;
  }
  bool has_v9() const {
    return field_presence_.IsSet<8>();
  }

  int64_t* mutable_v9() {
    if (!field_presence_.IsSet<8>()) {
      field_presence_.Set<8>();
      Construct(&v9_value_.value);
    }
    return &v9_value_.value;
  }
  SixtyFourOrdinalTable& set_v9(int64_t _value);
  void clear_v9() {
    if (!field_presence_.IsSet<8>()) {
      return;
    }
    field_presence_.Clear<8>();
    Destruct(&v9_value_.value);
  }

  const int64_t& v10() const {
    ZX_ASSERT(field_presence_.IsSet<9>());
    return v10_value_.value;
  }
  bool has_v10() const {
    return field_presence_.IsSet<9>();
  }

  int64_t* mutable_v10() {
    if (!field_presence_.IsSet<9>()) {
      field_presence_.Set<9>();
      Construct(&v10_value_.value);
    }
    return &v10_value_.value;
  }
  SixtyFourOrdinalTable& set_v10(int64_t _value);
  void clear_v10() {
    if (!field_presence_.IsSet<9>()) {
      return;
    }
    field_presence_.Clear<9>();
    Destruct(&v10_value_.value);
  }

  const int64_t& v11() const {
    ZX_ASSERT(field_presence_.IsSet<10>());
    return v11_value_.value;
  }
  bool has_v11() const {
    return field_presence_.IsSet<10>();
  }

  int64_t* mutable_v11() {
    if (!field_presence_.IsSet<10>()) {
      field_presence_.Set<10>();
      Construct(&v11_value_.value);
    }
    return &v11_value_.value;
  }
  SixtyFourOrdinalTable& set_v11(int64_t _value);
  void clear_v11() {
    if (!field_presence_.IsSet<10>()) {
      return;
    }
    field_presence_.Clear<10>();
    Destruct(&v11_value_.value);
  }

  const int64_t& v12() const {
    ZX_ASSERT(field_presence_.IsSet<11>());
    return v12_value_.value;
  }
  bool has_v12() const {
    return field_presence_.IsSet<11>();
  }

  int64_t* mutable_v12() {
    if (!field_presence_.IsSet<11>()) {
      field_presence_.Set<11>();
      Construct(&v12_value_.value);
    }
    return &v12_value_.value;
  }
  SixtyFourOrdinalTable& set_v12(int64_t _value);
  void clear_v12() {
    if (!field_presence_.IsSet<11>()) {
      return;
    }
    field_presence_.Clear<11>();
    Destruct(&v12_value_.value);
  }

  const int64_t& v13() const {
    ZX_ASSERT(field_presence_.IsSet<12>());
    return v13_value_.value;
  }
  bool has_v13() const {
    return field_presence_.IsSet<12>();
  }

  int64_t* mutable_v13() {
    if (!field_presence_.IsSet<12>()) {
      field_presence_.Set<12>();
      Construct(&v13_value_.value);
    }
    return &v13_value_.value;
  }
  SixtyFourOrdinalTable& set_v13(int64_t _value);
  void clear_v13() {
    if (!field_presence_.IsSet<12>()) {
      return;
    }
    field_presence_.Clear<12>();
    Destruct(&v13_value_.value);
  }

  const int64_t& v14() const {
    ZX_ASSERT(field_presence_.IsSet<13>());
    return v14_value_.value;
  }
  bool has_v14() const {
    return field_presence_.IsSet<13>();
  }

  int64_t* mutable_v14() {
    if (!field_presence_.IsSet<13>()) {
      field_presence_.Set<13>();
      Construct(&v14_value_.value);
    }
    return &v14_value_.value;
  }
  SixtyFourOrdinalTable& set_v14(int64_t _value);
  void clear_v14() {
    if (!field_presence_.IsSet<13>()) {
      return;
    }
    field_presence_.Clear<13>();
    Destruct(&v14_value_.value);
  }

  const int64_t& v15() const {
    ZX_ASSERT(field_presence_.IsSet<14>());
    return v15_value_.value;
  }
  bool has_v15() const {
    return field_presence_.IsSet<14>();
  }

  int64_t* mutable_v15() {
    if (!field_presence_.IsSet<14>()) {
      field_presence_.Set<14>();
      Construct(&v15_value_.value);
    }
    return &v15_value_.value;
  }
  SixtyFourOrdinalTable& set_v15(int64_t _value);
  void clear_v15() {
    if (!field_presence_.IsSet<14>()) {
      return;
    }
    field_presence_.Clear<14>();
    Destruct(&v15_value_.value);
  }

  const int64_t& v16() const {
    ZX_ASSERT(field_presence_.IsSet<15>());
    return v16_value_.value;
  }
  bool has_v16() const {
    return field_presence_.IsSet<15>();
  }

  int64_t* mutable_v16() {
    if (!field_presence_.IsSet<15>()) {
      field_presence_.Set<15>();
      Construct(&v16_value_.value);
    }
    return &v16_value_.value;
  }
  SixtyFourOrdinalTable& set_v16(int64_t _value);
  void clear_v16() {
    if (!field_presence_.IsSet<15>()) {
      return;
    }
    field_presence_.Clear<15>();
    Destruct(&v16_value_.value);
  }

  const int64_t& v17() const {
    ZX_ASSERT(field_presence_.IsSet<16>());
    return v17_value_.value;
  }
  bool has_v17() const {
    return field_presence_.IsSet<16>();
  }

  int64_t* mutable_v17() {
    if (!field_presence_.IsSet<16>()) {
      field_presence_.Set<16>();
      Construct(&v17_value_.value);
    }
    return &v17_value_.value;
  }
  SixtyFourOrdinalTable& set_v17(int64_t _value);
  void clear_v17() {
    if (!field_presence_.IsSet<16>()) {
      return;
    }
    field_presence_.Clear<16>();
    Destruct(&v17_value_.value);
  }

  const int64_t& v18() const {
    ZX_ASSERT(field_presence_.IsSet<17>());
    return v18_value_.value;
  }
  bool has_v18() const {
    return field_presence_.IsSet<17>();
  }

  int64_t* mutable_v18() {
    if (!field_presence_.IsSet<17>()) {
      field_presence_.Set<17>();
      Construct(&v18_value_.value);
    }
    return &v18_value_.value;
  }
  SixtyFourOrdinalTable& set_v18(int64_t _value);
  void clear_v18() {
    if (!field_presence_.IsSet<17>()) {
      return;
    }
    field_presence_.Clear<17>();
    Destruct(&v18_value_.value);
  }

  const int64_t& v19() const {
    ZX_ASSERT(field_presence_.IsSet<18>());
    return v19_value_.value;
  }
  bool has_v19() const {
    return field_presence_.IsSet<18>();
  }

  int64_t* mutable_v19() {
    if (!field_presence_.IsSet<18>()) {
      field_presence_.Set<18>();
      Construct(&v19_value_.value);
    }
    return &v19_value_.value;
  }
  SixtyFourOrdinalTable& set_v19(int64_t _value);
  void clear_v19() {
    if (!field_presence_.IsSet<18>()) {
      return;
    }
    field_presence_.Clear<18>();
    Destruct(&v19_value_.value);
  }

  const int64_t& v20() const {
    ZX_ASSERT(field_presence_.IsSet<19>());
    return v20_value_.value;
  }
  bool has_v20() const {
    return field_presence_.IsSet<19>();
  }

  int64_t* mutable_v20() {
    if (!field_presence_.IsSet<19>()) {
      field_presence_.Set<19>();
      Construct(&v20_value_.value);
    }
    return &v20_value_.value;
  }
  SixtyFourOrdinalTable& set_v20(int64_t _value);
  void clear_v20() {
    if (!field_presence_.IsSet<19>()) {
      return;
    }
    field_presence_.Clear<19>();
    Destruct(&v20_value_.value);
  }

  const int64_t& v21() const {
    ZX_ASSERT(field_presence_.IsSet<20>());
    return v21_value_.value;
  }
  bool has_v21() const {
    return field_presence_.IsSet<20>();
  }

  int64_t* mutable_v21() {
    if (!field_presence_.IsSet<20>()) {
      field_presence_.Set<20>();
      Construct(&v21_value_.value);
    }
    return &v21_value_.value;
  }
  SixtyFourOrdinalTable& set_v21(int64_t _value);
  void clear_v21() {
    if (!field_presence_.IsSet<20>()) {
      return;
    }
    field_presence_.Clear<20>();
    Destruct(&v21_value_.value);
  }

  const int64_t& v22() const {
    ZX_ASSERT(field_presence_.IsSet<21>());
    return v22_value_.value;
  }
  bool has_v22() const {
    return field_presence_.IsSet<21>();
  }

  int64_t* mutable_v22() {
    if (!field_presence_.IsSet<21>()) {
      field_presence_.Set<21>();
      Construct(&v22_value_.value);
    }
    return &v22_value_.value;
  }
  SixtyFourOrdinalTable& set_v22(int64_t _value);
  void clear_v22() {
    if (!field_presence_.IsSet<21>()) {
      return;
    }
    field_presence_.Clear<21>();
    Destruct(&v22_value_.value);
  }

  const int64_t& v23() const {
    ZX_ASSERT(field_presence_.IsSet<22>());
    return v23_value_.value;
  }
  bool has_v23() const {
    return field_presence_.IsSet<22>();
  }

  int64_t* mutable_v23() {
    if (!field_presence_.IsSet<22>()) {
      field_presence_.Set<22>();
      Construct(&v23_value_.value);
    }
    return &v23_value_.value;
  }
  SixtyFourOrdinalTable& set_v23(int64_t _value);
  void clear_v23() {
    if (!field_presence_.IsSet<22>()) {
      return;
    }
    field_presence_.Clear<22>();
    Destruct(&v23_value_.value);
  }

  const int64_t& v24() const {
    ZX_ASSERT(field_presence_.IsSet<23>());
    return v24_value_.value;
  }
  bool has_v24() const {
    return field_presence_.IsSet<23>();
  }

  int64_t* mutable_v24() {
    if (!field_presence_.IsSet<23>()) {
      field_presence_.Set<23>();
      Construct(&v24_value_.value);
    }
    return &v24_value_.value;
  }
  SixtyFourOrdinalTable& set_v24(int64_t _value);
  void clear_v24() {
    if (!field_presence_.IsSet<23>()) {
      return;
    }
    field_presence_.Clear<23>();
    Destruct(&v24_value_.value);
  }

  const int64_t& v25() const {
    ZX_ASSERT(field_presence_.IsSet<24>());
    return v25_value_.value;
  }
  bool has_v25() const {
    return field_presence_.IsSet<24>();
  }

  int64_t* mutable_v25() {
    if (!field_presence_.IsSet<24>()) {
      field_presence_.Set<24>();
      Construct(&v25_value_.value);
    }
    return &v25_value_.value;
  }
  SixtyFourOrdinalTable& set_v25(int64_t _value);
  void clear_v25() {
    if (!field_presence_.IsSet<24>()) {
      return;
    }
    field_presence_.Clear<24>();
    Destruct(&v25_value_.value);
  }

  const int64_t& v26() const {
    ZX_ASSERT(field_presence_.IsSet<25>());
    return v26_value_.value;
  }
  bool has_v26() const {
    return field_presence_.IsSet<25>();
  }

  int64_t* mutable_v26() {
    if (!field_presence_.IsSet<25>()) {
      field_presence_.Set<25>();
      Construct(&v26_value_.value);
    }
    return &v26_value_.value;
  }
  SixtyFourOrdinalTable& set_v26(int64_t _value);
  void clear_v26() {
    if (!field_presence_.IsSet<25>()) {
      return;
    }
    field_presence_.Clear<25>();
    Destruct(&v26_value_.value);
  }

  const int64_t& v27() const {
    ZX_ASSERT(field_presence_.IsSet<26>());
    return v27_value_.value;
  }
  bool has_v27() const {
    return field_presence_.IsSet<26>();
  }

  int64_t* mutable_v27() {
    if (!field_presence_.IsSet<26>()) {
      field_presence_.Set<26>();
      Construct(&v27_value_.value);
    }
    return &v27_value_.value;
  }
  SixtyFourOrdinalTable& set_v27(int64_t _value);
  void clear_v27() {
    if (!field_presence_.IsSet<26>()) {
      return;
    }
    field_presence_.Clear<26>();
    Destruct(&v27_value_.value);
  }

  const int64_t& v28() const {
    ZX_ASSERT(field_presence_.IsSet<27>());
    return v28_value_.value;
  }
  bool has_v28() const {
    return field_presence_.IsSet<27>();
  }

  int64_t* mutable_v28() {
    if (!field_presence_.IsSet<27>()) {
      field_presence_.Set<27>();
      Construct(&v28_value_.value);
    }
    return &v28_value_.value;
  }
  SixtyFourOrdinalTable& set_v28(int64_t _value);
  void clear_v28() {
    if (!field_presence_.IsSet<27>()) {
      return;
    }
    field_presence_.Clear<27>();
    Destruct(&v28_value_.value);
  }

  const int64_t& v29() const {
    ZX_ASSERT(field_presence_.IsSet<28>());
    return v29_value_.value;
  }
  bool has_v29() const {
    return field_presence_.IsSet<28>();
  }

  int64_t* mutable_v29() {
    if (!field_presence_.IsSet<28>()) {
      field_presence_.Set<28>();
      Construct(&v29_value_.value);
    }
    return &v29_value_.value;
  }
  SixtyFourOrdinalTable& set_v29(int64_t _value);
  void clear_v29() {
    if (!field_presence_.IsSet<28>()) {
      return;
    }
    field_presence_.Clear<28>();
    Destruct(&v29_value_.value);
  }

  const int64_t& v30() const {
    ZX_ASSERT(field_presence_.IsSet<29>());
    return v30_value_.value;
  }
  bool has_v30() const {
    return field_presence_.IsSet<29>();
  }

  int64_t* mutable_v30() {
    if (!field_presence_.IsSet<29>()) {
      field_presence_.Set<29>();
      Construct(&v30_value_.value);
    }
    return &v30_value_.value;
  }
  SixtyFourOrdinalTable& set_v30(int64_t _value);
  void clear_v30() {
    if (!field_presence_.IsSet<29>()) {
      return;
    }
    field_presence_.Clear<29>();
    Destruct(&v30_value_.value);
  }

  const int64_t& v31() const {
    ZX_ASSERT(field_presence_.IsSet<30>());
    return v31_value_.value;
  }
  bool has_v31() const {
    return field_presence_.IsSet<30>();
  }

  int64_t* mutable_v31() {
    if (!field_presence_.IsSet<30>()) {
      field_presence_.Set<30>();
      Construct(&v31_value_.value);
    }
    return &v31_value_.value;
  }
  SixtyFourOrdinalTable& set_v31(int64_t _value);
  void clear_v31() {
    if (!field_presence_.IsSet<30>()) {
      return;
    }
    field_presence_.Clear<30>();
    Destruct(&v31_value_.value);
  }

  const int64_t& v32() const {
    ZX_ASSERT(field_presence_.IsSet<31>());
    return v32_value_.value;
  }
  bool has_v32() const {
    return field_presence_.IsSet<31>();
  }

  int64_t* mutable_v32() {
    if (!field_presence_.IsSet<31>()) {
      field_presence_.Set<31>();
      Construct(&v32_value_.value);
    }
    return &v32_value_.value;
  }
  SixtyFourOrdinalTable& set_v32(int64_t _value);
  void clear_v32() {
    if (!field_presence_.IsSet<31>()) {
      return;
    }
    field_presence_.Clear<31>();
    Destruct(&v32_value_.value);
  }

  const int64_t& v33() const {
    ZX_ASSERT(field_presence_.IsSet<32>());
    return v33_value_.value;
  }
  bool has_v33() const {
    return field_presence_.IsSet<32>();
  }

  int64_t* mutable_v33() {
    if (!field_presence_.IsSet<32>()) {
      field_presence_.Set<32>();
      Construct(&v33_value_.value);
    }
    return &v33_value_.value;
  }
  SixtyFourOrdinalTable& set_v33(int64_t _value);
  void clear_v33() {
    if (!field_presence_.IsSet<32>()) {
      return;
    }
    field_presence_.Clear<32>();
    Destruct(&v33_value_.value);
  }

  const int64_t& v34() const {
    ZX_ASSERT(field_presence_.IsSet<33>());
    return v34_value_.value;
  }
  bool has_v34() const {
    return field_presence_.IsSet<33>();
  }

  int64_t* mutable_v34() {
    if (!field_presence_.IsSet<33>()) {
      field_presence_.Set<33>();
      Construct(&v34_value_.value);
    }
    return &v34_value_.value;
  }
  SixtyFourOrdinalTable& set_v34(int64_t _value);
  void clear_v34() {
    if (!field_presence_.IsSet<33>()) {
      return;
    }
    field_presence_.Clear<33>();
    Destruct(&v34_value_.value);
  }

  const int64_t& v35() const {
    ZX_ASSERT(field_presence_.IsSet<34>());
    return v35_value_.value;
  }
  bool has_v35() const {
    return field_presence_.IsSet<34>();
  }

  int64_t* mutable_v35() {
    if (!field_presence_.IsSet<34>()) {
      field_presence_.Set<34>();
      Construct(&v35_value_.value);
    }
    return &v35_value_.value;
  }
  SixtyFourOrdinalTable& set_v35(int64_t _value);
  void clear_v35() {
    if (!field_presence_.IsSet<34>()) {
      return;
    }
    field_presence_.Clear<34>();
    Destruct(&v35_value_.value);
  }

  const int64_t& v36() const {
    ZX_ASSERT(field_presence_.IsSet<35>());
    return v36_value_.value;
  }
  bool has_v36() const {
    return field_presence_.IsSet<35>();
  }

  int64_t* mutable_v36() {
    if (!field_presence_.IsSet<35>()) {
      field_presence_.Set<35>();
      Construct(&v36_value_.value);
    }
    return &v36_value_.value;
  }
  SixtyFourOrdinalTable& set_v36(int64_t _value);
  void clear_v36() {
    if (!field_presence_.IsSet<35>()) {
      return;
    }
    field_presence_.Clear<35>();
    Destruct(&v36_value_.value);
  }

  const int64_t& v37() const {
    ZX_ASSERT(field_presence_.IsSet<36>());
    return v37_value_.value;
  }
  bool has_v37() const {
    return field_presence_.IsSet<36>();
  }

  int64_t* mutable_v37() {
    if (!field_presence_.IsSet<36>()) {
      field_presence_.Set<36>();
      Construct(&v37_value_.value);
    }
    return &v37_value_.value;
  }
  SixtyFourOrdinalTable& set_v37(int64_t _value);
  void clear_v37() {
    if (!field_presence_.IsSet<36>()) {
      return;
    }
    field_presence_.Clear<36>();
    Destruct(&v37_value_.value);
  }

  const int64_t& v38() const {
    ZX_ASSERT(field_presence_.IsSet<37>());
    return v38_value_.value;
  }
  bool has_v38() const {
    return field_presence_.IsSet<37>();
  }

  int64_t* mutable_v38() {
    if (!field_presence_.IsSet<37>()) {
      field_presence_.Set<37>();
      Construct(&v38_value_.value);
    }
    return &v38_value_.value;
  }
  SixtyFourOrdinalTable& set_v38(int64_t _value);
  void clear_v38() {
    if (!field_presence_.IsSet<37>()) {
      return;
    }
    field_presence_.Clear<37>();
    Destruct(&v38_value_.value);
  }

  const int64_t& v39() const {
    ZX_ASSERT(field_presence_.IsSet<38>());
    return v39_value_.value;
  }
  bool has_v39() const {
    return field_presence_.IsSet<38>();
  }

  int64_t* mutable_v39() {
    if (!field_presence_.IsSet<38>()) {
      field_presence_.Set<38>();
      Construct(&v39_value_.value);
    }
    return &v39_value_.value;
  }
  SixtyFourOrdinalTable& set_v39(int64_t _value);
  void clear_v39() {
    if (!field_presence_.IsSet<38>()) {
      return;
    }
    field_presence_.Clear<38>();
    Destruct(&v39_value_.value);
  }

  const int64_t& v40() const {
    ZX_ASSERT(field_presence_.IsSet<39>());
    return v40_value_.value;
  }
  bool has_v40() const {
    return field_presence_.IsSet<39>();
  }

  int64_t* mutable_v40() {
    if (!field_presence_.IsSet<39>()) {
      field_presence_.Set<39>();
      Construct(&v40_value_.value);
    }
    return &v40_value_.value;
  }
  SixtyFourOrdinalTable& set_v40(int64_t _value);
  void clear_v40() {
    if (!field_presence_.IsSet<39>()) {
      return;
    }
    field_presence_.Clear<39>();
    Destruct(&v40_value_.value);
  }

  const int64_t& v41() const {
    ZX_ASSERT(field_presence_.IsSet<40>());
    return v41_value_.value;
  }
  bool has_v41() const {
    return field_presence_.IsSet<40>();
  }

  int64_t* mutable_v41() {
    if (!field_presence_.IsSet<40>()) {
      field_presence_.Set<40>();
      Construct(&v41_value_.value);
    }
    return &v41_value_.value;
  }
  SixtyFourOrdinalTable& set_v41(int64_t _value);
  void clear_v41() {
    if (!field_presence_.IsSet<40>()) {
      return;
    }
    field_presence_.Clear<40>();
    Destruct(&v41_value_.value);
  }

  const int64_t& v42() const {
    ZX_ASSERT(field_presence_.IsSet<41>());
    return v42_value_.value;
  }
  bool has_v42() const {
    return field_presence_.IsSet<41>();
  }

  int64_t* mutable_v42() {
    if (!field_presence_.IsSet<41>()) {
      field_presence_.Set<41>();
      Construct(&v42_value_.value);
    }
    return &v42_value_.value;
  }
  SixtyFourOrdinalTable& set_v42(int64_t _value);
  void clear_v42() {
    if (!field_presence_.IsSet<41>()) {
      return;
    }
    field_presence_.Clear<41>();
    Destruct(&v42_value_.value);
  }

  const int64_t& v43() const {
    ZX_ASSERT(field_presence_.IsSet<42>());
    return v43_value_.value;
  }
  bool has_v43() const {
    return field_presence_.IsSet<42>();
  }

  int64_t* mutable_v43() {
    if (!field_presence_.IsSet<42>()) {
      field_presence_.Set<42>();
      Construct(&v43_value_.value);
    }
    return &v43_value_.value;
  }
  SixtyFourOrdinalTable& set_v43(int64_t _value);
  void clear_v43() {
    if (!field_presence_.IsSet<42>()) {
      return;
    }
    field_presence_.Clear<42>();
    Destruct(&v43_value_.value);
  }

  const int64_t& v44() const {
    ZX_ASSERT(field_presence_.IsSet<43>());
    return v44_value_.value;
  }
  bool has_v44() const {
    return field_presence_.IsSet<43>();
  }

  int64_t* mutable_v44() {
    if (!field_presence_.IsSet<43>()) {
      field_presence_.Set<43>();
      Construct(&v44_value_.value);
    }
    return &v44_value_.value;
  }
  SixtyFourOrdinalTable& set_v44(int64_t _value);
  void clear_v44() {
    if (!field_presence_.IsSet<43>()) {
      return;
    }
    field_presence_.Clear<43>();
    Destruct(&v44_value_.value);
  }

  const int64_t& v45() const {
    ZX_ASSERT(field_presence_.IsSet<44>());
    return v45_value_.value;
  }
  bool has_v45() const {
    return field_presence_.IsSet<44>();
  }

  int64_t* mutable_v45() {
    if (!field_presence_.IsSet<44>()) {
      field_presence_.Set<44>();
      Construct(&v45_value_.value);
    }
    return &v45_value_.value;
  }
  SixtyFourOrdinalTable& set_v45(int64_t _value);
  void clear_v45() {
    if (!field_presence_.IsSet<44>()) {
      return;
    }
    field_presence_.Clear<44>();
    Destruct(&v45_value_.value);
  }

  const int64_t& v46() const {
    ZX_ASSERT(field_presence_.IsSet<45>());
    return v46_value_.value;
  }
  bool has_v46() const {
    return field_presence_.IsSet<45>();
  }

  int64_t* mutable_v46() {
    if (!field_presence_.IsSet<45>()) {
      field_presence_.Set<45>();
      Construct(&v46_value_.value);
    }
    return &v46_value_.value;
  }
  SixtyFourOrdinalTable& set_v46(int64_t _value);
  void clear_v46() {
    if (!field_presence_.IsSet<45>()) {
      return;
    }
    field_presence_.Clear<45>();
    Destruct(&v46_value_.value);
  }

  const int64_t& v47() const {
    ZX_ASSERT(field_presence_.IsSet<46>());
    return v47_value_.value;
  }
  bool has_v47() const {
    return field_presence_.IsSet<46>();
  }

  int64_t* mutable_v47() {
    if (!field_presence_.IsSet<46>()) {
      field_presence_.Set<46>();
      Construct(&v47_value_.value);
    }
    return &v47_value_.value;
  }
  SixtyFourOrdinalTable& set_v47(int64_t _value);
  void clear_v47() {
    if (!field_presence_.IsSet<46>()) {
      return;
    }
    field_presence_.Clear<46>();
    Destruct(&v47_value_.value);
  }

  const int64_t& v48() const {
    ZX_ASSERT(field_presence_.IsSet<47>());
    return v48_value_.value;
  }
  bool has_v48() const {
    return field_presence_.IsSet<47>();
  }

  int64_t* mutable_v48() {
    if (!field_presence_.IsSet<47>()) {
      field_presence_.Set<47>();
      Construct(&v48_value_.value);
    }
    return &v48_value_.value;
  }
  SixtyFourOrdinalTable& set_v48(int64_t _value);
  void clear_v48() {
    if (!field_presence_.IsSet<47>()) {
      return;
    }
    field_presence_.Clear<47>();
    Destruct(&v48_value_.value);
  }

  const int64_t& v49() const {
    ZX_ASSERT(field_presence_.IsSet<48>());
    return v49_value_.value;
  }
  bool has_v49() const {
    return field_presence_.IsSet<48>();
  }

  int64_t* mutable_v49() {
    if (!field_presence_.IsSet<48>()) {
      field_presence_.Set<48>();
      Construct(&v49_value_.value);
    }
    return &v49_value_.value;
  }
  SixtyFourOrdinalTable& set_v49(int64_t _value);
  void clear_v49() {
    if (!field_presence_.IsSet<48>()) {
      return;
    }
    field_presence_.Clear<48>();
    Destruct(&v49_value_.value);
  }

  const int64_t& v50() const {
    ZX_ASSERT(field_presence_.IsSet<49>());
    return v50_value_.value;
  }
  bool has_v50() const {
    return field_presence_.IsSet<49>();
  }

  int64_t* mutable_v50() {
    if (!field_presence_.IsSet<49>()) {
      field_presence_.Set<49>();
      Construct(&v50_value_.value);
    }
    return &v50_value_.value;
  }
  SixtyFourOrdinalTable& set_v50(int64_t _value);
  void clear_v50() {
    if (!field_presence_.IsSet<49>()) {
      return;
    }
    field_presence_.Clear<49>();
    Destruct(&v50_value_.value);
  }

  const int64_t& v51() const {
    ZX_ASSERT(field_presence_.IsSet<50>());
    return v51_value_.value;
  }
  bool has_v51() const {
    return field_presence_.IsSet<50>();
  }

  int64_t* mutable_v51() {
    if (!field_presence_.IsSet<50>()) {
      field_presence_.Set<50>();
      Construct(&v51_value_.value);
    }
    return &v51_value_.value;
  }
  SixtyFourOrdinalTable& set_v51(int64_t _value);
  void clear_v51() {
    if (!field_presence_.IsSet<50>()) {
      return;
    }
    field_presence_.Clear<50>();
    Destruct(&v51_value_.value);
  }

  const int64_t& v52() const {
    ZX_ASSERT(field_presence_.IsSet<51>());
    return v52_value_.value;
  }
  bool has_v52() const {
    return field_presence_.IsSet<51>();
  }

  int64_t* mutable_v52() {
    if (!field_presence_.IsSet<51>()) {
      field_presence_.Set<51>();
      Construct(&v52_value_.value);
    }
    return &v52_value_.value;
  }
  SixtyFourOrdinalTable& set_v52(int64_t _value);
  void clear_v52() {
    if (!field_presence_.IsSet<51>()) {
      return;
    }
    field_presence_.Clear<51>();
    Destruct(&v52_value_.value);
  }

  const int64_t& v53() const {
    ZX_ASSERT(field_presence_.IsSet<52>());
    return v53_value_.value;
  }
  bool has_v53() const {
    return field_presence_.IsSet<52>();
  }

  int64_t* mutable_v53() {
    if (!field_presence_.IsSet<52>()) {
      field_presence_.Set<52>();
      Construct(&v53_value_.value);
    }
    return &v53_value_.value;
  }
  SixtyFourOrdinalTable& set_v53(int64_t _value);
  void clear_v53() {
    if (!field_presence_.IsSet<52>()) {
      return;
    }
    field_presence_.Clear<52>();
    Destruct(&v53_value_.value);
  }

  const int64_t& v54() const {
    ZX_ASSERT(field_presence_.IsSet<53>());
    return v54_value_.value;
  }
  bool has_v54() const {
    return field_presence_.IsSet<53>();
  }

  int64_t* mutable_v54() {
    if (!field_presence_.IsSet<53>()) {
      field_presence_.Set<53>();
      Construct(&v54_value_.value);
    }
    return &v54_value_.value;
  }
  SixtyFourOrdinalTable& set_v54(int64_t _value);
  void clear_v54() {
    if (!field_presence_.IsSet<53>()) {
      return;
    }
    field_presence_.Clear<53>();
    Destruct(&v54_value_.value);
  }

  const int64_t& v55() const {
    ZX_ASSERT(field_presence_.IsSet<54>());
    return v55_value_.value;
  }
  bool has_v55() const {
    return field_presence_.IsSet<54>();
  }

  int64_t* mutable_v55() {
    if (!field_presence_.IsSet<54>()) {
      field_presence_.Set<54>();
      Construct(&v55_value_.value);
    }
    return &v55_value_.value;
  }
  SixtyFourOrdinalTable& set_v55(int64_t _value);
  void clear_v55() {
    if (!field_presence_.IsSet<54>()) {
      return;
    }
    field_presence_.Clear<54>();
    Destruct(&v55_value_.value);
  }

  const int64_t& v56() const {
    ZX_ASSERT(field_presence_.IsSet<55>());
    return v56_value_.value;
  }
  bool has_v56() const {
    return field_presence_.IsSet<55>();
  }

  int64_t* mutable_v56() {
    if (!field_presence_.IsSet<55>()) {
      field_presence_.Set<55>();
      Construct(&v56_value_.value);
    }
    return &v56_value_.value;
  }
  SixtyFourOrdinalTable& set_v56(int64_t _value);
  void clear_v56() {
    if (!field_presence_.IsSet<55>()) {
      return;
    }
    field_presence_.Clear<55>();
    Destruct(&v56_value_.value);
  }

  const int64_t& v57() const {
    ZX_ASSERT(field_presence_.IsSet<56>());
    return v57_value_.value;
  }
  bool has_v57() const {
    return field_presence_.IsSet<56>();
  }

  int64_t* mutable_v57() {
    if (!field_presence_.IsSet<56>()) {
      field_presence_.Set<56>();
      Construct(&v57_value_.value);
    }
    return &v57_value_.value;
  }
  SixtyFourOrdinalTable& set_v57(int64_t _value);
  void clear_v57() {
    if (!field_presence_.IsSet<56>()) {
      return;
    }
    field_presence_.Clear<56>();
    Destruct(&v57_value_.value);
  }

  const int64_t& v58() const {
    ZX_ASSERT(field_presence_.IsSet<57>());
    return v58_value_.value;
  }
  bool has_v58() const {
    return field_presence_.IsSet<57>();
  }

  int64_t* mutable_v58() {
    if (!field_presence_.IsSet<57>()) {
      field_presence_.Set<57>();
      Construct(&v58_value_.value);
    }
    return &v58_value_.value;
  }
  SixtyFourOrdinalTable& set_v58(int64_t _value);
  void clear_v58() {
    if (!field_presence_.IsSet<57>()) {
      return;
    }
    field_presence_.Clear<57>();
    Destruct(&v58_value_.value);
  }

  const int64_t& v59() const {
    ZX_ASSERT(field_presence_.IsSet<58>());
    return v59_value_.value;
  }
  bool has_v59() const {
    return field_presence_.IsSet<58>();
  }

  int64_t* mutable_v59() {
    if (!field_presence_.IsSet<58>()) {
      field_presence_.Set<58>();
      Construct(&v59_value_.value);
    }
    return &v59_value_.value;
  }
  SixtyFourOrdinalTable& set_v59(int64_t _value);
  void clear_v59() {
    if (!field_presence_.IsSet<58>()) {
      return;
    }
    field_presence_.Clear<58>();
    Destruct(&v59_value_.value);
  }

  const int64_t& v60() const {
    ZX_ASSERT(field_presence_.IsSet<59>());
    return v60_value_.value;
  }
  bool has_v60() const {
    return field_presence_.IsSet<59>();
  }

  int64_t* mutable_v60() {
    if (!field_presence_.IsSet<59>()) {
      field_presence_.Set<59>();
      Construct(&v60_value_.value);
    }
    return &v60_value_.value;
  }
  SixtyFourOrdinalTable& set_v60(int64_t _value);
  void clear_v60() {
    if (!field_presence_.IsSet<59>()) {
      return;
    }
    field_presence_.Clear<59>();
    Destruct(&v60_value_.value);
  }

  const int64_t& v61() const {
    ZX_ASSERT(field_presence_.IsSet<60>());
    return v61_value_.value;
  }
  bool has_v61() const {
    return field_presence_.IsSet<60>();
  }

  int64_t* mutable_v61() {
    if (!field_presence_.IsSet<60>()) {
      field_presence_.Set<60>();
      Construct(&v61_value_.value);
    }
    return &v61_value_.value;
  }
  SixtyFourOrdinalTable& set_v61(int64_t _value);
  void clear_v61() {
    if (!field_presence_.IsSet<60>()) {
      return;
    }
    field_presence_.Clear<60>();
    Destruct(&v61_value_.value);
  }

  const int64_t& v62() const {
    ZX_ASSERT(field_presence_.IsSet<61>());
    return v62_value_.value;
  }
  bool has_v62() const {
    return field_presence_.IsSet<61>();
  }

  int64_t* mutable_v62() {
    if (!field_presence_.IsSet<61>()) {
      field_presence_.Set<61>();
      Construct(&v62_value_.value);
    }
    return &v62_value_.value;
  }
  SixtyFourOrdinalTable& set_v62(int64_t _value);
  void clear_v62() {
    if (!field_presence_.IsSet<61>()) {
      return;
    }
    field_presence_.Clear<61>();
    Destruct(&v62_value_.value);
  }

  const int64_t& v63() const {
    ZX_ASSERT(field_presence_.IsSet<62>());
    return v63_value_.value;
  }
  bool has_v63() const {
    return field_presence_.IsSet<62>();
  }

  int64_t* mutable_v63() {
    if (!field_presence_.IsSet<62>()) {
      field_presence_.Set<62>();
      Construct(&v63_value_.value);
    }
    return &v63_value_.value;
  }
  SixtyFourOrdinalTable& set_v63(int64_t _value);
  void clear_v63() {
    if (!field_presence_.IsSet<62>()) {
      return;
    }
    field_presence_.Clear<62>();
    Destruct(&v63_value_.value);
  }

  const ::test::table::ExtensionTable& v64() const {
    ZX_ASSERT(field_presence_.IsSet<63>());
    return v64_value_.value;
  }
  bool has_v64() const {
    return field_presence_.IsSet<63>();
  }

  ::test::table::ExtensionTable* mutable_v64() {
    if (!field_presence_.IsSet<63>()) {
      field_presence_.Set<63>();
      Construct(&v64_value_.value);
    }
    return &v64_value_.value;
  }
  SixtyFourOrdinalTable& set_v64(::test::table::ExtensionTable _value);
  void clear_v64() {
    if (!field_presence_.IsSet<63>()) {
      return;
    }
    field_presence_.Clear<63>();
    Destruct(&v64_value_.value);
  }

  SixtyFourOrdinalTable();
  SixtyFourOrdinalTable(SixtyFourOrdinalTable&& other);
  ~SixtyFourOrdinalTable();
  SixtyFourOrdinalTable& operator=(SixtyFourOrdinalTable&& other);

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

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

 private:
  template <class T, class... Args>
  void Construct(T* p, Args&&... args) {
    new (p) T(std::forward<Args>(args)...);
  }

  template <class T>
  void Destruct(T* p) {
    p->~T();
  }

  size_t MaxOrdinal() const {
    return static_cast<size_t>(field_presence_.MaxSetIndex()) + std::size_t{1};
  }

  static bool IsOrdinalKnown(uint64_t ordinal) {
    switch (ordinal) {
      case 1:
      case 2:
      case 3:
      case 4:
      case 5:
      case 6:
      case 7:
      case 8:
      case 9:
      case 10:
      case 11:
      case 12:
      case 13:
      case 14:
      case 15:
      case 16:
      case 17:
      case 18:
      case 19:
      case 20:
      case 21:
      case 22:
      case 23:
      case 24:
      case 25:
      case 26:
      case 27:
      case 28:
      case 29:
      case 30:
      case 31:
      case 32:
      case 33:
      case 34:
      case 35:
      case 36:
      case 37:
      case 38:
      case 39:
      case 40:
      case 41:
      case 42:
      case 43:
      case 44:
      case 45:
      case 46:
      case 47:
      case 48:
      case 49:
      case 50:
      case 51:
      case 52:
      case 53:
      case 54:
      case 55:
      case 56:
      case 57:
      case 58:
      case 59:
      case 60:
      case 61:
      case 62:
      case 63:
      case 64:
        return true;
      default:
        return false;
    }
  }

  ::fidl::internal::BitSet<64> field_presence_;
  union ValueUnion_v1 {
    ValueUnion_v1() {}
    ~ValueUnion_v1() {}

    int64_t value;
  };
  ValueUnion_v1 v1_value_;
  union ValueUnion_v2 {
    ValueUnion_v2() {}
    ~ValueUnion_v2() {}

    int64_t value;
  };
  ValueUnion_v2 v2_value_;
  union ValueUnion_v3 {
    ValueUnion_v3() {}
    ~ValueUnion_v3() {}

    int64_t value;
  };
  ValueUnion_v3 v3_value_;
  union ValueUnion_v4 {
    ValueUnion_v4() {}
    ~ValueUnion_v4() {}

    int64_t value;
  };
  ValueUnion_v4 v4_value_;
  union ValueUnion_v5 {
    ValueUnion_v5() {}
    ~ValueUnion_v5() {}

    int64_t value;
  };
  ValueUnion_v5 v5_value_;
  union ValueUnion_v6 {
    ValueUnion_v6() {}
    ~ValueUnion_v6() {}

    int64_t value;
  };
  ValueUnion_v6 v6_value_;
  union ValueUnion_v7 {
    ValueUnion_v7() {}
    ~ValueUnion_v7() {}

    int64_t value;
  };
  ValueUnion_v7 v7_value_;
  union ValueUnion_v8 {
    ValueUnion_v8() {}
    ~ValueUnion_v8() {}

    int64_t value;
  };
  ValueUnion_v8 v8_value_;
  union ValueUnion_v9 {
    ValueUnion_v9() {}
    ~ValueUnion_v9() {}

    int64_t value;
  };
  ValueUnion_v9 v9_value_;
  union ValueUnion_v10 {
    ValueUnion_v10() {}
    ~ValueUnion_v10() {}

    int64_t value;
  };
  ValueUnion_v10 v10_value_;
  union ValueUnion_v11 {
    ValueUnion_v11() {}
    ~ValueUnion_v11() {}

    int64_t value;
  };
  ValueUnion_v11 v11_value_;
  union ValueUnion_v12 {
    ValueUnion_v12() {}
    ~ValueUnion_v12() {}

    int64_t value;
  };
  ValueUnion_v12 v12_value_;
  union ValueUnion_v13 {
    ValueUnion_v13() {}
    ~ValueUnion_v13() {}

    int64_t value;
  };
  ValueUnion_v13 v13_value_;
  union ValueUnion_v14 {
    ValueUnion_v14() {}
    ~ValueUnion_v14() {}

    int64_t value;
  };
  ValueUnion_v14 v14_value_;
  union ValueUnion_v15 {
    ValueUnion_v15() {}
    ~ValueUnion_v15() {}

    int64_t value;
  };
  ValueUnion_v15 v15_value_;
  union ValueUnion_v16 {
    ValueUnion_v16() {}
    ~ValueUnion_v16() {}

    int64_t value;
  };
  ValueUnion_v16 v16_value_;
  union ValueUnion_v17 {
    ValueUnion_v17() {}
    ~ValueUnion_v17() {}

    int64_t value;
  };
  ValueUnion_v17 v17_value_;
  union ValueUnion_v18 {
    ValueUnion_v18() {}
    ~ValueUnion_v18() {}

    int64_t value;
  };
  ValueUnion_v18 v18_value_;
  union ValueUnion_v19 {
    ValueUnion_v19() {}
    ~ValueUnion_v19() {}

    int64_t value;
  };
  ValueUnion_v19 v19_value_;
  union ValueUnion_v20 {
    ValueUnion_v20() {}
    ~ValueUnion_v20() {}

    int64_t value;
  };
  ValueUnion_v20 v20_value_;
  union ValueUnion_v21 {
    ValueUnion_v21() {}
    ~ValueUnion_v21() {}

    int64_t value;
  };
  ValueUnion_v21 v21_value_;
  union ValueUnion_v22 {
    ValueUnion_v22() {}
    ~ValueUnion_v22() {}

    int64_t value;
  };
  ValueUnion_v22 v22_value_;
  union ValueUnion_v23 {
    ValueUnion_v23() {}
    ~ValueUnion_v23() {}

    int64_t value;
  };
  ValueUnion_v23 v23_value_;
  union ValueUnion_v24 {
    ValueUnion_v24() {}
    ~ValueUnion_v24() {}

    int64_t value;
  };
  ValueUnion_v24 v24_value_;
  union ValueUnion_v25 {
    ValueUnion_v25() {}
    ~ValueUnion_v25() {}

    int64_t value;
  };
  ValueUnion_v25 v25_value_;
  union ValueUnion_v26 {
    ValueUnion_v26() {}
    ~ValueUnion_v26() {}

    int64_t value;
  };
  ValueUnion_v26 v26_value_;
  union ValueUnion_v27 {
    ValueUnion_v27() {}
    ~ValueUnion_v27() {}

    int64_t value;
  };
  ValueUnion_v27 v27_value_;
  union ValueUnion_v28 {
    ValueUnion_v28() {}
    ~ValueUnion_v28() {}

    int64_t value;
  };
  ValueUnion_v28 v28_value_;
  union ValueUnion_v29 {
    ValueUnion_v29() {}
    ~ValueUnion_v29() {}

    int64_t value;
  };
  ValueUnion_v29 v29_value_;
  union ValueUnion_v30 {
    ValueUnion_v30() {}
    ~ValueUnion_v30() {}

    int64_t value;
  };
  ValueUnion_v30 v30_value_;
  union ValueUnion_v31 {
    ValueUnion_v31() {}
    ~ValueUnion_v31() {}

    int64_t value;
  };
  ValueUnion_v31 v31_value_;
  union ValueUnion_v32 {
    ValueUnion_v32() {}
    ~ValueUnion_v32() {}

    int64_t value;
  };
  ValueUnion_v32 v32_value_;
  union ValueUnion_v33 {
    ValueUnion_v33() {}
    ~ValueUnion_v33() {}

    int64_t value;
  };
  ValueUnion_v33 v33_value_;
  union ValueUnion_v34 {
    ValueUnion_v34() {}
    ~ValueUnion_v34() {}

    int64_t value;
  };
  ValueUnion_v34 v34_value_;
  union ValueUnion_v35 {
    ValueUnion_v35() {}
    ~ValueUnion_v35() {}

    int64_t value;
  };
  ValueUnion_v35 v35_value_;
  union ValueUnion_v36 {
    ValueUnion_v36() {}
    ~ValueUnion_v36() {}

    int64_t value;
  };
  ValueUnion_v36 v36_value_;
  union ValueUnion_v37 {
    ValueUnion_v37() {}
    ~ValueUnion_v37() {}

    int64_t value;
  };
  ValueUnion_v37 v37_value_;
  union ValueUnion_v38 {
    ValueUnion_v38() {}
    ~ValueUnion_v38() {}

    int64_t value;
  };
  ValueUnion_v38 v38_value_;
  union ValueUnion_v39 {
    ValueUnion_v39() {}
    ~ValueUnion_v39() {}

    int64_t value;
  };
  ValueUnion_v39 v39_value_;
  union ValueUnion_v40 {
    ValueUnion_v40() {}
    ~ValueUnion_v40() {}

    int64_t value;
  };
  ValueUnion_v40 v40_value_;
  union ValueUnion_v41 {
    ValueUnion_v41() {}
    ~ValueUnion_v41() {}

    int64_t value;
  };
  ValueUnion_v41 v41_value_;
  union ValueUnion_v42 {
    ValueUnion_v42() {}
    ~ValueUnion_v42() {}

    int64_t value;
  };
  ValueUnion_v42 v42_value_;
  union ValueUnion_v43 {
    ValueUnion_v43() {}
    ~ValueUnion_v43() {}

    int64_t value;
  };
  ValueUnion_v43 v43_value_;
  union ValueUnion_v44 {
    ValueUnion_v44() {}
    ~ValueUnion_v44() {}

    int64_t value;
  };
  ValueUnion_v44 v44_value_;
  union ValueUnion_v45 {
    ValueUnion_v45() {}
    ~ValueUnion_v45() {}

    int64_t value;
  };
  ValueUnion_v45 v45_value_;
  union ValueUnion_v46 {
    ValueUnion_v46() {}
    ~ValueUnion_v46() {}

    int64_t value;
  };
  ValueUnion_v46 v46_value_;
  union ValueUnion_v47 {
    ValueUnion_v47() {}
    ~ValueUnion_v47() {}

    int64_t value;
  };
  ValueUnion_v47 v47_value_;
  union ValueUnion_v48 {
    ValueUnion_v48() {}
    ~ValueUnion_v48() {}

    int64_t value;
  };
  ValueUnion_v48 v48_value_;
  union ValueUnion_v49 {
    ValueUnion_v49() {}
    ~ValueUnion_v49() {}

    int64_t value;
  };
  ValueUnion_v49 v49_value_;
  union ValueUnion_v50 {
    ValueUnion_v50() {}
    ~ValueUnion_v50() {}

    int64_t value;
  };
  ValueUnion_v50 v50_value_;
  union ValueUnion_v51 {
    ValueUnion_v51() {}
    ~ValueUnion_v51() {}

    int64_t value;
  };
  ValueUnion_v51 v51_value_;
  union ValueUnion_v52 {
    ValueUnion_v52() {}
    ~ValueUnion_v52() {}

    int64_t value;
  };
  ValueUnion_v52 v52_value_;
  union ValueUnion_v53 {
    ValueUnion_v53() {}
    ~ValueUnion_v53() {}

    int64_t value;
  };
  ValueUnion_v53 v53_value_;
  union ValueUnion_v54 {
    ValueUnion_v54() {}
    ~ValueUnion_v54() {}

    int64_t value;
  };
  ValueUnion_v54 v54_value_;
  union ValueUnion_v55 {
    ValueUnion_v55() {}
    ~ValueUnion_v55() {}

    int64_t value;
  };
  ValueUnion_v55 v55_value_;
  union ValueUnion_v56 {
    ValueUnion_v56() {}
    ~ValueUnion_v56() {}

    int64_t value;
  };
  ValueUnion_v56 v56_value_;
  union ValueUnion_v57 {
    ValueUnion_v57() {}
    ~ValueUnion_v57() {}

    int64_t value;
  };
  ValueUnion_v57 v57_value_;
  union ValueUnion_v58 {
    ValueUnion_v58() {}
    ~ValueUnion_v58() {}

    int64_t value;
  };
  ValueUnion_v58 v58_value_;
  union ValueUnion_v59 {
    ValueUnion_v59() {}
    ~ValueUnion_v59() {}

    int64_t value;
  };
  ValueUnion_v59 v59_value_;
  union ValueUnion_v60 {
    ValueUnion_v60() {}
    ~ValueUnion_v60() {}

    int64_t value;
  };
  ValueUnion_v60 v60_value_;
  union ValueUnion_v61 {
    ValueUnion_v61() {}
    ~ValueUnion_v61() {}

    int64_t value;
  };
  ValueUnion_v61 v61_value_;
  union ValueUnion_v62 {
    ValueUnion_v62() {}
    ~ValueUnion_v62() {}

    int64_t value;
  };
  ValueUnion_v62 v62_value_;
  union ValueUnion_v63 {
    ValueUnion_v63() {}
    ~ValueUnion_v63() {}

    int64_t value;
  };
  ValueUnion_v63 v63_value_;
  union ValueUnion_v64 {
    ValueUnion_v64() {}
    ~ValueUnion_v64() {}

    ::test::table::ExtensionTable value;
  };
  ValueUnion_v64 v64_value_;
};

using SixtyFourOrdinalTablePtr = ::std::unique_ptr<SixtyFourOrdinalTable>;

}  // namespace table
}  // namespace test
namespace fidl {

template <>
struct CodingTraits<::test::table::EmptyTable>
    : public EncodableCodingTraits<::test::table::EmptyTable, 16> {};

inline zx_status_t Clone(const ::test::table::EmptyTable& _value,
                         ::test::table::EmptyTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::EmptyTable> {
  bool operator()(const ::test::table::EmptyTable& _lhs, const ::test::table::EmptyTable& _rhs) const {
    return true;
  }
};
template <>
struct CodingTraits<::test::table::SimpleTable>
    : public EncodableCodingTraits<::test::table::SimpleTable, 16> {};

inline zx_status_t Clone(const ::test::table::SimpleTable& _value,
                         ::test::table::SimpleTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::SimpleTable> {
  bool operator()(const ::test::table::SimpleTable& _lhs, const ::test::table::SimpleTable& _rhs) const {
    if (_lhs.has_x()) {
      if (!_rhs.has_x()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.x(), _rhs.x())) {
        return false;
      }
    } else if (_rhs.has_x()) {
      return false;
    }
    if (_lhs.has_y()) {
      if (!_rhs.has_y()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.y(), _rhs.y())) {
        return false;
      }
    } else if (_rhs.has_y()) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::table::OlderSimpleTable>
    : public EncodableCodingTraits<::test::table::OlderSimpleTable, 16> {};

inline zx_status_t Clone(const ::test::table::OlderSimpleTable& _value,
                         ::test::table::OlderSimpleTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::OlderSimpleTable> {
  bool operator()(const ::test::table::OlderSimpleTable& _lhs, const ::test::table::OlderSimpleTable& _rhs) const {
    if (_lhs.has_x()) {
      if (!_rhs.has_x()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.x(), _rhs.x())) {
        return false;
      }
    } else if (_rhs.has_x()) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::table::NewerSimpleTable>
    : public EncodableCodingTraits<::test::table::NewerSimpleTable, 16> {};

inline zx_status_t Clone(const ::test::table::NewerSimpleTable& _value,
                         ::test::table::NewerSimpleTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::NewerSimpleTable> {
  bool operator()(const ::test::table::NewerSimpleTable& _lhs, const ::test::table::NewerSimpleTable& _rhs) const {
    if (_lhs.has_x()) {
      if (!_rhs.has_x()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.x(), _rhs.x())) {
        return false;
      }
    } else if (_rhs.has_x()) {
      return false;
    }
    if (_lhs.has_y()) {
      if (!_rhs.has_y()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.y(), _rhs.y())) {
        return false;
      }
    } else if (_rhs.has_y()) {
      return false;
    }
    if (_lhs.has_z()) {
      if (!_rhs.has_z()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.z(), _rhs.z())) {
        return false;
      }
    } else if (_rhs.has_z()) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::table::ReverseOrdinalTable>
    : public EncodableCodingTraits<::test::table::ReverseOrdinalTable, 16> {};

inline zx_status_t Clone(const ::test::table::ReverseOrdinalTable& _value,
                         ::test::table::ReverseOrdinalTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::ReverseOrdinalTable> {
  bool operator()(const ::test::table::ReverseOrdinalTable& _lhs, const ::test::table::ReverseOrdinalTable& _rhs) const {
    if (_lhs.has_z()) {
      if (!_rhs.has_z()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.z(), _rhs.z())) {
        return false;
      }
    } else if (_rhs.has_z()) {
      return false;
    }
    if (_lhs.has_y()) {
      if (!_rhs.has_y()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.y(), _rhs.y())) {
        return false;
      }
    } else if (_rhs.has_y()) {
      return false;
    }
    if (_lhs.has_x()) {
      if (!_rhs.has_x()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.x(), _rhs.x())) {
        return false;
      }
    } else if (_rhs.has_x()) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::table::TableWithAttributes>
    : public EncodableCodingTraits<::test::table::TableWithAttributes, 16> {};

inline zx_status_t Clone(const ::test::table::TableWithAttributes& _value,
                         ::test::table::TableWithAttributes* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::TableWithAttributes> {
  bool operator()(const ::test::table::TableWithAttributes& _lhs, const ::test::table::TableWithAttributes& _rhs) const {
    if (_lhs.has_x()) {
      if (!_rhs.has_x()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.x(), _rhs.x())) {
        return false;
      }
    } else if (_rhs.has_x()) {
      return false;
    }
    return true;
  }
};
template <>
struct CodingTraits<::test::table::ExtensionTable>
    : public EncodableCodingTraits<::test::table::ExtensionTable, 16> {};

inline zx_status_t Clone(const ::test::table::ExtensionTable& _value,
                         ::test::table::ExtensionTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::ExtensionTable> {
  bool operator()(const ::test::table::ExtensionTable& _lhs, const ::test::table::ExtensionTable& _rhs) const {
    return true;
  }
};
template <>
struct CodingTraits<::test::table::SixtyFourOrdinalTable>
    : public EncodableCodingTraits<::test::table::SixtyFourOrdinalTable, 16> {};

inline zx_status_t Clone(const ::test::table::SixtyFourOrdinalTable& _value,
                         ::test::table::SixtyFourOrdinalTable* result) {
  return _value.Clone(result);
}
template <>
struct Equality<::test::table::SixtyFourOrdinalTable> {
  bool operator()(const ::test::table::SixtyFourOrdinalTable& _lhs, const ::test::table::SixtyFourOrdinalTable& _rhs) const {
    if (_lhs.has_v1()) {
      if (!_rhs.has_v1()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v1(), _rhs.v1())) {
        return false;
      }
    } else if (_rhs.has_v1()) {
      return false;
    }
    if (_lhs.has_v2()) {
      if (!_rhs.has_v2()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v2(), _rhs.v2())) {
        return false;
      }
    } else if (_rhs.has_v2()) {
      return false;
    }
    if (_lhs.has_v3()) {
      if (!_rhs.has_v3()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v3(), _rhs.v3())) {
        return false;
      }
    } else if (_rhs.has_v3()) {
      return false;
    }
    if (_lhs.has_v4()) {
      if (!_rhs.has_v4()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v4(), _rhs.v4())) {
        return false;
      }
    } else if (_rhs.has_v4()) {
      return false;
    }
    if (_lhs.has_v5()) {
      if (!_rhs.has_v5()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v5(), _rhs.v5())) {
        return false;
      }
    } else if (_rhs.has_v5()) {
      return false;
    }
    if (_lhs.has_v6()) {
      if (!_rhs.has_v6()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v6(), _rhs.v6())) {
        return false;
      }
    } else if (_rhs.has_v6()) {
      return false;
    }
    if (_lhs.has_v7()) {
      if (!_rhs.has_v7()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v7(), _rhs.v7())) {
        return false;
      }
    } else if (_rhs.has_v7()) {
      return false;
    }
    if (_lhs.has_v8()) {
      if (!_rhs.has_v8()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v8(), _rhs.v8())) {
        return false;
      }
    } else if (_rhs.has_v8()) {
      return false;
    }
    if (_lhs.has_v9()) {
      if (!_rhs.has_v9()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v9(), _rhs.v9())) {
        return false;
      }
    } else if (_rhs.has_v9()) {
      return false;
    }
    if (_lhs.has_v10()) {
      if (!_rhs.has_v10()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v10(), _rhs.v10())) {
        return false;
      }
    } else if (_rhs.has_v10()) {
      return false;
    }
    if (_lhs.has_v11()) {
      if (!_rhs.has_v11()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v11(), _rhs.v11())) {
        return false;
      }
    } else if (_rhs.has_v11()) {
      return false;
    }
    if (_lhs.has_v12()) {
      if (!_rhs.has_v12()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v12(), _rhs.v12())) {
        return false;
      }
    } else if (_rhs.has_v12()) {
      return false;
    }
    if (_lhs.has_v13()) {
      if (!_rhs.has_v13()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v13(), _rhs.v13())) {
        return false;
      }
    } else if (_rhs.has_v13()) {
      return false;
    }
    if (_lhs.has_v14()) {
      if (!_rhs.has_v14()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v14(), _rhs.v14())) {
        return false;
      }
    } else if (_rhs.has_v14()) {
      return false;
    }
    if (_lhs.has_v15()) {
      if (!_rhs.has_v15()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v15(), _rhs.v15())) {
        return false;
      }
    } else if (_rhs.has_v15()) {
      return false;
    }
    if (_lhs.has_v16()) {
      if (!_rhs.has_v16()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v16(), _rhs.v16())) {
        return false;
      }
    } else if (_rhs.has_v16()) {
      return false;
    }
    if (_lhs.has_v17()) {
      if (!_rhs.has_v17()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v17(), _rhs.v17())) {
        return false;
      }
    } else if (_rhs.has_v17()) {
      return false;
    }
    if (_lhs.has_v18()) {
      if (!_rhs.has_v18()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v18(), _rhs.v18())) {
        return false;
      }
    } else if (_rhs.has_v18()) {
      return false;
    }
    if (_lhs.has_v19()) {
      if (!_rhs.has_v19()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v19(), _rhs.v19())) {
        return false;
      }
    } else if (_rhs.has_v19()) {
      return false;
    }
    if (_lhs.has_v20()) {
      if (!_rhs.has_v20()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v20(), _rhs.v20())) {
        return false;
      }
    } else if (_rhs.has_v20()) {
      return false;
    }
    if (_lhs.has_v21()) {
      if (!_rhs.has_v21()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v21(), _rhs.v21())) {
        return false;
      }
    } else if (_rhs.has_v21()) {
      return false;
    }
    if (_lhs.has_v22()) {
      if (!_rhs.has_v22()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v22(), _rhs.v22())) {
        return false;
      }
    } else if (_rhs.has_v22()) {
      return false;
    }
    if (_lhs.has_v23()) {
      if (!_rhs.has_v23()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v23(), _rhs.v23())) {
        return false;
      }
    } else if (_rhs.has_v23()) {
      return false;
    }
    if (_lhs.has_v24()) {
      if (!_rhs.has_v24()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v24(), _rhs.v24())) {
        return false;
      }
    } else if (_rhs.has_v24()) {
      return false;
    }
    if (_lhs.has_v25()) {
      if (!_rhs.has_v25()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v25(), _rhs.v25())) {
        return false;
      }
    } else if (_rhs.has_v25()) {
      return false;
    }
    if (_lhs.has_v26()) {
      if (!_rhs.has_v26()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v26(), _rhs.v26())) {
        return false;
      }
    } else if (_rhs.has_v26()) {
      return false;
    }
    if (_lhs.has_v27()) {
      if (!_rhs.has_v27()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v27(), _rhs.v27())) {
        return false;
      }
    } else if (_rhs.has_v27()) {
      return false;
    }
    if (_lhs.has_v28()) {
      if (!_rhs.has_v28()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v28(), _rhs.v28())) {
        return false;
      }
    } else if (_rhs.has_v28()) {
      return false;
    }
    if (_lhs.has_v29()) {
      if (!_rhs.has_v29()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v29(), _rhs.v29())) {
        return false;
      }
    } else if (_rhs.has_v29()) {
      return false;
    }
    if (_lhs.has_v30()) {
      if (!_rhs.has_v30()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v30(), _rhs.v30())) {
        return false;
      }
    } else if (_rhs.has_v30()) {
      return false;
    }
    if (_lhs.has_v31()) {
      if (!_rhs.has_v31()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v31(), _rhs.v31())) {
        return false;
      }
    } else if (_rhs.has_v31()) {
      return false;
    }
    if (_lhs.has_v32()) {
      if (!_rhs.has_v32()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v32(), _rhs.v32())) {
        return false;
      }
    } else if (_rhs.has_v32()) {
      return false;
    }
    if (_lhs.has_v33()) {
      if (!_rhs.has_v33()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v33(), _rhs.v33())) {
        return false;
      }
    } else if (_rhs.has_v33()) {
      return false;
    }
    if (_lhs.has_v34()) {
      if (!_rhs.has_v34()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v34(), _rhs.v34())) {
        return false;
      }
    } else if (_rhs.has_v34()) {
      return false;
    }
    if (_lhs.has_v35()) {
      if (!_rhs.has_v35()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v35(), _rhs.v35())) {
        return false;
      }
    } else if (_rhs.has_v35()) {
      return false;
    }
    if (_lhs.has_v36()) {
      if (!_rhs.has_v36()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v36(), _rhs.v36())) {
        return false;
      }
    } else if (_rhs.has_v36()) {
      return false;
    }
    if (_lhs.has_v37()) {
      if (!_rhs.has_v37()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v37(), _rhs.v37())) {
        return false;
      }
    } else if (_rhs.has_v37()) {
      return false;
    }
    if (_lhs.has_v38()) {
      if (!_rhs.has_v38()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v38(), _rhs.v38())) {
        return false;
      }
    } else if (_rhs.has_v38()) {
      return false;
    }
    if (_lhs.has_v39()) {
      if (!_rhs.has_v39()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v39(), _rhs.v39())) {
        return false;
      }
    } else if (_rhs.has_v39()) {
      return false;
    }
    if (_lhs.has_v40()) {
      if (!_rhs.has_v40()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v40(), _rhs.v40())) {
        return false;
      }
    } else if (_rhs.has_v40()) {
      return false;
    }
    if (_lhs.has_v41()) {
      if (!_rhs.has_v41()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v41(), _rhs.v41())) {
        return false;
      }
    } else if (_rhs.has_v41()) {
      return false;
    }
    if (_lhs.has_v42()) {
      if (!_rhs.has_v42()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v42(), _rhs.v42())) {
        return false;
      }
    } else if (_rhs.has_v42()) {
      return false;
    }
    if (_lhs.has_v43()) {
      if (!_rhs.has_v43()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v43(), _rhs.v43())) {
        return false;
      }
    } else if (_rhs.has_v43()) {
      return false;
    }
    if (_lhs.has_v44()) {
      if (!_rhs.has_v44()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v44(), _rhs.v44())) {
        return false;
      }
    } else if (_rhs.has_v44()) {
      return false;
    }
    if (_lhs.has_v45()) {
      if (!_rhs.has_v45()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v45(), _rhs.v45())) {
        return false;
      }
    } else if (_rhs.has_v45()) {
      return false;
    }
    if (_lhs.has_v46()) {
      if (!_rhs.has_v46()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v46(), _rhs.v46())) {
        return false;
      }
    } else if (_rhs.has_v46()) {
      return false;
    }
    if (_lhs.has_v47()) {
      if (!_rhs.has_v47()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v47(), _rhs.v47())) {
        return false;
      }
    } else if (_rhs.has_v47()) {
      return false;
    }
    if (_lhs.has_v48()) {
      if (!_rhs.has_v48()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v48(), _rhs.v48())) {
        return false;
      }
    } else if (_rhs.has_v48()) {
      return false;
    }
    if (_lhs.has_v49()) {
      if (!_rhs.has_v49()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v49(), _rhs.v49())) {
        return false;
      }
    } else if (_rhs.has_v49()) {
      return false;
    }
    if (_lhs.has_v50()) {
      if (!_rhs.has_v50()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v50(), _rhs.v50())) {
        return false;
      }
    } else if (_rhs.has_v50()) {
      return false;
    }
    if (_lhs.has_v51()) {
      if (!_rhs.has_v51()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v51(), _rhs.v51())) {
        return false;
      }
    } else if (_rhs.has_v51()) {
      return false;
    }
    if (_lhs.has_v52()) {
      if (!_rhs.has_v52()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v52(), _rhs.v52())) {
        return false;
      }
    } else if (_rhs.has_v52()) {
      return false;
    }
    if (_lhs.has_v53()) {
      if (!_rhs.has_v53()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v53(), _rhs.v53())) {
        return false;
      }
    } else if (_rhs.has_v53()) {
      return false;
    }
    if (_lhs.has_v54()) {
      if (!_rhs.has_v54()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v54(), _rhs.v54())) {
        return false;
      }
    } else if (_rhs.has_v54()) {
      return false;
    }
    if (_lhs.has_v55()) {
      if (!_rhs.has_v55()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v55(), _rhs.v55())) {
        return false;
      }
    } else if (_rhs.has_v55()) {
      return false;
    }
    if (_lhs.has_v56()) {
      if (!_rhs.has_v56()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v56(), _rhs.v56())) {
        return false;
      }
    } else if (_rhs.has_v56()) {
      return false;
    }
    if (_lhs.has_v57()) {
      if (!_rhs.has_v57()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v57(), _rhs.v57())) {
        return false;
      }
    } else if (_rhs.has_v57()) {
      return false;
    }
    if (_lhs.has_v58()) {
      if (!_rhs.has_v58()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v58(), _rhs.v58())) {
        return false;
      }
    } else if (_rhs.has_v58()) {
      return false;
    }
    if (_lhs.has_v59()) {
      if (!_rhs.has_v59()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v59(), _rhs.v59())) {
        return false;
      }
    } else if (_rhs.has_v59()) {
      return false;
    }
    if (_lhs.has_v60()) {
      if (!_rhs.has_v60()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v60(), _rhs.v60())) {
        return false;
      }
    } else if (_rhs.has_v60()) {
      return false;
    }
    if (_lhs.has_v61()) {
      if (!_rhs.has_v61()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v61(), _rhs.v61())) {
        return false;
      }
    } else if (_rhs.has_v61()) {
      return false;
    }
    if (_lhs.has_v62()) {
      if (!_rhs.has_v62()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v62(), _rhs.v62())) {
        return false;
      }
    } else if (_rhs.has_v62()) {
      return false;
    }
    if (_lhs.has_v63()) {
      if (!_rhs.has_v63()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v63(), _rhs.v63())) {
        return false;
      }
    } else if (_rhs.has_v63()) {
      return false;
    }
    if (_lhs.has_v64()) {
      if (!_rhs.has_v64()) {
        return false;
      }
      if (!::fidl::Equals(_lhs.v64(), _rhs.v64())) {
        return false;
      }
    } else if (_rhs.has_v64()) {
      return false;
    }
    return true;
  }
};

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