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

// fidl_experiment = output_index_json

#include <fidl/test.arrays/cpp/wire_types.h>

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

void ::test_arrays::wire::UnionSmallArray::SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(UnionSmallArray) == sizeof(fidl_union_t));
  static_assert(offsetof(UnionSmallArray, ordinal_) == offsetof(fidl_union_t, tag));
  static_assert(offsetof(UnionSmallArray, envelope_) == offsetof(fidl_union_t, envelope));
}

void ::test_arrays::wire::UnionLargeArray::SizeAndOffsetAssertionHelper() {
  static_assert(sizeof(UnionLargeArray) == sizeof(fidl_union_t));
  static_assert(offsetof(UnionLargeArray, ordinal_) == offsetof(fidl_union_t, tag));
  static_assert(offsetof(UnionLargeArray, envelope_) == offsetof(fidl_union_t, envelope));
}

bool ::fidl::WireTableFrame<::test_arrays::wire::TableSmallArray>::HasUnknownData() const {
  return false;
}

uint64_t fidl::WireTableFrame<::test_arrays::wire::TableSmallArray>::ComputeMaxOrdinal() const {
  uint64_t max_ordinal = 0;
  if (!a_.has_data()) {
    max_ordinal = 1;
  }
  return max_ordinal;
}

bool ::test_arrays::wire::TableSmallArray::HasUnknownData() const {
  if (max_ordinal_ > 1) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

bool ::fidl::WireTableFrame<::test_arrays::wire::TableLargeArray>::HasUnknownData() const {
  return false;
}

uint64_t fidl::WireTableFrame<::test_arrays::wire::TableLargeArray>::ComputeMaxOrdinal() const {
  uint64_t max_ordinal = 0;
  if (!a_.has_data()) {
    max_ordinal = 1;
  }
  return max_ordinal;
}

bool ::test_arrays::wire::TableLargeArray::HasUnknownData() const {
  if (max_ordinal_ > 1) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

#pragma clang diagnostic pop
