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

#include <lib/fidl/internal.h>


extern const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleXUnionTable;
extern const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleXUnionNullableRefTable;
extern const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleUnionTable;
extern const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleUnionNullableRefTable;
extern const struct FidlCodedTable fidl_test_placementofattributes_ExampleTableTable;
extern const struct FidlCodedStruct fidl_test_placementofattributes_ExampleStructTable;
extern const struct FidlCodedEnum fidl_test_placementofattributes_ExampleEnumTable;
extern const struct FidlCodedBits fidl_test_placementofattributes_ExampleBitsTable;
extern const struct FidlCodedStruct exampleusing_EmptyTable;


extern const struct FidlCodedStruct fidl_test_placementofattributes_ExampleProtocolMethodRequestTable;
static const struct FidlStructElement Fields60fidl_test_placementofattributes_ExampleProtocolMethodRequest[] = {
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=16u, .field_type=(fidl_type_t*)(&exampleusing_EmptyTable)}},
    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=16u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding64,.is_resource=kFidlIsResource_NotResource},.mask_64=18446744073709551360ul}}
};
const struct FidlCodedStruct fidl_test_placementofattributes_ExampleProtocolMethodRequestTable = {.tag=kFidlTypeStruct, .elements=Fields60fidl_test_placementofattributes_ExampleProtocolMethodRequest, .element_count=2u, .size=24u, .name="fidl.test.placementofattributes/ExampleProtocolMethodRequest"};


static const struct FidlXUnionField Fields45fidl_test_placementofattributes_ExampleXUnion[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleXUnionTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields45fidl_test_placementofattributes_ExampleXUnion, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.placementofattributes/ExampleXUnion", .strictness=kFidlStrictness_Flexible, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields56fidl_test_placementofattributes_ExampleXUnionNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleXUnionNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields56fidl_test_placementofattributes_ExampleXUnionNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.placementofattributes/ExampleXUnion", .strictness=kFidlStrictness_Flexible, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields44fidl_test_placementofattributes_ExampleUnion[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleUnionTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields44fidl_test_placementofattributes_ExampleUnion, .nullable=kFidlNullability_Nonnullable, .name="fidl.test.placementofattributes/ExampleUnion", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlXUnionField Fields55fidl_test_placementofattributes_ExampleUnionNullableRef[] = {
    /*FidlXUnionField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table)}
};
const struct FidlCodedXUnion fidl_test_placementofattributes_ExampleUnionNullableRefTable = {.tag=kFidlTypeXUnion, .field_count=1u, .fields=Fields55fidl_test_placementofattributes_ExampleUnionNullableRef, .nullable=kFidlNullability_Nullable, .name="fidl.test.placementofattributes/ExampleUnion", .strictness=kFidlStrictness_Strict, .is_resource=kFidlIsResource_NotResource};
static const struct FidlTableField Fields44fidl_test_placementofattributes_ExampleTable[] = {
    /*FidlTableField*/{.type=(fidl_type_t*)(&fidl_internal_kUint32Table), .ordinal=1u}
};
const struct FidlCodedTable fidl_test_placementofattributes_ExampleTableTable = {.tag=kFidlTypeTable, .fields=Fields44fidl_test_placementofattributes_ExampleTable, .field_count=1u, .is_resource=kFidlIsResource_NotResource, .name="fidl.test.placementofattributes/ExampleTable"};

const struct FidlCodedStruct fidl_test_placementofattributes_ExampleStructTable = {.tag=kFidlTypeStruct, .elements=NULL, .element_count=0u, .size=4u, .name="fidl.test.placementofattributes/ExampleStruct"};

static bool EnumValidatorFor_fidl_test_placementofattributes_ExampleEnum(uint64_t v) {
  switch (v) {
    case 1ul:
      return true;
    default:
      return false;
  }
}

const struct FidlCodedEnum fidl_test_placementofattributes_ExampleEnumTable = {.tag=kFidlTypeEnum, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .validate=&EnumValidatorFor_fidl_test_placementofattributes_ExampleEnum, .name="fidl.test.placementofattributes/ExampleEnum"};

const struct FidlCodedBits fidl_test_placementofattributes_ExampleBitsTable = {.tag=kFidlTypeBits, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .mask=1ul, .name="fidl.test.placementofattributes/ExampleBits"};

