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

// fidl_experiment = output_index_json

#include <lib/fidl/internal.h>

static const struct FidlCodedHandle Handlevmo2147483648notnullableTable;
static const struct FidlCodedVector Vectorunboundednotnullable_30Handlevmo2147483648notnullableTable;
static const struct FidlCodedArray Array5_30Handlevmo2147483648notnullableTable;
static const struct FidlCodedVector Vectorunboundednotnullable_39Array5_30Handlevmo2147483648notnullableTable;
const struct FidlCodedTable test_handlesintypes_TableWithHandleTable;
const struct FidlCodedUnion test_handlesintypes_UnionWithHandleTable;

static bool EnumValidatorFor_test_handlesintypes_obj_type(uint64_t v) {
  switch (v) {
    case 0u:
    case 3u:
      return true;
    default:
      return false;
  }
}
const struct FidlCodedEnum test_handlesintypes_obj_typeTable = {
    .tag = kFidlTypeEnum,
    .name = "test.handlesintypes/obj_type",
    .underlying_type = kFidlCodedPrimitiveSubtype_Uint32,
    .strictness = kFidlStrictness_Strict,
    .validate = EnumValidatorFor_test_handlesintypes_obj_type,
};

const struct FidlCodedStruct test_handlesintypes_EmptyResourceStructTable = {
    .tag = kFidlTypeStruct,
    .name = "test.handlesintypes/EmptyResourceStruct",
    .is_empty = kFidlEmpty_IsEmpty,
    .size_v2 = 1,
    .elements = NULL,
    .element_count = 0,
};

static const struct FidlStructElement Fields34test_handlesintypes_HandlesInTypes[] = {
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 0,
            .field_type = (const fidl_type_t*)&Handlevmo2147483648notnullableTable,
        },
    },
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .mask_64 = 0xffffffff00000000,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 8,
            .field_type = (const fidl_type_t*)&Vectorunboundednotnullable_30Handlevmo2147483648notnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 24,
            .field_type = (const fidl_type_t*)&Array5_30Handlevmo2147483648notnullableTable,
        },
    },
    {
        .padding = {
            .header = {
                .element_type = kFidlStructElementType_Padding64,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 40,
            .mask_64 = 0xffffffff00000000,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 48,
            .field_type = (const fidl_type_t*)&Vectorunboundednotnullable_39Array5_30Handlevmo2147483648notnullableTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 64,
            .field_type = (const fidl_type_t*)&test_handlesintypes_TableWithHandleTable,
        },
    },
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_Resource,
            },
            .offset_v2 = 80,
            .field_type = (const fidl_type_t*)&test_handlesintypes_UnionWithHandleTable,
        },
    },
};
const struct FidlCodedStruct test_handlesintypes_HandlesInTypesTable = {
    .tag = kFidlTypeStruct,
    .name = "test.handlesintypes/HandlesInTypes",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 96,
    .elements = Fields34test_handlesintypes_HandlesInTypes,
    .element_count = 8,
};

const struct FidlCodedTable test_handlesintypes_EmptyResourceTableTable = {
    .tag = kFidlTypeTable,
    .name = "test.handlesintypes/EmptyResourceTable",
    .is_resource = kFidlIsResource_Resource,
    .fields = NULL,
    .field_count = 0,
};

static const struct FidlTableField Fields35test_handlesintypes_TableWithHandle[] = {
    {.ordinal = 1, .type = (const fidl_type_t*)&Handlevmo2147483648notnullableTable},
};
const struct FidlCodedTable test_handlesintypes_TableWithHandleTable = {
    .tag = kFidlTypeTable,
    .name = "test.handlesintypes/TableWithHandle",
    .is_resource = kFidlIsResource_Resource,
    .fields = Fields35test_handlesintypes_TableWithHandle,
    .field_count = 1,
};

const struct FidlCodedUnion test_handlesintypes_EmptyResourceUnionTable = {
    .tag = kFidlTypeUnion,
    .name = "test.handlesintypes/EmptyResourceUnion",
    .strictness = kFidlStrictness_Flexible,
    .is_resource = kFidlIsResource_Resource,
    .nullable = kFidlNullability_Nonnullable,
    .fields = NULL,
    .field_count = 0,
};
const struct FidlCodedUnion test_handlesintypes_EmptyResourceUnionNullableRefTable = {
    .tag = kFidlTypeUnion,
    .name = "test.handlesintypes/EmptyResourceUnion",
    .strictness = kFidlStrictness_Flexible,
    .is_resource = kFidlIsResource_Resource,
    .nullable = kFidlNullability_Nullable,
    .fields = NULL,
    .field_count = 0,
};

static const struct FidlUnionField Fields35test_handlesintypes_UnionWithHandle[] = {
    {.type = (const fidl_type_t*)&Handlevmo2147483648notnullableTable},
};
const struct FidlCodedUnion test_handlesintypes_UnionWithHandleTable = {
    .tag = kFidlTypeUnion,
    .name = "test.handlesintypes/UnionWithHandle",
    .strictness = kFidlStrictness_Flexible,
    .is_resource = kFidlIsResource_Resource,
    .nullable = kFidlNullability_Nonnullable,
    .fields = Fields35test_handlesintypes_UnionWithHandle,
    .field_count = 1,
};
const struct FidlCodedUnion test_handlesintypes_UnionWithHandleNullableRefTable = {
    .tag = kFidlTypeUnion,
    .name = "test.handlesintypes/UnionWithHandle",
    .strictness = kFidlStrictness_Flexible,
    .is_resource = kFidlIsResource_Resource,
    .nullable = kFidlNullability_Nullable,
    .fields = Fields35test_handlesintypes_UnionWithHandle,
    .field_count = 1,
};

static const struct FidlCodedArray Array5_30Handlevmo2147483648notnullableTable = {
    .tag = kFidlTypeArray,
    .element = (const fidl_type_t*)&Handlevmo2147483648notnullableTable,
    .array_size_v2 = 20,
    .element_size_v2 = 4,
};

static const struct FidlCodedVector Vectorunboundednotnullable_30Handlevmo2147483648notnullableTable = {
    .tag = kFidlTypeVector,
    .element = (const fidl_type_t*)&Handlevmo2147483648notnullableTable,
    .max_count = 4294967295,
    .nullable = kFidlNullability_Nonnullable,
    .element_size_v2 = 4,
};

static const struct FidlCodedVector Vectorunboundednotnullable_39Array5_30Handlevmo2147483648notnullableTable = {
    .tag = kFidlTypeVector,
    .element = (const fidl_type_t*)&Array5_30Handlevmo2147483648notnullableTable,
    .max_count = 4294967295,
    .nullable = kFidlNullability_Nonnullable,
    .element_size_v2 = 20,
};

static const struct FidlCodedHandle Handlevmo2147483648notnullableTable = {
    .tag = kFidlTypeHandle,
    .handle_subtype = ZX_OBJ_TYPE_VMO,
    .handle_rights = 0x80000000,
    .nullable = kFidlNullability_Nonnullable,
};
