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

#include <lib/fidl/internal.h>


extern const struct FidlCodedEnum fidl_test_constants_EnumTypeTable;
extern const struct FidlCodedEnum fidl_test_constants_EnumTable;
extern const struct FidlCodedBits fidl_test_constants_BitsTypeTable;
extern const struct FidlCodedBits fidl_test_constants_BitsTable;
extern const struct FidlCodedStruct fidl_test_constants_StructTable;


static const struct FidlCodedString String4294967295nonnullableTable = {.tag=kFidlTypeString, .max_size=4294967295u, .nullable=kFidlNullability_Nonnullable};


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

const struct FidlCodedEnum fidl_test_constants_EnumTypeTable = {.tag=kFidlTypeEnum, .underlying_type=kFidlCodedPrimitiveSubtype_Int32, .strictness=kFidlStrictness_Strict, .validate=&EnumValidatorFor_fidl_test_constants_EnumType, .name="fidl.test.constants/EnumType"};

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

const struct FidlCodedEnum fidl_test_constants_EnumTable = {.tag=kFidlTypeEnum, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .validate=&EnumValidatorFor_fidl_test_constants_Enum, .name="fidl.test.constants/Enum"};

const struct FidlCodedBits fidl_test_constants_BitsTypeTable = {.tag=kFidlTypeBits, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .mask=131ul, .name="fidl.test.constants/BitsType"};

const struct FidlCodedBits fidl_test_constants_BitsTable = {.tag=kFidlTypeBits, .underlying_type=kFidlCodedPrimitiveSubtype_Uint32, .strictness=kFidlStrictness_Strict, .mask=8ul, .name="fidl.test.constants/Bits"};

static const struct FidlStructElement Fields26fidl_test_constants_Struct[] = {
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=8u, .field_type=(fidl_type_t*)(&String4294967295nonnullableTable)}},
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=24u, .field_type=(fidl_type_t*)(&fidl_internal_kBoolTable)}},
    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=24u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding32,.is_resource=kFidlIsResource_NotResource},.mask_32=4294967040u}},
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=28u, .field_type=(fidl_type_t*)(&fidl_test_constants_EnumTable)}},
    /*FidlStructPadding*/{.field=/*FidlStructField*/{.header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Field, .is_resource=kFidlIsResource_NotResource},.offset=32u, .field_type=(fidl_type_t*)(&fidl_test_constants_BitsTable)}},
    /*FidlStructPadding*/{.padding=/*FidlStructPadding*/{.offset=36u, .header=/*FidlStructElementHeader*/{.element_type=kFidlStructElementType_Padding32,.is_resource=kFidlIsResource_NotResource},.mask_32=4294967295u}}
};
const struct FidlCodedStruct fidl_test_constants_StructTable = {.tag=kFidlTypeStruct, .elements=Fields26fidl_test_constants_Struct, .element_count=6u, .size=40u, .name="fidl.test.constants/Struct"};

