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

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

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

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

bool ::fidl::WireTableFrame<::test_table::wire::SimpleTable>::HasUnknownData()
    const {
  if (!reserved_1_.IsZeroEnvelope()) {
    return true;
  }
  if (!reserved_2_.IsZeroEnvelope()) {
    return true;
  }
  if (!reserved_3_.IsZeroEnvelope()) {
    return true;
  }
  return false;
}

bool ::test_table::wire::SimpleTable::HasUnknownData() const {
  if (max_ordinal_ > 5) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

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

bool ::test_table::wire::ReverseOrdinalTable::HasUnknownData() const {
  if (max_ordinal_ > 3) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

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

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

bool ::fidl::WireTableFrame<
    ::test_table::wire::NewerSimpleTable>::HasUnknownData() const {
  if (!reserved_1_.IsZeroEnvelope()) {
    return true;
  }
  if (!reserved_2_.IsZeroEnvelope()) {
    return true;
  }
  if (!reserved_3_.IsZeroEnvelope()) {
    return true;
  }
  return false;
}

bool ::test_table::wire::NewerSimpleTable::HasUnknownData() const {
  if (max_ordinal_ > 6) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

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

bool ::test_table::wire::ExtensionTable::HasUnknownData() const {
  if (max_ordinal_ > 0) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

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

bool ::test_table::wire::SixtyFourOrdinalTable::HasUnknownData() const {
  if (max_ordinal_ > 64) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}

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

bool ::test_table::wire::EmptyTable::HasUnknownData() const {
  if (max_ordinal_ > 0) {
    return true;
  }
  if (frame_ptr_ == nullptr) {
    return false;
  }
  return frame_ptr_->HasUnknownData();
}
