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

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

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

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

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

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;
}

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