// ==++==
// 
//   Copyright (c) Microsoft Corporation.  All rights reserved.
// 
// ==--==
// <OWNER>[....]</OWNER>
namespace System.Reflection {
    using System.Runtime.InteropServices;
    using System;
    // This Enum matchs the CorTypeAttr defined in CorHdr.h
[Serializable]
[Flags] 
[System.Runtime.InteropServices.ComVisible(true)]
    public enum TypeAttributes
    {
        VisibilityMask    =   0x00000007,
        NotPublic         =   0x00000000,     // Class is not public scope.
        Public            =   0x00000001,     // Class is 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.
    
        // Use this mask to retrieve class layout informaiton
        // 0 is AutoLayout, 0x2 is SequentialLayout, 4 is ExplicitLayout
        LayoutMask        =   0x00000018,
        AutoLayout        =   0x00000000,     // Class fields are auto-laid out
        SequentialLayout  =   0x00000008,     // Class fields are laid out sequentially
        ExplicitLayout    =   0x00000010,     // Layout is supplied explicitly
        // end layout mask
    
        // Use this mask to distinguish whether a type declaration is an interface.  (Class vs. ValueType done based on whether it subclasses S.ValueType)
        ClassSemanticsMask=   0x00000020,
        Class             =   0x00000000,     // Type is a class (or a value type).
        Interface         =   0x00000020,     // Type is an interface.
    
        // Special semantics in addition to class semantics.
        Abstract          =   0x00000080,     // Class is abstract
        Sealed            =   0x00000100,     // Class is concrete and may not be extended
        SpecialName       =   0x00000400,     // Class name is special.  Name describes how.
    
        // Implementation attributes.
        Import            =   0x00001000,     // Class / interface is imported
        Serializable      =   0x00002000,     // The class is Serializable.
#if FEATURE_COMINTEROP || MONO_COM
        [ComVisible(false)]
        WindowsRuntime    =   0x00004000,     // Type is a Windows Runtime type.
#endif // FEATURE_COMINTEROP

        // Use tdStringFormatMask to retrieve string information for native interop
        StringFormatMask  =   0x00030000,     
        AnsiClass         =   0x00000000,     // LPTSTR is interpreted as ANSI in this class
        UnicodeClass      =   0x00010000,     // LPTSTR is interpreted as UNICODE
        AutoClass         =   0x00020000,     // LPTSTR is interpreted automatically
        CustomFormatClass =   0x00030000,     // A non-standard encoding specified by CustomFormatMask
        CustomFormatMask  =   0x00C00000,     // Use this mask to retrieve non-standard encoding information for native interop. The meaning of the values of these 2 bits is unspecified.

        // end string format mask

        BeforeFieldInit   =   0x00100000,     // Initialize the class any time before first static field access.

        // Flags reserved for runtime use.
        ReservedMask      =   0x00040800,
        RTSpecialName     =   0x00000800,     // Runtime should check name encoding.
        HasSecurity       =   0x00040000,     // Class has security associate with it.
   }
}
