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

#include <lib/fidl/internal.h>


extern const struct FidlCodedTable fidl_test_doccomments_TableTable;
extern const struct FidlCodedStruct fidl_test_doccomments_StructTable;
extern const struct FidlCodedXUnion fidl_test_doccomments_StrictUnionTable;
extern const struct FidlCodedXUnion fidl_test_doccomments_StrictUnionNullableRefTable;
extern const struct FidlCodedEnum fidl_test_doccomments_MyStrictEnumTable;
extern const struct FidlCodedBits fidl_test_doccomments_MyStrictBitsTable;
extern const struct FidlCodedEnum fidl_test_doccomments_MyFlexibleEnumTable;
extern const struct FidlCodedBits fidl_test_doccomments_MyFlexibleBitsTable;
extern const struct FidlCodedXUnion fidl_test_doccomments_FlexibleUnionTable;
extern const struct FidlCodedXUnion fidl_test_doccomments_FlexibleUnionNullableRefTable;


extern const struct FidlCodedStruct fidl_test_doccomments_InterfaceMethodRequestTable;
const struct FidlCodedStruct fidl_test_doccomments_InterfaceMethodRequestTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=16u, .name="fidl.test.doccomments/InterfaceMethodRequest"};

extern const struct FidlCodedStruct fidl_test_doccomments_InterfaceOnEventEventTable;
const struct FidlCodedStruct fidl_test_doccomments_InterfaceOnEventEventTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=16u, .name="fidl.test.doccomments/InterfaceOnEventEvent"};


static const struct FidlTableField Fields27fidl_test_doccomments_Table[] = {
    /*FidlTableField*/{.type=(fidl_type_t*)(&fidl_internal_kInt32Table), .ordinal=1u}
};
const struct FidlCodedTable fidl_test_doccomments_TableTable = {.tag=kFidlTypeTable, .fields=Fields27fidl_test_doccomments_Table, .field_count=1u, .is_resource=kFidlIsResource_NotResource, .name="fidl.test.doccomments/Table"};

const struct FidlCodedStruct fidl_test_doccomments_StructTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=4u, .name="fidl.test.doccomments/Struct"};

static const struct FidlXUnionField Fields33fidl_test_doccomments_StrictUnion[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kInt32Table)}
};
const struct FidlCodedXUnion fidl_test_doccomments_StrictUnionTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields33fidl_test_doccomments_StrictUnion, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.doccomments/StrictUnion", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields44fidl_test_doccomments_StrictUnionNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kInt32Table)}
};
const struct FidlCodedXUnion fidl_test_doccomments_StrictUnionNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields44fidl_test_doccomments_StrictUnionNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.doccomments/StrictUnion", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static bool EnumValidatorFor_fidl_test_doccomments_MyStrictEnum(uint64_t v) {
  switch (v) {
    case 1ul:
    case 2ul:
      return true;
    default:
      return false;
  }
}

const struct FidlCodedEnum fidl_test_doccomments_MyStrictEnumTable = {.tag=kFidlTypeEnum, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .validate=&EnumValidatorFor_fidl_test_doccomments_MyStrictEnum, .name="fidl.test.doccomments/MyStrictEnum"};

const struct FidlCodedBits fidl_test_doccomments_MyStrictBitsTable = {.tag=kFidlTypeBits, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .mask=3ul, .name="fidl.test.doccomments/MyStrictBits"};

const struct FidlCodedEnum fidl_test_doccomments_MyFlexibleEnumTable = {.tag=kFidlTypeEnum, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Flexible, .validate=NULL, .name="fidl.test.doccomments/MyFlexibleEnum"};

const struct FidlCodedBits fidl_test_doccomments_MyFlexibleBitsTable = {.tag=kFidlTypeBits, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Flexible, .mask=3ul, .name="fidl.test.doccomments/MyFlexibleBits"};

static const struct FidlXUnionField Fields35fidl_test_doccomments_FlexibleUnion[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kInt32Table)}
};
const struct FidlCodedXUnion fidl_test_doccomments_FlexibleUnionTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields35fidl_test_doccomments_FlexibleUnion, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.doccomments/FlexibleUnion", .strictness=kFidlStrictness_Flexible, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields46fidl_test_doccomments_FlexibleUnionNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kInt32Table)}
};
const struct FidlCodedXUnion fidl_test_doccomments_FlexibleUnionNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields46fidl_test_doccomments_FlexibleUnionNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.doccomments/FlexibleUnion", .strictness=kFidlStrictness_Flexible, .is_resource=kFidlIsResource_NotResource};
