//
// Author:
//   Jb Evain (jbevain@gmail.com)
//
// Copyright (c) 2008 - 2015 Jb Evain
// Copyright (c) 2008 - 2011 Novell, Inc.
//
// Licensed under the MIT/X11 license.
//

using System;

namespace MonoFN.Cecil {

	[Flags]
	public enum TypeAttributes : uint {
		// Visibility attributes
		VisibilityMask = 0x00000007,    // Use this mask to retrieve visibility information
		NotPublic = 0x00000000, // Class has no public scope
		Public = 0x00000001,    // Class has public scope
		NestedPublic = 0x00000002,  // Class is nested with public visibility
		NestedPrivate = 0x00000003, // Class is nested with private visibility
		NestedFamily = 0x00000004,  // Class is nested with family visibility
		NestedAssembly = 0x00000005,    // Class is nested with assembly visibility
		NestedFamANDAssem = 0x00000006, // Class is nested with family and assembly visibility
		NestedFamORAssem = 0x00000007,  // Class is nested with family or assembly visibility

		// Class layout attributes
		LayoutMask = 0x00000018,    // Use this mask to retrieve class layout information
		AutoLayout = 0x00000000,    // Class fields are auto-laid out
		SequentialLayout = 0x00000008,  // Class fields are laid out sequentially
		ExplicitLayout = 0x00000010,    // Layout is supplied explicitly

		// Class semantics attributes
		ClassSemanticMask = 0x00000020, // Use this mask to retrieve class semantics information
		Class = 0x00000000, // Type is a class
		Interface = 0x00000020, // Type is an interface

		// Special semantics in addition to class semantics
		Abstract = 0x00000080,  // Class is abstract
		Sealed = 0x00000100,    // Class cannot be extended
		SpecialName = 0x00000400,   // Class name is special

		// Implementation attributes
		Import = 0x00001000,    // Class/Interface is imported
		Serializable = 0x00002000,  // Class is serializable
		WindowsRuntime = 0x00004000,    // Windows Runtime type

		// String formatting attributes
		StringFormatMask = 0x00030000,  // Use this mask to retrieve string information for native interop
		AnsiClass = 0x00000000, // LPSTR is interpreted as ANSI
		UnicodeClass = 0x00010000,  // LPSTR is interpreted as Unicode
		AutoClass = 0x00020000, // LPSTR is interpreted automatically

		// Class initialization attributes
		BeforeFieldInit = 0x00100000,   // Initialize the class before first static field access

		// Additional flags
		RTSpecialName = 0x00000800, // CLI provides 'special' behavior, depending upon the name of the Type
		HasSecurity = 0x00040000,   // Type has security associate with it
		Forwarder = 0x00200000,   // Exported type is a type forwarder
	}
}
