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

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

auto ::test_versions::wire::Union::Which() const
    -> ::test_versions::wire::Union::Tag {
  ZX_ASSERT(!has_invalid_tag());
  switch (ordinal_) {
    case ::test_versions::wire::Union::Ordinal::kX:
      return static_cast<::test_versions::wire::Union::Tag>(ordinal_);
    default:
      return ::test_versions::wire::Union::Tag::kUnknown;
  }
}

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

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

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