/**
 * \file
 */

#ifndef __MONO_METADATA_ROW_INDEXES_H__
#define __MONO_METADATA_ROW_INDEXES_H__

/*
 * The last entry in the enum is used to give the number
 * of columns in the row.
 */

enum {
	MONO_ASSEMBLY_HASH_ALG,
	MONO_ASSEMBLY_MAJOR_VERSION,
	MONO_ASSEMBLY_MINOR_VERSION,
	MONO_ASSEMBLY_BUILD_NUMBER,
	MONO_ASSEMBLY_REV_NUMBER,
	MONO_ASSEMBLY_FLAGS,
	MONO_ASSEMBLY_PUBLIC_KEY,
	MONO_ASSEMBLY_NAME,
	MONO_ASSEMBLY_CULTURE,
	MONO_ASSEMBLY_SIZE
};

enum {
	MONO_ASSEMBLYOS_PLATFORM,
	MONO_ASSEMBLYOS_MAJOR_VERSION,
	MONO_ASSEMBLYOS_MINOR_VERSION,
	MONO_ASSEMBLYOS_SIZE
};

enum {
	MONO_ASSEMBLY_PROCESSOR,
	MONO_ASSEMBLY_PROCESSOR_SIZE
};

enum {
	MONO_ASSEMBLYREF_MAJOR_VERSION,
	MONO_ASSEMBLYREF_MINOR_VERSION,
	MONO_ASSEMBLYREF_BUILD_NUMBER,
	MONO_ASSEMBLYREF_REV_NUMBER,
	MONO_ASSEMBLYREF_FLAGS,
	MONO_ASSEMBLYREF_PUBLIC_KEY,
	MONO_ASSEMBLYREF_NAME,
	MONO_ASSEMBLYREF_CULTURE,
	MONO_ASSEMBLYREF_HASH_VALUE,
	MONO_ASSEMBLYREF_SIZE
};

enum {
	MONO_ASSEMBLYREFOS_PLATFORM,
	MONO_ASSEMBLYREFOS_MAJOR_VERSION,
	MONO_ASSEMBLYREFOS_MINOR_VERSION,
	MONO_ASSEMBLYREFOS_ASSEMBLYREF,
	MONO_ASSEMBLYREFOS_SIZE
};

enum {
	MONO_ASSEMBLYREFPROC_PROCESSOR,
	MONO_ASSEMBLYREFPROC_ASSEMBLYREF,
	MONO_ASSEMBLYREFPROC_SIZE
};

enum {
	MONO_CLASS_LAYOUT_PACKING_SIZE,
	MONO_CLASS_LAYOUT_CLASS_SIZE,
	MONO_CLASS_LAYOUT_PARENT,
	MONO_CLASS_LAYOUT_SIZE
};

enum {
	MONO_CONSTANT_TYPE,
	MONO_CONSTANT_PADDING,
	MONO_CONSTANT_PARENT,
	MONO_CONSTANT_VALUE,
	MONO_CONSTANT_SIZE
};

enum {
	MONO_CUSTOM_ATTR_PARENT,
	MONO_CUSTOM_ATTR_TYPE,
	MONO_CUSTOM_ATTR_VALUE,
	MONO_CUSTOM_ATTR_SIZE
};

enum {
	MONO_DECL_SECURITY_ACTION,
	MONO_DECL_SECURITY_PARENT,
	MONO_DECL_SECURITY_PERMISSIONSET,
	MONO_DECL_SECURITY_SIZE
};

enum {
	MONO_EVENT_MAP_PARENT,
	MONO_EVENT_MAP_EVENTLIST,
	MONO_EVENT_MAP_SIZE
};

enum {
	MONO_EVENT_FLAGS,
	MONO_EVENT_NAME,
	MONO_EVENT_TYPE,
	MONO_EVENT_SIZE
};

enum {
	MONO_EVENT_POINTER_EVENT,
	MONO_EVENT_POINTER_SIZE
};

enum {
	MONO_EXP_TYPE_FLAGS,
	MONO_EXP_TYPE_TYPEDEF,
	MONO_EXP_TYPE_NAME,
	MONO_EXP_TYPE_NAMESPACE,
	MONO_EXP_TYPE_IMPLEMENTATION,
	MONO_EXP_TYPE_SIZE
};

enum {
	MONO_FIELD_FLAGS,
	MONO_FIELD_NAME,
	MONO_FIELD_SIGNATURE,
	MONO_FIELD_SIZE
};

enum {
	MONO_FIELD_LAYOUT_OFFSET,
	MONO_FIELD_LAYOUT_FIELD,
	MONO_FIELD_LAYOUT_SIZE
};

enum {
	MONO_FIELD_MARSHAL_PARENT,
	MONO_FIELD_MARSHAL_NATIVE_TYPE,
	MONO_FIELD_MARSHAL_SIZE
};

enum {
	MONO_FIELD_POINTER_FIELD,
	MONO_FIELD_POINTER_SIZE
};

enum {
	MONO_FIELD_RVA_RVA,
	MONO_FIELD_RVA_FIELD,
	MONO_FIELD_RVA_SIZE
};

enum {
	MONO_FILE_FLAGS,
	MONO_FILE_NAME,
	MONO_FILE_HASH_VALUE,
	MONO_FILE_SIZE
};

enum {
	MONO_IMPLMAP_FLAGS,
	MONO_IMPLMAP_MEMBER,
	MONO_IMPLMAP_NAME,
	MONO_IMPLMAP_SCOPE,
	MONO_IMPLMAP_SIZE
};

enum {
	MONO_INTERFACEIMPL_CLASS,
	MONO_INTERFACEIMPL_INTERFACE,
	MONO_INTERFACEIMPL_SIZE
};

enum {
	MONO_MANIFEST_OFFSET,
	MONO_MANIFEST_FLAGS,
	MONO_MANIFEST_NAME,
	MONO_MANIFEST_IMPLEMENTATION,
	MONO_MANIFEST_SIZE
};

enum {
	MONO_MEMBERREF_CLASS,
	MONO_MEMBERREF_NAME,
	MONO_MEMBERREF_SIGNATURE,
	MONO_MEMBERREF_SIZE
};

enum {
	MONO_METHOD_RVA,
	MONO_METHOD_IMPLFLAGS,
	MONO_METHOD_FLAGS,
	MONO_METHOD_NAME,
	MONO_METHOD_SIGNATURE,
	MONO_METHOD_PARAMLIST,
	MONO_METHOD_SIZE
};

enum {
	MONO_METHODIMPL_CLASS,
	MONO_METHODIMPL_BODY,
	MONO_METHODIMPL_DECLARATION,
	MONO_METHODIMPL_SIZE
};

enum {
	MONO_METHOD_POINTER_METHOD,
	MONO_METHOD_POINTER_SIZE
};

enum {
	MONO_METHOD_SEMA_SEMANTICS,
	MONO_METHOD_SEMA_METHOD,
	MONO_METHOD_SEMA_ASSOCIATION,
	MONO_METHOD_SEMA_SIZE
};

enum {
	MONO_MODULE_GENERATION,
	MONO_MODULE_NAME,
	MONO_MODULE_MVID,
	MONO_MODULE_ENC,
	MONO_MODULE_ENCBASE,
	MONO_MODULE_SIZE
};

enum {
	MONO_MODULEREF_NAME,
	MONO_MODULEREF_SIZE
};

enum {
	MONO_NESTED_CLASS_NESTED,
	MONO_NESTED_CLASS_ENCLOSING,
	MONO_NESTED_CLASS_SIZE
};

enum {
	MONO_PARAM_FLAGS,
	MONO_PARAM_SEQUENCE,
	MONO_PARAM_NAME,
	MONO_PARAM_SIZE
};

enum {
	MONO_PARAM_POINTER_PARAM,
	MONO_PARAM_POINTER_SIZE
};

enum {
	MONO_PROPERTY_FLAGS,
	MONO_PROPERTY_NAME,
	MONO_PROPERTY_TYPE,
	MONO_PROPERTY_SIZE
};

enum {
	MONO_PROPERTY_POINTER_PROPERTY,
	MONO_PROPERTY_POINTER_SIZE
};

enum {
	MONO_PROPERTY_MAP_PARENT,
	MONO_PROPERTY_MAP_PROPERTY_LIST,
	MONO_PROPERTY_MAP_SIZE
};

enum {
	MONO_STAND_ALONE_SIGNATURE,
	MONO_STAND_ALONE_SIGNATURE_SIZE
};

enum {
	MONO_TYPEDEF_FLAGS,
	MONO_TYPEDEF_NAME,
	MONO_TYPEDEF_NAMESPACE,
	MONO_TYPEDEF_EXTENDS,
	MONO_TYPEDEF_FIELD_LIST,
	MONO_TYPEDEF_METHOD_LIST,
	MONO_TYPEDEF_SIZE
};

enum {
	MONO_TYPEREF_SCOPE,
	MONO_TYPEREF_NAME,
	MONO_TYPEREF_NAMESPACE,
	MONO_TYPEREF_SIZE
};

enum {
	MONO_TYPESPEC_SIGNATURE,
	MONO_TYPESPEC_SIZE
};

enum {
	MONO_GENERICPARAM_NUMBER,
	MONO_GENERICPARAM_FLAGS,
	MONO_GENERICPARAM_OWNER,
	MONO_GENERICPARAM_NAME,
	
	MONO_GENERICPARAM_SIZE
};

enum {
	MONO_METHODSPEC_METHOD,
	MONO_METHODSPEC_SIGNATURE,
	MONO_METHODSPEC_SIZE
};

enum {
	MONO_GENPARCONSTRAINT_GENERICPAR,
	MONO_GENPARCONSTRAINT_CONSTRAINT,
	MONO_GENPARCONSTRAINT_SIZE
};

enum {
	MONO_DOCUMENT_NAME,
	MONO_DOCUMENT_HASHALG,
	MONO_DOCUMENT_HASH,
	MONO_DOCUMENT_LANGUAGE,
	MONO_DOCUMENT_SIZE
};

enum {
	MONO_METHODBODY_DOCUMENT,
	MONO_METHODBODY_SEQ_POINTS,
	MONO_METHODBODY_SIZE
};

enum {
	MONO_LOCALSCOPE_METHOD,
	MONO_LOCALSCOPE_IMPORTSCOPE,
	MONO_LOCALSCOPE_VARIABLELIST,
	MONO_LOCALSCOPE_CONSTANTLIST,
	MONO_LOCALSCOPE_STARTOFFSET,
	MONO_LOCALSCOPE_LENGTH,
	MONO_LOCALSCOPE_SIZE
};

enum {
	MONO_LOCALVARIABLE_ATTRIBUTES,
	MONO_LOCALVARIABLE_INDEX,
	MONO_LOCALVARIABLE_NAME,
	MONO_LOCALVARIABLE_SIZE
};

enum {
	MONO_CUSTOMDEBUGINFORMATION_PARENT,
	MONO_CUSTOMDEBUGINFORMATION_KIND,
	MONO_CUSTOMDEBUGINFORMATION_VALUE,
	MONO_CUSTOMDEBUGINFORMATION_SIZE
};

/*
 * Coded Tokens
 * The _BITS entry is for the bits used in the token.
 * The _MASK entry is for mask the index out.
 */

enum {
	MONO_TYPEDEFORREF_TYPEDEF,
	MONO_TYPEDEFORREF_TYPEREF,
	MONO_TYPEDEFORREF_TYPESPEC,
	MONO_TYPEDEFORREF_BITS = 2,
	MONO_TYPEDEFORREF_MASK = 3
};

enum {
	MONO_HASCONSTANT_FIEDDEF,
	MONO_HASCONSTANT_PARAM,
	MONO_HASCONSTANT_PROPERTY,
	MONO_HASCONSTANT_BITS = 2,
	MONO_HASCONSTANT_MASK = 3
};

enum {
	MONO_CUSTOM_ATTR_METHODDEF,
	MONO_CUSTOM_ATTR_FIELDDEF,
	MONO_CUSTOM_ATTR_TYPEREF,
	MONO_CUSTOM_ATTR_TYPEDEF,
	MONO_CUSTOM_ATTR_PARAMDEF,
	MONO_CUSTOM_ATTR_INTERFACE,
	MONO_CUSTOM_ATTR_MEMBERREF,
	MONO_CUSTOM_ATTR_MODULE,
	MONO_CUSTOM_ATTR_PERMISSION,
	MONO_CUSTOM_ATTR_PROPERTY,
	MONO_CUSTOM_ATTR_EVENT,
	MONO_CUSTOM_ATTR_SIGNATURE,
	MONO_CUSTOM_ATTR_MODULEREF,
	MONO_CUSTOM_ATTR_TYPESPEC,
	MONO_CUSTOM_ATTR_ASSEMBLY,
	MONO_CUSTOM_ATTR_ASSEMBLYREF,
	MONO_CUSTOM_ATTR_FILE,
	MONO_CUSTOM_ATTR_EXP_TYPE,
	MONO_CUSTOM_ATTR_MANIFEST,
	MONO_CUSTOM_ATTR_GENERICPAR,
	MONO_CUSTOM_ATTR_BITS = 5,
	MONO_CUSTOM_ATTR_MASK = 0x1F
};

enum {
	MONO_HAS_FIELD_MARSHAL_FIELDSREF,
	MONO_HAS_FIELD_MARSHAL_PARAMDEF,
	MONO_HAS_FIELD_MARSHAL_BITS = 1,
	MONO_HAS_FIELD_MARSHAL_MASK = 1
};

enum {
	MONO_HAS_DECL_SECURITY_TYPEDEF,
	MONO_HAS_DECL_SECURITY_METHODDEF,
	MONO_HAS_DECL_SECURITY_ASSEMBLY,
	MONO_HAS_DECL_SECURITY_BITS = 2,
	MONO_HAS_DECL_SECURITY_MASK = 3
};

enum {
	MONO_MEMBERREF_PARENT_TYPEDEF, /* not used */
	MONO_MEMBERREF_PARENT_TYPEREF,
	MONO_MEMBERREF_PARENT_MODULEREF,
	MONO_MEMBERREF_PARENT_METHODDEF,
	MONO_MEMBERREF_PARENT_TYPESPEC,
	MONO_MEMBERREF_PARENT_BITS = 3,
	MONO_MEMBERREF_PARENT_MASK = 7
};

enum {
	MONO_HAS_SEMANTICS_EVENT,
	MONO_HAS_SEMANTICS_PROPERTY,
	MONO_HAS_SEMANTICS_BITS = 1,
	MONO_HAS_SEMANTICS_MASK = 1
};

enum {
	MONO_METHODDEFORREF_METHODDEF,
	MONO_METHODDEFORREF_METHODREF,
	MONO_METHODDEFORREF_BITS = 1,
	MONO_METHODDEFORREF_MASK = 1
};

enum {
	MONO_MEMBERFORWD_FIELDDEF,
	MONO_MEMBERFORWD_METHODDEF,
	MONO_MEMBERFORWD_BITS = 1,
	MONO_MEMBERFORWD_MASK = 1
};

enum {
	MONO_IMPLEMENTATION_FILE,
	MONO_IMPLEMENTATION_ASSEMBLYREF,
	MONO_IMPLEMENTATION_EXP_TYPE,
	MONO_IMPLEMENTATION_BITS = 2,
	MONO_IMPLEMENTATION_MASK = 3
};

enum {
	MONO_CUSTOM_ATTR_TYPE_TYPEREF, /* not used */
	MONO_CUSTOM_ATTR_TYPE_TYPEDEF, /* not used */
	MONO_CUSTOM_ATTR_TYPE_METHODDEF,
	MONO_CUSTOM_ATTR_TYPE_MEMBERREF,
	MONO_CUSTOM_ATTR_TYPE_STRING, /* not used */
	MONO_CUSTOM_ATTR_TYPE_BITS = 3,
	MONO_CUSTOM_ATTR_TYPE_MASK = 7
};

enum {
	MONO_RESOLUTION_SCOPE_MODULE,
	MONO_RESOLUTION_SCOPE_MODULEREF,
	MONO_RESOLUTION_SCOPE_ASSEMBLYREF,
	MONO_RESOLUTION_SCOPE_TYPEREF,
	MONO_RESOLUTION_SCOPE_BITS = 2,
	MONO_RESOLUTION_SCOPE_MASK = 3
};

/* Kept for compatibility since this is a public header file */
enum {
	MONO_RESOLTION_SCOPE_MODULE,
	MONO_RESOLTION_SCOPE_MODULEREF,
	MONO_RESOLTION_SCOPE_ASSEMBLYREF,
	MONO_RESOLTION_SCOPE_TYPEREF,
	MONO_RESOLTION_SCOPE_BITS = 2,
	MONO_RESOLTION_SCOPE_MASK = 3
};

enum {
	MONO_TYPEORMETHOD_TYPE,
	MONO_TYPEORMETHOD_METHOD,
	MONO_TYPEORMETHOD_BITS = 1,
	MONO_TYPEORMETHOD_MASK = 1
};

#endif /* __MONO_METADATA_ROW_INDEXES_H__ */


