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

// fidl_experiment = output_index_json

#include <lib/fidl/internal.h>

extern const struct FidlCodedStruct test_exampleusing_EmptyTable;

const struct FidlCodedBits test_placementofattributes_ExampleBitsTable = {
    .tag = kFidlTypeBits,
    .name = "test.placementofattributes/ExampleBits",
    .underlying_type = kFidlCodedPrimitiveSubtype_Uint32,
    .strictness = kFidlStrictness_Strict,
    .mask = 0x1,
};

static bool EnumValidatorFor_test_placementofattributes_ExampleEnum(uint64_t v) {
  switch (v) {
    case 1u:
      return true;
    default:
      return false;
  }
}
const struct FidlCodedEnum test_placementofattributes_ExampleEnumTable = {
    .tag = kFidlTypeEnum,
    .name = "test.placementofattributes/ExampleEnum",
    .underlying_type = kFidlCodedPrimitiveSubtype_Uint32,
    .strictness = kFidlStrictness_Strict,
    .validate = EnumValidatorFor_test_placementofattributes_ExampleEnum,
};

static const struct FidlStructElement Fields55test_placementofattributes_ExampleProtocolMethodRequest[] = {
    {
        .field = {
            .header = {
                .element_type = kFidlStructElementType_Field,
                .is_resource = kFidlIsResource_NotResource,
            },
            .offset_v2 = 0,
            .field_type = (const fidl_type_t*)&test_exampleusing_EmptyTable,
        },
    },
};
const struct FidlCodedStruct test_placementofattributes_ExampleProtocolMethodRequestTable = {
    .tag = kFidlTypeStruct,
    .name = "test.placementofattributes/ExampleProtocolMethodRequest",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 1,
    .elements = Fields55test_placementofattributes_ExampleProtocolMethodRequest,
    .element_count = 1,
};

const struct FidlCodedStruct test_placementofattributes_ExampleStructTable = {
    .tag = kFidlTypeStruct,
    .name = "test.placementofattributes/ExampleStruct",
    .is_empty = kFidlEmpty_IsNotEmpty,
    .size_v2 = 4,
    .elements = NULL,
    .element_count = 0,
};

static const struct FidlTableField Fields39test_placementofattributes_ExampleTable[] = {
    {.ordinal = 1, .type = (const fidl_type_t*)&fidl_internal_kUint32Table},
};
const struct FidlCodedTable test_placementofattributes_ExampleTableTable = {
    .tag = kFidlTypeTable,
    .name = "test.placementofattributes/ExampleTable",
    .is_resource = kFidlIsResource_NotResource,
    .fields = Fields39test_placementofattributes_ExampleTable,
    .field_count = 1,
};

static const struct FidlUnionField Fields39test_placementofattributes_ExampleUnion[] = {
    {.type = (const fidl_type_t*)&fidl_internal_kUint32Table},
};
const struct FidlCodedUnion test_placementofattributes_ExampleUnionTable = {
    .tag = kFidlTypeUnion,
    .name = "test.placementofattributes/ExampleUnion",
    .strictness = kFidlStrictness_Strict,
    .is_resource = kFidlIsResource_NotResource,
    .nullable = kFidlNullability_Nonnullable,
    .fields = Fields39test_placementofattributes_ExampleUnion,
    .field_count = 1,
};
const struct FidlCodedUnion test_placementofattributes_ExampleUnionNullableRefTable = {
    .tag = kFidlTypeUnion,
    .name = "test.placementofattributes/ExampleUnion",
    .strictness = kFidlStrictness_Strict,
    .is_resource = kFidlIsResource_NotResource,
    .nullable = kFidlNullability_Nullable,
    .fields = Fields39test_placementofattributes_ExampleUnion,
    .field_count = 1,
};
