diff --git a/src/Core/Platform.cs b/src/Core/Platform.cs
index bbd83dee..05c40ae8 100644
--- a/src/Core/Platform.cs
+++ b/src/Core/Platform.cs
@@ -48,6 +48,11 @@ namespace CppSharp
             }
         }
 
+        public static bool IsLinux
+        {
+            get { return Environment.OSVersion.Platform == PlatformID.Unix && !IsMacOS; }
+        }
+
         public static bool IsMono
         {
             get { return Type.GetType("Mono.Runtime") != null; }
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/AST.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/AST.cs
new file mode 100644
index 00000000..52a9036d
--- /dev/null
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/AST.cs
@@ -0,0 +1,14292 @@
+//----------------------------------------------------------------------------
+// <auto-generated>
+// This is autogenerated code by CppSharp.
+// Do not edit this file or all your changes will be lost after re-generation.
+// </auto-generated>
+//----------------------------------------------------------------------------
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace CppSharp
+{
+    namespace Parser
+    {
+        namespace AST
+        {
+            public enum TypeKind
+            {
+                Tag = 0,
+                Array = 1,
+                Function = 2,
+                Pointer = 3,
+                MemberPointer = 4,
+                Typedef = 5,
+                Attributed = 6,
+                Decayed = 7,
+                TemplateSpecialization = 8,
+                TemplateParameter = 9,
+                TemplateParameterSubstitution = 10,
+                InjectedClassName = 11,
+                DependentName = 12,
+                PackExpansion = 13,
+                Builtin = 14
+            }
+
+            public enum DeclarationKind
+            {
+                DeclarationContext = 0,
+                Typedef = 1,
+                TypeAlias = 2,
+                Parameter = 3,
+                Function = 4,
+                Method = 5,
+                Enumeration = 6,
+                EnumerationItem = 7,
+                Variable = 8,
+                Field = 9,
+                AccessSpecifier = 10,
+                Class = 11,
+                Template = 12,
+                TypeAliasTemplate = 13,
+                ClassTemplate = 14,
+                ClassTemplateSpecialization = 15,
+                ClassTemplatePartialSpecialization = 16,
+                FunctionTemplate = 17,
+                Namespace = 18,
+                PreprocessedEntity = 19,
+                MacroDefinition = 20,
+                MacroExpansion = 21,
+                TranslationUnit = 22,
+                Friend = 23,
+                TemplateTemplateParm = 24,
+                TemplateTypeParm = 25,
+                NonTypeTemplateParm = 26
+            }
+
+            public enum AccessSpecifier
+            {
+                Private = 0,
+                Protected = 1,
+                Public = 2
+            }
+
+            public enum RawCommentKind
+            {
+                Invalid = 0,
+                OrdinaryBCPL = 1,
+                OrdinaryC = 2,
+                BCPLSlash = 3,
+                BCPLExcl = 4,
+                JavaDoc = 5,
+                Qt = 6,
+                Merged = 7
+            }
+
+            public enum CommentKind
+            {
+                FullComment = 0,
+                BlockContentComment = 1,
+                BlockCommandComment = 2,
+                ParamCommandComment = 3,
+                TParamCommandComment = 4,
+                VerbatimBlockComment = 5,
+                VerbatimLineComment = 6,
+                ParagraphComment = 7,
+                HTMLTagComment = 8,
+                HTMLStartTagComment = 9,
+                HTMLEndTagComment = 10,
+                TextComment = 11,
+                InlineContentComment = 12,
+                InlineCommandComment = 13,
+                VerbatimBlockLineComment = 14
+            }
+
+            public enum CppAbi
+            {
+                Itanium = 0,
+                Microsoft = 1,
+                ARM = 2,
+                iOS = 3,
+                iOS64 = 4
+            }
+
+            public enum VTableComponentKind
+            {
+                VCallOffset = 0,
+                VBaseOffset = 1,
+                OffsetToTop = 2,
+                RTTI = 3,
+                FunctionPointer = 4,
+                CompleteDtorPointer = 5,
+                DeletingDtorPointer = 6,
+                UnusedFunctionPointer = 7
+            }
+
+            public enum CXXOperatorKind
+            {
+                None = 0,
+                New = 1,
+                Delete = 2,
+                Array_New = 3,
+                Array_Delete = 4,
+                Plus = 5,
+                Minus = 6,
+                Star = 7,
+                Slash = 8,
+                Percent = 9,
+                Caret = 10,
+                Amp = 11,
+                Pipe = 12,
+                Tilde = 13,
+                Exclaim = 14,
+                Equal = 15,
+                Less = 16,
+                Greater = 17,
+                PlusEqual = 18,
+                MinusEqual = 19,
+                StarEqual = 20,
+                SlashEqual = 21,
+                PercentEqual = 22,
+                CaretEqual = 23,
+                AmpEqual = 24,
+                PipeEqual = 25,
+                LessLess = 26,
+                GreaterGreater = 27,
+                LessLessEqual = 28,
+                GreaterGreaterEqual = 29,
+                EqualEqual = 30,
+                ExclaimEqual = 31,
+                LessEqual = 32,
+                GreaterEqual = 33,
+                AmpAmp = 34,
+                PipePipe = 35,
+                PlusPlus = 36,
+                MinusMinus = 37,
+                Comma = 38,
+                ArrowStar = 39,
+                Arrow = 40,
+                Call = 41,
+                Subscript = 42,
+                Conditional = 43,
+                Coawait = 44
+            }
+
+            public enum CallingConvention
+            {
+                Default = 0,
+                C = 1,
+                StdCall = 2,
+                ThisCall = 3,
+                FastCall = 4,
+                Unknown = 5
+            }
+
+            public enum TemplateSpecializationKind
+            {
+                Undeclared = 0,
+                ImplicitInstantiation = 1,
+                ExplicitSpecialization = 2,
+                ExplicitInstantiationDeclaration = 3,
+                ExplicitInstantiationDefinition = 4
+            }
+
+            public enum StatementClass
+            {
+                Any = 0,
+                BinaryOperator = 1,
+                CallExprClass = 2,
+                DeclRefExprClass = 3,
+                CXXConstructExprClass = 4,
+                CXXOperatorCallExpr = 5,
+                ImplicitCastExpr = 6,
+                ExplicitCastExpr = 7
+            }
+
+            public enum CXXMethodKind
+            {
+                Normal = 0,
+                Constructor = 1,
+                Destructor = 2,
+                Conversion = 3,
+                Operator = 4,
+                UsingDirective = 5
+            }
+
+            public enum PrimitiveType
+            {
+                Null = 0,
+                Void = 1,
+                Bool = 2,
+                WideChar = 3,
+                Char = 4,
+                UChar = 5,
+                Short = 6,
+                UShort = 7,
+                Int = 8,
+                UInt = 9,
+                Long = 10,
+                ULong = 11,
+                LongLong = 12,
+                ULongLong = 13,
+                Float = 14,
+                Double = 15,
+                LongDouble = 16,
+                IntPtr = 17
+            }
+
+            public enum MacroLocation
+            {
+                Unknown = 0,
+                ClassHead = 1,
+                ClassBody = 2,
+                FunctionHead = 3,
+                FunctionParameters = 4,
+                FunctionBody = 5
+            }
+
+            public enum ArchType
+            {
+                UnknownArch = 0,
+                x86 = 1,
+                x86_64 = 2
+            }
+
+            public unsafe partial class Type : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST4TypeC2ENS1_8TypeKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.TypeKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST4TypeC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Type> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Type>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static Type __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Type(native.ToPointer(), skipVTables);
+                }
+
+                public static Type __CreateInstance(Type.Internal native, bool skipVTables = false)
+                {
+                    return new Type(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Type.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(8);
+                    CppSharp.Parser.AST.Type.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Type(Type.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Type(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Type(CppSharp.Parser.AST.TypeKind kind)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public Type(CppSharp.Parser.AST.Type _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Type __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TypeKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+
+                public bool IsDependent
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsDependent != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsDependent = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class TypeQualifiers : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 3)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public byte IsConst;
+
+                    [FieldOffset(1)]
+                    public byte IsVolatile;
+
+                    [FieldOffset(2)]
+                    public byte IsRestrict;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14TypeQualifiersC2ERKS2_")]
+                    internal static extern void cctor_0(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, TypeQualifiers> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, TypeQualifiers>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static TypeQualifiers __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypeQualifiers(native.ToPointer(), skipVTables);
+                }
+
+                public static TypeQualifiers __CreateInstance(TypeQualifiers.Internal native, bool skipVTables = false)
+                {
+                    return new TypeQualifiers(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypeQualifiers.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(3);
+                    *(TypeQualifiers.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private TypeQualifiers(TypeQualifiers.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypeQualifiers(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypeQualifiers(CppSharp.Parser.AST.TypeQualifiers _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(3);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((TypeQualifiers.Internal*) __Instance) = *((TypeQualifiers.Internal*) _0.__Instance);
+                }
+
+                public TypeQualifiers()
+                {
+                    __Instance = Marshal.AllocHGlobal(3);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.TypeQualifiers __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public bool IsConst
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsConst != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsConst = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsVolatile
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsVolatile != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsVolatile = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsRestrict
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsRestrict != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsRestrict = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class QualifiedType : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public global::System.IntPtr Type;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.TypeQualifiers.Internal Qualifiers;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13QualifiedTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13QualifiedTypeC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, QualifiedType> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, QualifiedType>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static QualifiedType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new QualifiedType(native.ToPointer(), skipVTables);
+                }
+
+                public static QualifiedType __CreateInstance(QualifiedType.Internal native, bool skipVTables = false)
+                {
+                    return new QualifiedType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(QualifiedType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(16);
+                    *(QualifiedType.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private QualifiedType(QualifiedType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected QualifiedType(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public QualifiedType()
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public QualifiedType(CppSharp.Parser.AST.QualifiedType _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((QualifiedType.Internal*) __Instance) = *((QualifiedType.Internal*) _0.__Instance);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.QualifiedType __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Type Type
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Type == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Type))
+                            __result0 = (CppSharp.Parser.AST.Type) CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Type];
+                        else __result0 = CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Type);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.TypeQualifiers Qualifiers
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.TypeQualifiers.__CreateInstance(((Internal*) __Instance)->Qualifiers);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Qualifiers = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.TypeQualifiers.Internal() : *(CppSharp.Parser.AST.TypeQualifiers.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class TagType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Declaration;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST7TagTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST7TagTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new TagType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TagType(native.ToPointer(), skipVTables);
+                }
+
+                public static TagType __CreateInstance(TagType.Internal native, bool skipVTables = false)
+                {
+                    return new TagType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TagType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(16);
+                    CppSharp.Parser.AST.TagType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TagType(TagType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TagType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TagType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TagType(CppSharp.Parser.AST.TagType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.Declaration Declaration
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->Declaration == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Declaration))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->Declaration];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->Declaration);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Declaration = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class ArrayType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 48)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [FieldOffset(24)]
+                    public CppSharp.Parser.AST.ArrayType.ArraySize SizeType;
+
+                    [FieldOffset(32)]
+                    public long Size;
+
+                    [FieldOffset(40)]
+                    public long ElementSize;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9ArrayTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9ArrayTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public enum ArraySize
+                {
+                    Constant = 0,
+                    Variable = 1,
+                    Dependent = 2,
+                    Incomplete = 3
+                }
+
+                public static new ArrayType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ArrayType(native.ToPointer(), skipVTables);
+                }
+
+                public static ArrayType __CreateInstance(ArrayType.Internal native, bool skipVTables = false)
+                {
+                    return new ArrayType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ArrayType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(48);
+                    CppSharp.Parser.AST.ArrayType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ArrayType(ArrayType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ArrayType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ArrayType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ArrayType(CppSharp.Parser.AST.ArrayType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.ArrayType.ArraySize SizeType
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->SizeType;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->SizeType = value;
+                    }
+                }
+
+                public long Size
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Size;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Size = value;
+                    }
+                }
+
+                public long ElementSize
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->ElementSize;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ElementSize = value;
+                    }
+                }
+            }
+
+            public unsafe partial class FunctionType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 56)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal ReturnType;
+
+                    [FieldOffset(24)]
+                    public CppSharp.Parser.AST.CallingConvention CallingConvention;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionTypeC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionTypeD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionType13getParametersEj")]
+                    internal static extern global::System.IntPtr getParameters_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionType13addParametersERPNS1_9ParameterE")]
+                    internal static extern void addParameters_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionType15clearParametersEv")]
+                    internal static extern void clearParameters_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12FunctionType18getParametersCountEv")]
+                    internal static extern uint getParametersCount_0(global::System.IntPtr instance);
+                }
+
+                public static new FunctionType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new FunctionType(native.ToPointer(), skipVTables);
+                }
+
+                public static FunctionType __CreateInstance(FunctionType.Internal native, bool skipVTables = false)
+                {
+                    return new FunctionType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(FunctionType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(56);
+                    CppSharp.Parser.AST.FunctionType.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private FunctionType(FunctionType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected FunctionType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public FunctionType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(56);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public FunctionType(CppSharp.Parser.AST.FunctionType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(56);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Type __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Parameter getParameters(uint i)
+                {
+                    var __ret = Internal.getParameters_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Parameter __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Parameter.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Parameter) CppSharp.Parser.AST.Parameter.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Parameter.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addParameters(CppSharp.Parser.AST.Parameter s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addParameters_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearParameters()
+                {
+                    Internal.clearParameters_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ParametersCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getParametersCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType ReturnType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->ReturnType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ReturnType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.CallingConvention CallingConvention
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->CallingConvention;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->CallingConvention = value;
+                    }
+                }
+            }
+
+            public unsafe partial class PointerType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 32)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedPointee;
+
+                    [FieldOffset(24)]
+                    public CppSharp.Parser.AST.PointerType.TypeModifier Modifier;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11PointerTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11PointerTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public enum TypeModifier
+                {
+                    Value = 0,
+                    Pointer = 1,
+                    LVReference = 2,
+                    RVReference = 3
+                }
+
+                public static new PointerType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new PointerType(native.ToPointer(), skipVTables);
+                }
+
+                public static PointerType __CreateInstance(PointerType.Internal native, bool skipVTables = false)
+                {
+                    return new PointerType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(PointerType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(32);
+                    CppSharp.Parser.AST.PointerType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private PointerType(PointerType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected PointerType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public PointerType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public PointerType(CppSharp.Parser.AST.PointerType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedPointee
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedPointee);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedPointee = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.PointerType.TypeModifier Modifier
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Modifier;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Modifier = value;
+                    }
+                }
+            }
+
+            public unsafe partial class MemberPointerType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 24)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Pointee;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17MemberPointerTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17MemberPointerTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new MemberPointerType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new MemberPointerType(native.ToPointer(), skipVTables);
+                }
+
+                public static MemberPointerType __CreateInstance(MemberPointerType.Internal native, bool skipVTables = false)
+                {
+                    return new MemberPointerType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(MemberPointerType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(24);
+                    CppSharp.Parser.AST.MemberPointerType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private MemberPointerType(MemberPointerType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected MemberPointerType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public MemberPointerType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public MemberPointerType(CppSharp.Parser.AST.MemberPointerType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Pointee
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Pointee);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Pointee = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class TypedefType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Declaration;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TypedefTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TypedefTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new TypedefType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypedefType(native.ToPointer(), skipVTables);
+                }
+
+                public static TypedefType __CreateInstance(TypedefType.Internal native, bool skipVTables = false)
+                {
+                    return new TypedefType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypedefType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(16);
+                    CppSharp.Parser.AST.TypedefType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TypedefType(TypedefType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypedefType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypedefType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TypedefType(CppSharp.Parser.AST.TypedefType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.TypedefNameDecl Declaration
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.TypedefNameDecl __result0;
+                        if (((Internal*) __Instance)->Declaration == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.TypedefNameDecl.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Declaration))
+                            __result0 = (CppSharp.Parser.AST.TypedefNameDecl) CppSharp.Parser.AST.TypedefNameDecl.NativeToManagedMap[((Internal*) __Instance)->Declaration];
+                        else __result0 = CppSharp.Parser.AST.TypedefNameDecl.__CreateInstance(((Internal*) __Instance)->Declaration);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Declaration = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class AttributedType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Modified;
+
+                    [FieldOffset(24)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Equivalent;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14AttributedTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14AttributedTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new AttributedType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new AttributedType(native.ToPointer(), skipVTables);
+                }
+
+                public static AttributedType __CreateInstance(AttributedType.Internal native, bool skipVTables = false)
+                {
+                    return new AttributedType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(AttributedType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.AttributedType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private AttributedType(AttributedType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected AttributedType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public AttributedType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public AttributedType(CppSharp.Parser.AST.AttributedType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Modified
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Modified);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Modified = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Equivalent
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Equivalent);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Equivalent = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class DecayedType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 56)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Decayed;
+
+                    [FieldOffset(24)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Original;
+
+                    [FieldOffset(40)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Pointee;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11DecayedTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11DecayedTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new DecayedType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new DecayedType(native.ToPointer(), skipVTables);
+                }
+
+                public static DecayedType __CreateInstance(DecayedType.Internal native, bool skipVTables = false)
+                {
+                    return new DecayedType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(DecayedType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(56);
+                    CppSharp.Parser.AST.DecayedType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private DecayedType(DecayedType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected DecayedType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public DecayedType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(56);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public DecayedType(CppSharp.Parser.AST.DecayedType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(56);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Decayed
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Decayed);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Decayed = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Original
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Original);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Original = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Pointee
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Pointee);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Pointee = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class TemplateArgument : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TemplateArgument.ArgumentKind Kind;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Type;
+
+                    [FieldOffset(24)]
+                    public global::System.IntPtr Declaration;
+
+                    [FieldOffset(32)]
+                    public long Integral;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16TemplateArgumentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16TemplateArgumentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public enum ArgumentKind
+                {
+                    Type = 0,
+                    Declaration = 1,
+                    NullPtr = 2,
+                    Integral = 3,
+                    Template = 4,
+                    TemplateExpansion = 5,
+                    Expression = 6,
+                    Pack = 7
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, TemplateArgument> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, TemplateArgument>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static TemplateArgument __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TemplateArgument(native.ToPointer(), skipVTables);
+                }
+
+                public static TemplateArgument __CreateInstance(TemplateArgument.Internal native, bool skipVTables = false)
+                {
+                    return new TemplateArgument(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TemplateArgument.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    *(TemplateArgument.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private TemplateArgument(TemplateArgument.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TemplateArgument(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TemplateArgument()
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TemplateArgument(CppSharp.Parser.AST.TemplateArgument _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((TemplateArgument.Internal*) __Instance) = *((TemplateArgument.Internal*) _0.__Instance);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.TemplateArgument __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TemplateArgument.ArgumentKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Type
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Type);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.Declaration Declaration
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->Declaration == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Declaration))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->Declaration];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->Declaration);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Declaration = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public long Integral
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Integral;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Integral = value;
+                    }
+                }
+            }
+
+            public unsafe partial class TemplateSpecializationType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 48)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(32)]
+                    public global::System.IntPtr Template;
+
+                    [FieldOffset(40)]
+                    public global::System.IntPtr Desugared;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationTypeC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationTypeD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationType12getArgumentsEj")]
+                    internal static extern void getArguments_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationType12addArgumentsERNS1_16TemplateArgumentE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationType14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST26TemplateSpecializationType17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new TemplateSpecializationType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TemplateSpecializationType(native.ToPointer(), skipVTables);
+                }
+
+                public static TemplateSpecializationType __CreateInstance(TemplateSpecializationType.Internal native, bool skipVTables = false)
+                {
+                    return new TemplateSpecializationType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TemplateSpecializationType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(48);
+                    CppSharp.Parser.AST.TemplateSpecializationType.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TemplateSpecializationType(TemplateSpecializationType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TemplateSpecializationType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TemplateSpecializationType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TemplateSpecializationType(CppSharp.Parser.AST.TemplateSpecializationType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Type __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TemplateArgument getArguments(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.TemplateArgument.Internal();
+                    Internal.getArguments_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.TemplateArgument.__CreateInstance(__ret);
+                }
+
+                public void addArguments(CppSharp.Parser.AST.TemplateArgument s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Template Template
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Template __result0;
+                        if (((Internal*) __Instance)->Template == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Template.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Template))
+                            __result0 = (CppSharp.Parser.AST.Template) CppSharp.Parser.AST.Template.NativeToManagedMap[((Internal*) __Instance)->Template];
+                        else __result0 = CppSharp.Parser.AST.Template.__CreateInstance(((Internal*) __Instance)->Template);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Template = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Type Desugared
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Desugared == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Desugared))
+                            __result0 = (CppSharp.Parser.AST.Type) CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Desugared];
+                        else __result0 = CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Desugared);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Desugared = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class TemplateParameterType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 32)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Parameter;
+
+                    [FieldOffset(16)]
+                    public uint Depth;
+
+                    [FieldOffset(20)]
+                    public uint Index;
+
+                    [FieldOffset(24)]
+                    public byte IsParameterPack;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21TemplateParameterTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21TemplateParameterTypeC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21TemplateParameterTypeD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TemplateParameterType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TemplateParameterType(native.ToPointer(), skipVTables);
+                }
+
+                public static TemplateParameterType __CreateInstance(TemplateParameterType.Internal native, bool skipVTables = false)
+                {
+                    return new TemplateParameterType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TemplateParameterType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(32);
+                    CppSharp.Parser.AST.TemplateParameterType.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TemplateParameterType(TemplateParameterType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TemplateParameterType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TemplateParameterType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TemplateParameterType(CppSharp.Parser.AST.TemplateParameterType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Type __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TypeTemplateParameter Parameter
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.TypeTemplateParameter __result0;
+                        if (((Internal*) __Instance)->Parameter == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.TypeTemplateParameter.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Parameter))
+                            __result0 = (CppSharp.Parser.AST.TypeTemplateParameter) CppSharp.Parser.AST.TypeTemplateParameter.NativeToManagedMap[((Internal*) __Instance)->Parameter];
+                        else __result0 = CppSharp.Parser.AST.TypeTemplateParameter.__CreateInstance(((Internal*) __Instance)->Parameter);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Parameter = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public uint Depth
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Depth;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Depth = value;
+                    }
+                }
+
+                public uint Index
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Index;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Index = value;
+                    }
+                }
+
+                public bool IsParameterPack
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsParameterPack != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsParameterPack = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class TemplateParameterSubstitutionType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 24)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal Replacement;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST33TemplateParameterSubstitutionTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST33TemplateParameterSubstitutionTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new TemplateParameterSubstitutionType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TemplateParameterSubstitutionType(native.ToPointer(), skipVTables);
+                }
+
+                public static TemplateParameterSubstitutionType __CreateInstance(TemplateParameterSubstitutionType.Internal native, bool skipVTables = false)
+                {
+                    return new TemplateParameterSubstitutionType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TemplateParameterSubstitutionType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(24);
+                    CppSharp.Parser.AST.TemplateParameterSubstitutionType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TemplateParameterSubstitutionType(TemplateParameterSubstitutionType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TemplateParameterSubstitutionType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TemplateParameterSubstitutionType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TemplateParameterSubstitutionType(CppSharp.Parser.AST.TemplateParameterSubstitutionType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType Replacement
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->Replacement);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Replacement = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class InjectedClassNameType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 32)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal InjectedSpecializationType;
+
+                    [FieldOffset(24)]
+                    public global::System.IntPtr Class;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21InjectedClassNameTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21InjectedClassNameTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new InjectedClassNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new InjectedClassNameType(native.ToPointer(), skipVTables);
+                }
+
+                public static InjectedClassNameType __CreateInstance(InjectedClassNameType.Internal native, bool skipVTables = false)
+                {
+                    return new InjectedClassNameType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(InjectedClassNameType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(32);
+                    CppSharp.Parser.AST.InjectedClassNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private InjectedClassNameType(InjectedClassNameType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected InjectedClassNameType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public InjectedClassNameType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public InjectedClassNameType(CppSharp.Parser.AST.InjectedClassNameType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType InjectedSpecializationType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->InjectedSpecializationType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->InjectedSpecializationType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.Class Class
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Class __result0;
+                        if (((Internal*) __Instance)->Class == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Class.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Class))
+                            __result0 = (CppSharp.Parser.AST.Class) CppSharp.Parser.AST.Class.NativeToManagedMap[((Internal*) __Instance)->Class];
+                        else __result0 = CppSharp.Parser.AST.Class.__CreateInstance(((Internal*) __Instance)->Class);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class DependentNameType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17DependentNameTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new DependentNameType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new DependentNameType(native.ToPointer(), skipVTables);
+                }
+
+                public static DependentNameType __CreateInstance(DependentNameType.Internal native, bool skipVTables = false)
+                {
+                    return new DependentNameType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(DependentNameType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(8);
+                    CppSharp.Parser.AST.DependentNameType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private DependentNameType(DependentNameType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected DependentNameType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public DependentNameType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public DependentNameType(CppSharp.Parser.AST.DependentNameType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+            }
+
+            public unsafe partial class PackExpansionType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17PackExpansionTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17PackExpansionTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new PackExpansionType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new PackExpansionType(native.ToPointer(), skipVTables);
+                }
+
+                public static PackExpansionType __CreateInstance(PackExpansionType.Internal native, bool skipVTables = false)
+                {
+                    return new PackExpansionType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(PackExpansionType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(8);
+                    CppSharp.Parser.AST.PackExpansionType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private PackExpansionType(PackExpansionType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected PackExpansionType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public PackExpansionType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public PackExpansionType(CppSharp.Parser.AST.PackExpansionType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+            }
+
+            public unsafe partial class BuiltinType : CppSharp.Parser.AST.Type, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 12)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.TypeKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsDependent;
+
+                    [FieldOffset(8)]
+                    public CppSharp.Parser.AST.PrimitiveType Type;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11BuiltinTypeC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11BuiltinTypeC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new BuiltinType __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new BuiltinType(native.ToPointer(), skipVTables);
+                }
+
+                public static BuiltinType __CreateInstance(BuiltinType.Internal native, bool skipVTables = false)
+                {
+                    return new BuiltinType(native, skipVTables);
+                }
+
+                private static void* __CopyValue(BuiltinType.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(12);
+                    CppSharp.Parser.AST.BuiltinType.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private BuiltinType(BuiltinType.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected BuiltinType(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public BuiltinType()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(12);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public BuiltinType(CppSharp.Parser.AST.BuiltinType _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(12);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public CppSharp.Parser.AST.PrimitiveType Type
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Type;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Type = value;
+                    }
+                }
+            }
+
+            public unsafe partial class VTableComponent : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.VTableComponentKind Kind;
+
+                    [FieldOffset(4)]
+                    public uint Offset;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Declaration;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15VTableComponentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15VTableComponentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, VTableComponent> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, VTableComponent>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static VTableComponent __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new VTableComponent(native.ToPointer(), skipVTables);
+                }
+
+                public static VTableComponent __CreateInstance(VTableComponent.Internal native, bool skipVTables = false)
+                {
+                    return new VTableComponent(native, skipVTables);
+                }
+
+                private static void* __CopyValue(VTableComponent.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(16);
+                    *(VTableComponent.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private VTableComponent(VTableComponent.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected VTableComponent(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public VTableComponent()
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public VTableComponent(CppSharp.Parser.AST.VTableComponent _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((VTableComponent.Internal*) __Instance) = *((VTableComponent.Internal*) _0.__Instance);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.VTableComponent __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.VTableComponentKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+
+                public uint Offset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Offset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Offset = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Declaration Declaration
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->Declaration == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Declaration))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->Declaration];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->Declaration);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Declaration = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class VTableLayout : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 24)]
+                public partial struct Internal
+                {
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayoutC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayoutC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayoutD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayout13getComponentsEj")]
+                    internal static extern CppSharp.Parser.AST.VTableComponent.Internal getComponents_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayout13addComponentsERNS1_15VTableComponentE")]
+                    internal static extern void addComponents_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayout15clearComponentsEv")]
+                    internal static extern void clearComponents_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST12VTableLayout18getComponentsCountEv")]
+                    internal static extern uint getComponentsCount_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, VTableLayout> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, VTableLayout>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static VTableLayout __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new VTableLayout(native.ToPointer(), skipVTables);
+                }
+
+                public static VTableLayout __CreateInstance(VTableLayout.Internal native, bool skipVTables = false)
+                {
+                    return new VTableLayout(native, skipVTables);
+                }
+
+                private static void* __CopyValue(VTableLayout.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(24);
+                    CppSharp.Parser.AST.VTableLayout.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private VTableLayout(VTableLayout.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected VTableLayout(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public VTableLayout()
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public VTableLayout(CppSharp.Parser.AST.VTableLayout _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.VTableLayout __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.VTableComponent getComponents(uint i)
+                {
+                    var __ret = Internal.getComponents_0((__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.VTableComponent.__CreateInstance(__ret);
+                }
+
+                public void addComponents(CppSharp.Parser.AST.VTableComponent s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addComponents_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearComponents()
+                {
+                    Internal.clearComponents_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ComponentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getComponentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class VFTableInfo : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public ulong VBTableIndex;
+
+                    [FieldOffset(8)]
+                    public uint VFPtrOffset;
+
+                    [FieldOffset(12)]
+                    public uint VFPtrFullOffset;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.AST.VTableLayout.Internal Layout;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11VFTableInfoC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11VFTableInfoC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11VFTableInfoD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, VFTableInfo> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, VFTableInfo>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static VFTableInfo __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new VFTableInfo(native.ToPointer(), skipVTables);
+                }
+
+                public static VFTableInfo __CreateInstance(VFTableInfo.Internal native, bool skipVTables = false)
+                {
+                    return new VFTableInfo(native, skipVTables);
+                }
+
+                private static void* __CopyValue(VFTableInfo.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.VFTableInfo.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private VFTableInfo(VFTableInfo.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected VFTableInfo(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public VFTableInfo()
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public VFTableInfo(CppSharp.Parser.AST.VFTableInfo _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.VFTableInfo __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public ulong VBTableIndex
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->VBTableIndex;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->VBTableIndex = value;
+                    }
+                }
+
+                public uint VFPtrOffset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->VFPtrOffset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->VFPtrOffset = value;
+                    }
+                }
+
+                public uint VFPtrFullOffset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->VFPtrFullOffset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->VFPtrFullOffset = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.VTableLayout Layout
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.VTableLayout.__CreateInstance(((Internal*) __Instance)->Layout);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Layout = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.VTableLayout.Internal() : *(CppSharp.Parser.AST.VTableLayout.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class LayoutField : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 64)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public uint Offset;
+
+                    [FieldOffset(40)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [FieldOffset(56)]
+                    public global::System.IntPtr FieldPtr;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11LayoutFieldC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11LayoutFieldC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr other);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11LayoutFieldD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11LayoutField7getNameEv")]
+                    internal static extern global::System.IntPtr getName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11LayoutField7setNameEPKc")]
+                    internal static extern void setName_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, LayoutField> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, LayoutField>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static LayoutField __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new LayoutField(native.ToPointer(), skipVTables);
+                }
+
+                public static LayoutField __CreateInstance(LayoutField.Internal native, bool skipVTables = false)
+                {
+                    return new LayoutField(native, skipVTables);
+                }
+
+                private static void* __CopyValue(LayoutField.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(64);
+                    CppSharp.Parser.AST.LayoutField.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private LayoutField(LayoutField.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected LayoutField(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public LayoutField()
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public LayoutField(CppSharp.Parser.AST.LayoutField other)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(other, null))
+                        throw new global::System.ArgumentNullException("other", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = other.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.LayoutField __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Name
+                {
+                    get
+                    {
+                        var __ret = Internal.getName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public uint Offset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Offset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Offset = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public global::System.IntPtr FieldPtr
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->FieldPtr;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->FieldPtr = (global::System.IntPtr) value;
+                    }
+                }
+            }
+
+            public unsafe partial class LayoutBase : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 16)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public uint Offset;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Class;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10LayoutBaseC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10LayoutBaseC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr other);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10LayoutBaseD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, LayoutBase> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, LayoutBase>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static LayoutBase __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new LayoutBase(native.ToPointer(), skipVTables);
+                }
+
+                public static LayoutBase __CreateInstance(LayoutBase.Internal native, bool skipVTables = false)
+                {
+                    return new LayoutBase(native, skipVTables);
+                }
+
+                private static void* __CopyValue(LayoutBase.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(16);
+                    CppSharp.Parser.AST.LayoutBase.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private LayoutBase(LayoutBase.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected LayoutBase(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public LayoutBase()
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public LayoutBase(CppSharp.Parser.AST.LayoutBase other)
+                {
+                    __Instance = Marshal.AllocHGlobal(16);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(other, null))
+                        throw new global::System.ArgumentNullException("other", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = other.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.LayoutBase __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public uint Offset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Offset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Offset = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Class Class
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Class __result0;
+                        if (((Internal*) __Instance)->Class == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Class.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Class))
+                            __result0 = (CppSharp.Parser.AST.Class) CppSharp.Parser.AST.Class.NativeToManagedMap[((Internal*) __Instance)->Class];
+                        else __result0 = CppSharp.Parser.AST.Class.__CreateInstance(((Internal*) __Instance)->Class);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class ClassLayout : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 136)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CppAbi ABI;
+
+                    [FieldOffset(32)]
+                    public CppSharp.Parser.AST.VTableLayout.Internal Layout;
+
+                    [FieldOffset(56)]
+                    public byte HasOwnVFPtr;
+
+                    [FieldOffset(64)]
+                    public long VBPtrOffset;
+
+                    [FieldOffset(72)]
+                    public int Alignment;
+
+                    [FieldOffset(76)]
+                    public int Size;
+
+                    [FieldOffset(80)]
+                    public int DataSize;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayoutC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayoutC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayoutD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout11getVFTablesEj")]
+                    internal static extern void getVFTables_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout11addVFTablesERNS1_11VFTableInfoE")]
+                    internal static extern void addVFTables_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout13clearVFTablesEv")]
+                    internal static extern void clearVFTables_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout9getFieldsEj")]
+                    internal static extern void getFields_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout9addFieldsERNS1_11LayoutFieldE")]
+                    internal static extern void addFields_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout11clearFieldsEv")]
+                    internal static extern void clearFields_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout8getBasesEj")]
+                    internal static extern void getBases_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout8addBasesERNS1_10LayoutBaseE")]
+                    internal static extern void addBases_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout10clearBasesEv")]
+                    internal static extern void clearBases_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout16getVFTablesCountEv")]
+                    internal static extern uint getVFTablesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout14getFieldsCountEv")]
+                    internal static extern uint getFieldsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11ClassLayout13getBasesCountEv")]
+                    internal static extern uint getBasesCount_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ClassLayout> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ClassLayout>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static ClassLayout __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ClassLayout(native.ToPointer(), skipVTables);
+                }
+
+                public static ClassLayout __CreateInstance(ClassLayout.Internal native, bool skipVTables = false)
+                {
+                    return new ClassLayout(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ClassLayout.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(136);
+                    CppSharp.Parser.AST.ClassLayout.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ClassLayout(ClassLayout.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ClassLayout(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ClassLayout()
+                {
+                    __Instance = Marshal.AllocHGlobal(136);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ClassLayout(CppSharp.Parser.AST.ClassLayout _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(136);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.ClassLayout __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.VFTableInfo getVFTables(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.VFTableInfo.Internal();
+                    Internal.getVFTables_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.VFTableInfo.__CreateInstance(__ret);
+                }
+
+                public void addVFTables(CppSharp.Parser.AST.VFTableInfo s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addVFTables_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearVFTables()
+                {
+                    Internal.clearVFTables_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.LayoutField getFields(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.LayoutField.Internal();
+                    Internal.getFields_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.LayoutField.__CreateInstance(__ret);
+                }
+
+                public void addFields(CppSharp.Parser.AST.LayoutField s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addFields_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearFields()
+                {
+                    Internal.clearFields_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.LayoutBase getBases(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.LayoutBase.Internal();
+                    Internal.getBases_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.LayoutBase.__CreateInstance(__ret);
+                }
+
+                public void addBases(CppSharp.Parser.AST.LayoutBase s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addBases_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearBases()
+                {
+                    Internal.clearBases_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint VFTablesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getVFTablesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint FieldsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getFieldsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint BasesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getBasesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.CppAbi ABI
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->ABI;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ABI = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.VTableLayout Layout
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.VTableLayout.__CreateInstance(((Internal*) __Instance)->Layout);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Layout = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.VTableLayout.Internal() : *(CppSharp.Parser.AST.VTableLayout.Internal*) (value.__Instance);
+                    }
+                }
+
+                public bool HasOwnVFPtr
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasOwnVFPtr != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasOwnVFPtr = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public long VBPtrOffset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->VBPtrOffset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->VBPtrOffset = value;
+                    }
+                }
+
+                public int Alignment
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Alignment;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Alignment = value;
+                    }
+                }
+
+                public int Size
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Size;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Size = value;
+                    }
+                }
+
+                public int DataSize
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->DataSize;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->DataSize = value;
+                    }
+                }
+            }
+
+            public unsafe partial class Declaration : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 192)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11DeclarationC2ENS1_15DeclarationKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.DeclarationKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11DeclarationC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11DeclarationD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration23getPreprocessedEntitiesEj")]
+                    internal static extern global::System.IntPtr getPreprocessedEntities_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration23addPreprocessedEntitiesERPNS1_18PreprocessedEntityE")]
+                    internal static extern void addPreprocessedEntities_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration25clearPreprocessedEntitiesEv")]
+                    internal static extern void clearPreprocessedEntities_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration7getNameEv")]
+                    internal static extern global::System.IntPtr getName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration7setNameEPKc")]
+                    internal static extern void setName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration6getUSREv")]
+                    internal static extern global::System.IntPtr getUSR_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration6setUSREPKc")]
+                    internal static extern void setUSR_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration12getDebugTextEv")]
+                    internal static extern global::System.IntPtr getDebugText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration12setDebugTextEPKc")]
+                    internal static extern void setDebugText_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Declaration28getPreprocessedEntitiesCountEv")]
+                    internal static extern uint getPreprocessedEntitiesCount_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Declaration> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Declaration>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static Declaration __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Declaration(native.ToPointer(), skipVTables);
+                }
+
+                public static Declaration __CreateInstance(Declaration.Internal native, bool skipVTables = false)
+                {
+                    return new Declaration(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Declaration.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(192);
+                    CppSharp.Parser.AST.Declaration.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Declaration(Declaration.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Declaration(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Declaration(CppSharp.Parser.AST.DeclarationKind kind)
+                {
+                    __Instance = Marshal.AllocHGlobal(192);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public Declaration(CppSharp.Parser.AST.Declaration _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(192);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.PreprocessedEntity getPreprocessedEntities(uint i)
+                {
+                    var __ret = Internal.getPreprocessedEntities_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.PreprocessedEntity __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.PreprocessedEntity.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.PreprocessedEntity) CppSharp.Parser.AST.PreprocessedEntity.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.PreprocessedEntity.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addPreprocessedEntities(CppSharp.Parser.AST.PreprocessedEntity s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addPreprocessedEntities_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearPreprocessedEntities()
+                {
+                    Internal.clearPreprocessedEntities_0((__Instance + __PointerAdjustment));
+                }
+
+                public string Name
+                {
+                    get
+                    {
+                        var __ret = Internal.getName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public string USR
+                {
+                    get
+                    {
+                        var __ret = Internal.getUSR_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setUSR_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public string DebugText
+                {
+                    get
+                    {
+                        var __ret = Internal.getDebugText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setDebugText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public uint PreprocessedEntitiesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getPreprocessedEntitiesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.DeclarationKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.AccessSpecifier Access
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Access;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Access = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.DeclarationContext _Namespace
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.DeclarationContext __result0;
+                        if (((Internal*) __Instance)->_Namespace == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.DeclarationContext.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->_Namespace))
+                            __result0 = (CppSharp.Parser.AST.DeclarationContext) CppSharp.Parser.AST.DeclarationContext.NativeToManagedMap[((Internal*) __Instance)->_Namespace];
+                        else __result0 = CppSharp.Parser.AST.DeclarationContext.__CreateInstance(((Internal*) __Instance)->_Namespace);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->_Namespace = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.SourceLocation Location
+                {
+                    get
+                    {
+                        return CppSharp.Parser.SourceLocation.__CreateInstance(((Internal*) __Instance)->Location);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Location = value.__Instance;
+                    }
+                }
+
+                public int LineNumberStart
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->LineNumberStart;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->LineNumberStart = value;
+                    }
+                }
+
+                public int LineNumberEnd
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->LineNumberEnd;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->LineNumberEnd = value;
+                    }
+                }
+
+                public bool IsIncomplete
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsIncomplete != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsIncomplete = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsDependent
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsDependent != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsDependent = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsImplicit
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsImplicit != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsImplicit = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.Declaration CompleteDeclaration
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->CompleteDeclaration == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->CompleteDeclaration))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->CompleteDeclaration];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->CompleteDeclaration);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->CompleteDeclaration = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public uint DefinitionOrder
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->DefinitionOrder;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->DefinitionOrder = value;
+                    }
+                }
+
+                public global::System.IntPtr OriginalPtr
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->OriginalPtr;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->OriginalPtr = (global::System.IntPtr) value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.RawComment Comment
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.RawComment __result0;
+                        if (((Internal*) __Instance)->Comment == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.RawComment.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Comment))
+                            __result0 = (CppSharp.Parser.AST.RawComment) CppSharp.Parser.AST.RawComment.NativeToManagedMap[((Internal*) __Instance)->Comment];
+                        else __result0 = CppSharp.Parser.AST.RawComment.__CreateInstance(((Internal*) __Instance)->Comment);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Comment = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class DeclarationContext : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 464)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContextC2ENS1_15DeclarationKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.DeclarationKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContextC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContextD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext13getNamespacesEj")]
+                    internal static extern global::System.IntPtr getNamespaces_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext13addNamespacesERPNS1_9NamespaceE")]
+                    internal static extern void addNamespaces_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext15clearNamespacesEv")]
+                    internal static extern void clearNamespaces_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext8getEnumsEj")]
+                    internal static extern global::System.IntPtr getEnums_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext8addEnumsERPNS1_11EnumerationE")]
+                    internal static extern void addEnums_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext10clearEnumsEv")]
+                    internal static extern void clearEnums_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12getFunctionsEj")]
+                    internal static extern global::System.IntPtr getFunctions_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12addFunctionsERPNS1_8FunctionE")]
+                    internal static extern void addFunctions_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext14clearFunctionsEv")]
+                    internal static extern void clearFunctions_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext10getClassesEj")]
+                    internal static extern global::System.IntPtr getClasses_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext10addClassesERPNS1_5ClassE")]
+                    internal static extern void addClasses_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12clearClassesEv")]
+                    internal static extern void clearClasses_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12getTemplatesEj")]
+                    internal static extern global::System.IntPtr getTemplates_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12addTemplatesERPNS1_8TemplateE")]
+                    internal static extern void addTemplates_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext14clearTemplatesEv")]
+                    internal static extern void clearTemplates_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext11getTypedefsEj")]
+                    internal static extern global::System.IntPtr getTypedefs_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext11addTypedefsERPNS1_11TypedefDeclE")]
+                    internal static extern void addTypedefs_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext13clearTypedefsEv")]
+                    internal static extern void clearTypedefs_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext14getTypeAliasesEj")]
+                    internal static extern global::System.IntPtr getTypeAliases_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext14addTypeAliasesERPNS1_9TypeAliasE")]
+                    internal static extern void addTypeAliases_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext16clearTypeAliasesEv")]
+                    internal static extern void clearTypeAliases_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12getVariablesEj")]
+                    internal static extern global::System.IntPtr getVariables_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12addVariablesERPNS1_8VariableE")]
+                    internal static extern void addVariables_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext14clearVariablesEv")]
+                    internal static extern void clearVariables_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext10getFriendsEj")]
+                    internal static extern global::System.IntPtr getFriends_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext10addFriendsERPNS1_6FriendE")]
+                    internal static extern void addFriends_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext12clearFriendsEv")]
+                    internal static extern void clearFriends_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext18getNamespacesCountEv")]
+                    internal static extern uint getNamespacesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext13getEnumsCountEv")]
+                    internal static extern uint getEnumsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext17getFunctionsCountEv")]
+                    internal static extern uint getFunctionsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext15getClassesCountEv")]
+                    internal static extern uint getClassesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext17getTemplatesCountEv")]
+                    internal static extern uint getTemplatesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext16getTypedefsCountEv")]
+                    internal static extern uint getTypedefsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext19getTypeAliasesCountEv")]
+                    internal static extern uint getTypeAliasesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext17getVariablesCountEv")]
+                    internal static extern uint getVariablesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18DeclarationContext15getFriendsCountEv")]
+                    internal static extern uint getFriendsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new DeclarationContext __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new DeclarationContext(native.ToPointer(), skipVTables);
+                }
+
+                public static DeclarationContext __CreateInstance(DeclarationContext.Internal native, bool skipVTables = false)
+                {
+                    return new DeclarationContext(native, skipVTables);
+                }
+
+                private static void* __CopyValue(DeclarationContext.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(464);
+                    CppSharp.Parser.AST.DeclarationContext.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private DeclarationContext(DeclarationContext.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected DeclarationContext(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public DeclarationContext(CppSharp.Parser.AST.DeclarationKind kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(464);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public DeclarationContext(CppSharp.Parser.AST.DeclarationContext _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(464);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Namespace getNamespaces(uint i)
+                {
+                    var __ret = Internal.getNamespaces_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Namespace __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Namespace.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Namespace) CppSharp.Parser.AST.Namespace.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Namespace.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addNamespaces(CppSharp.Parser.AST.Namespace s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addNamespaces_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearNamespaces()
+                {
+                    Internal.clearNamespaces_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Enumeration getEnums(uint i)
+                {
+                    var __ret = Internal.getEnums_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Enumeration __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Enumeration.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Enumeration) CppSharp.Parser.AST.Enumeration.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Enumeration.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addEnums(CppSharp.Parser.AST.Enumeration s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addEnums_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearEnums()
+                {
+                    Internal.clearEnums_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Function getFunctions(uint i)
+                {
+                    var __ret = Internal.getFunctions_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Function __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Function.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Function) CppSharp.Parser.AST.Function.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Function.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addFunctions(CppSharp.Parser.AST.Function s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addFunctions_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearFunctions()
+                {
+                    Internal.clearFunctions_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Class getClasses(uint i)
+                {
+                    var __ret = Internal.getClasses_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Class __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Class.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Class) CppSharp.Parser.AST.Class.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Class.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addClasses(CppSharp.Parser.AST.Class s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addClasses_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearClasses()
+                {
+                    Internal.clearClasses_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Template getTemplates(uint i)
+                {
+                    var __ret = Internal.getTemplates_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Template __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Template.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Template) CppSharp.Parser.AST.Template.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Template.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addTemplates(CppSharp.Parser.AST.Template s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addTemplates_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearTemplates()
+                {
+                    Internal.clearTemplates_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.TypedefDecl getTypedefs(uint i)
+                {
+                    var __ret = Internal.getTypedefs_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.TypedefDecl __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.TypedefDecl.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.TypedefDecl) CppSharp.Parser.AST.TypedefDecl.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.TypedefDecl.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addTypedefs(CppSharp.Parser.AST.TypedefDecl s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addTypedefs_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearTypedefs()
+                {
+                    Internal.clearTypedefs_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.TypeAlias getTypeAliases(uint i)
+                {
+                    var __ret = Internal.getTypeAliases_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.TypeAlias __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.TypeAlias.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.TypeAlias) CppSharp.Parser.AST.TypeAlias.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.TypeAlias.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addTypeAliases(CppSharp.Parser.AST.TypeAlias s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addTypeAliases_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearTypeAliases()
+                {
+                    Internal.clearTypeAliases_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Variable getVariables(uint i)
+                {
+                    var __ret = Internal.getVariables_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Variable __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Variable.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Variable) CppSharp.Parser.AST.Variable.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Variable.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addVariables(CppSharp.Parser.AST.Variable s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addVariables_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearVariables()
+                {
+                    Internal.clearVariables_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Friend getFriends(uint i)
+                {
+                    var __ret = Internal.getFriends_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Friend __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Friend.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Friend) CppSharp.Parser.AST.Friend.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Friend.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addFriends(CppSharp.Parser.AST.Friend s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addFriends_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearFriends()
+                {
+                    Internal.clearFriends_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint NamespacesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getNamespacesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint EnumsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getEnumsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint FunctionsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getFunctionsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint ClassesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getClassesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint TemplatesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getTemplatesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint TypedefsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getTypedefsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint TypeAliasesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getTypeAliasesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint VariablesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getVariablesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint FriendsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getFriendsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public bool IsAnonymous
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsAnonymous != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsAnonymous = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class TypedefNameDecl : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 208)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TypedefNameDeclC2ENS1_15DeclarationKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.DeclarationKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TypedefNameDeclC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TypedefNameDeclD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TypedefNameDecl __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypedefNameDecl(native.ToPointer(), skipVTables);
+                }
+
+                public static TypedefNameDecl __CreateInstance(TypedefNameDecl.Internal native, bool skipVTables = false)
+                {
+                    return new TypedefNameDecl(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypedefNameDecl.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(208);
+                    CppSharp.Parser.AST.TypedefNameDecl.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TypedefNameDecl(TypedefNameDecl.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypedefNameDecl(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypedefNameDecl(CppSharp.Parser.AST.DeclarationKind kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(208);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public TypedefNameDecl(CppSharp.Parser.AST.TypedefNameDecl _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(208);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class TypedefDecl : CppSharp.Parser.AST.TypedefNameDecl, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 208)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TypedefDeclC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TypedefDeclC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TypedefDeclD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TypedefDecl __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypedefDecl(native.ToPointer(), skipVTables);
+                }
+
+                public static TypedefDecl __CreateInstance(TypedefDecl.Internal native, bool skipVTables = false)
+                {
+                    return new TypedefDecl(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypedefDecl.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(208);
+                    CppSharp.Parser.AST.TypedefDecl.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TypedefDecl(TypedefDecl.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypedefDecl(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypedefDecl()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(208);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TypedefDecl(CppSharp.Parser.AST.TypedefDecl _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(208);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+            }
+
+            public unsafe partial class TypeAlias : CppSharp.Parser.AST.TypedefNameDecl, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 216)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [FieldOffset(208)]
+                    public global::System.IntPtr DescribedAliasTemplate;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9TypeAliasC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9TypeAliasC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9TypeAliasD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TypeAlias __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypeAlias(native.ToPointer(), skipVTables);
+                }
+
+                public static TypeAlias __CreateInstance(TypeAlias.Internal native, bool skipVTables = false)
+                {
+                    return new TypeAlias(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypeAlias.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(216);
+                    CppSharp.Parser.AST.TypeAlias.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TypeAlias(TypeAlias.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypeAlias(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypeAlias()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(216);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TypeAlias(CppSharp.Parser.AST.TypeAlias _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(216);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TypeAliasTemplate DescribedAliasTemplate
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.TypeAliasTemplate __result0;
+                        if (((Internal*) __Instance)->DescribedAliasTemplate == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.TypeAliasTemplate.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->DescribedAliasTemplate))
+                            __result0 = (CppSharp.Parser.AST.TypeAliasTemplate) CppSharp.Parser.AST.TypeAliasTemplate.NativeToManagedMap[((Internal*) __Instance)->DescribedAliasTemplate];
+                        else __result0 = CppSharp.Parser.AST.TypeAliasTemplate.__CreateInstance(((Internal*) __Instance)->DescribedAliasTemplate);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->DescribedAliasTemplate = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Friend : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 200)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public global::System.IntPtr Declaration;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST6FriendC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST6FriendC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST6FriendD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new Friend __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Friend(native.ToPointer(), skipVTables);
+                }
+
+                public static Friend __CreateInstance(Friend.Internal native, bool skipVTables = false)
+                {
+                    return new Friend(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Friend.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(200);
+                    CppSharp.Parser.AST.Friend.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Friend(Friend.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Friend(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Friend()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(200);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Friend(CppSharp.Parser.AST.Friend _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(200);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Declaration Declaration
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->Declaration == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Declaration))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->Declaration];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->Declaration);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Declaration = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Statement : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 48)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.StatementClass Class;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Decl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9StatementC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9StatementD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9Statement9getStringEv")]
+                    internal static extern global::System.IntPtr getString_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9Statement9setStringEPKc")]
+                    internal static extern void setString_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Statement> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Statement>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static Statement __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Statement(native.ToPointer(), skipVTables);
+                }
+
+                public static Statement __CreateInstance(Statement.Internal native, bool skipVTables = false)
+                {
+                    return new Statement(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Statement.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(48);
+                    CppSharp.Parser.AST.Statement.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Statement(Statement.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Statement(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Statement(CppSharp.Parser.AST.Statement _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Statement __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string String
+                {
+                    get
+                    {
+                        var __ret = Internal.getString_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setString_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.StatementClass Class
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Class;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Class = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Declaration Decl
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->Decl == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Decl))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->Decl];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->Decl);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Decl = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Expression : CppSharp.Parser.AST.Statement, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 48)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.StatementClass Class;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Decl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ExpressionD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new Expression __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Expression(native.ToPointer(), skipVTables);
+                }
+
+                public static Expression __CreateInstance(Expression.Internal native, bool skipVTables = false)
+                {
+                    return new Expression(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Expression.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(48);
+                    CppSharp.Parser.AST.Expression.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Expression(Expression.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Expression(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Expression(CppSharp.Parser.AST.Expression _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Statement __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+            }
+
+            public unsafe partial class BinaryOperator : CppSharp.Parser.AST.Expression, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 96)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.StatementClass Class;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Decl;
+
+                    [FieldOffset(48)]
+                    public global::System.IntPtr LHS;
+
+                    [FieldOffset(56)]
+                    public global::System.IntPtr RHS;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14BinaryOperatorC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14BinaryOperatorD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14BinaryOperator12getOpcodeStrEv")]
+                    internal static extern global::System.IntPtr getOpcodeStr_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14BinaryOperator12setOpcodeStrEPKc")]
+                    internal static extern void setOpcodeStr_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new BinaryOperator __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new BinaryOperator(native.ToPointer(), skipVTables);
+                }
+
+                public static BinaryOperator __CreateInstance(BinaryOperator.Internal native, bool skipVTables = false)
+                {
+                    return new BinaryOperator(native, skipVTables);
+                }
+
+                private static void* __CopyValue(BinaryOperator.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(96);
+                    CppSharp.Parser.AST.BinaryOperator.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private BinaryOperator(BinaryOperator.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected BinaryOperator(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public BinaryOperator(CppSharp.Parser.AST.BinaryOperator _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(96);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Statement __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string OpcodeStr
+                {
+                    get
+                    {
+                        var __ret = Internal.getOpcodeStr_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setOpcodeStr_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.Expression LHS
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Expression __result0;
+                        if (((Internal*) __Instance)->LHS == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->LHS))
+                            __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->LHS];
+                        else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->LHS);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->LHS = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Expression RHS
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Expression __result0;
+                        if (((Internal*) __Instance)->RHS == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->RHS))
+                            __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->RHS];
+                        else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->RHS);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->RHS = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class CallExpr : CppSharp.Parser.AST.Expression, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 72)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.StatementClass Class;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Decl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8CallExprC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8CallExprD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8CallExpr12getArgumentsEj")]
+                    internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8CallExpr12addArgumentsERPNS1_10ExpressionE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8CallExpr14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8CallExpr17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new CallExpr __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new CallExpr(native.ToPointer(), skipVTables);
+                }
+
+                public static CallExpr __CreateInstance(CallExpr.Internal native, bool skipVTables = false)
+                {
+                    return new CallExpr(native, skipVTables);
+                }
+
+                private static void* __CopyValue(CallExpr.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(72);
+                    CppSharp.Parser.AST.CallExpr.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private CallExpr(CallExpr.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected CallExpr(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public CallExpr(CppSharp.Parser.AST.CallExpr _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(72);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Statement __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Expression getArguments(uint i)
+                {
+                    var __ret = Internal.getArguments_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Expression __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addArguments(CppSharp.Parser.AST.Expression s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class CXXConstructExpr : CppSharp.Parser.AST.Expression, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 72)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.StatementClass Class;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Decl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExprD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12getArgumentsEj")]
+                    internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr12addArgumentsERPNS1_10ExpressionE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16CXXConstructExpr17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new CXXConstructExpr __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new CXXConstructExpr(native.ToPointer(), skipVTables);
+                }
+
+                public static CXXConstructExpr __CreateInstance(CXXConstructExpr.Internal native, bool skipVTables = false)
+                {
+                    return new CXXConstructExpr(native, skipVTables);
+                }
+
+                private static void* __CopyValue(CXXConstructExpr.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(72);
+                    CppSharp.Parser.AST.CXXConstructExpr.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private CXXConstructExpr(CXXConstructExpr.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected CXXConstructExpr(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public CXXConstructExpr(CppSharp.Parser.AST.CXXConstructExpr _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(72);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Statement __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Expression getArguments(uint i)
+                {
+                    var __ret = Internal.getArguments_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Expression __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addArguments(CppSharp.Parser.AST.Expression s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class Parameter : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 224)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [FieldOffset(208)]
+                    public byte IsIndirect;
+
+                    [FieldOffset(209)]
+                    public byte HasDefaultValue;
+
+                    [FieldOffset(212)]
+                    public uint Index;
+
+                    [FieldOffset(216)]
+                    public global::System.IntPtr DefaultArgument;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9ParameterC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9ParameterC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9ParameterD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new Parameter __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Parameter(native.ToPointer(), skipVTables);
+                }
+
+                public static Parameter __CreateInstance(Parameter.Internal native, bool skipVTables = false)
+                {
+                    return new Parameter(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Parameter.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(224);
+                    CppSharp.Parser.AST.Parameter.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Parameter(Parameter.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Parameter(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Parameter()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Parameter(CppSharp.Parser.AST.Parameter _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public bool IsIndirect
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsIndirect != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsIndirect = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool HasDefaultValue
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasDefaultValue != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasDefaultValue = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public uint Index
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Index;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Index = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Expression DefaultArgument
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Expression __result0;
+                        if (((Internal*) __Instance)->DefaultArgument == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->DefaultArgument))
+                            __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->DefaultArgument];
+                        else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->DefaultArgument);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->DefaultArgument = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Function : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 336)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal ReturnType;
+
+                    [FieldOffset(208)]
+                    public byte IsReturnIndirect;
+
+                    [FieldOffset(209)]
+                    public byte HasThisReturn;
+
+                    [FieldOffset(210)]
+                    public byte IsVariadic;
+
+                    [FieldOffset(211)]
+                    public byte IsInline;
+
+                    [FieldOffset(212)]
+                    public byte IsPure;
+
+                    [FieldOffset(213)]
+                    public byte IsDeleted;
+
+                    [FieldOffset(216)]
+                    public CppSharp.Parser.AST.CXXOperatorKind OperatorKind;
+
+                    [FieldOffset(288)]
+                    public CppSharp.Parser.AST.CallingConvention CallingConvention;
+
+                    [FieldOffset(320)]
+                    public global::System.IntPtr SpecializationInfo;
+
+                    [FieldOffset(328)]
+                    public global::System.IntPtr InstantiatedFrom;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8FunctionC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8FunctionC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8FunctionD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function13getParametersEj")]
+                    internal static extern global::System.IntPtr getParameters_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function13addParametersERPNS1_9ParameterE")]
+                    internal static extern void addParameters_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function15clearParametersEv")]
+                    internal static extern void clearParameters_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function10getMangledEv")]
+                    internal static extern global::System.IntPtr getMangled_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function10setMangledEPKc")]
+                    internal static extern void setMangled_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function12getSignatureEv")]
+                    internal static extern global::System.IntPtr getSignature_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function12setSignatureEPKc")]
+                    internal static extern void setSignature_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Function18getParametersCountEv")]
+                    internal static extern uint getParametersCount_0(global::System.IntPtr instance);
+                }
+
+                public static new Function __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Function(native.ToPointer(), skipVTables);
+                }
+
+                public static Function __CreateInstance(Function.Internal native, bool skipVTables = false)
+                {
+                    return new Function(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Function.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(336);
+                    CppSharp.Parser.AST.Function.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Function(Function.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Function(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Function()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(336);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Function(CppSharp.Parser.AST.Function _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(336);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Parameter getParameters(uint i)
+                {
+                    var __ret = Internal.getParameters_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Parameter __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Parameter.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Parameter) CppSharp.Parser.AST.Parameter.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Parameter.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addParameters(CppSharp.Parser.AST.Parameter s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addParameters_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearParameters()
+                {
+                    Internal.clearParameters_0((__Instance + __PointerAdjustment));
+                }
+
+                public string Mangled
+                {
+                    get
+                    {
+                        var __ret = Internal.getMangled_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setMangled_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public string Signature
+                {
+                    get
+                    {
+                        var __ret = Internal.getSignature_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setSignature_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public uint ParametersCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getParametersCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType ReturnType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->ReturnType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ReturnType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public bool IsReturnIndirect
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsReturnIndirect != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsReturnIndirect = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool HasThisReturn
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasThisReturn != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasThisReturn = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsVariadic
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsVariadic != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsVariadic = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsInline
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsInline != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsInline = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsPure
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsPure != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsPure = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsDeleted
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsDeleted != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsDeleted = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.CXXOperatorKind OperatorKind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->OperatorKind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->OperatorKind = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.CallingConvention CallingConvention
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->CallingConvention;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->CallingConvention = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.FunctionTemplateSpecialization SpecializationInfo
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.FunctionTemplateSpecialization __result0;
+                        if (((Internal*) __Instance)->SpecializationInfo == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.FunctionTemplateSpecialization.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->SpecializationInfo))
+                            __result0 = (CppSharp.Parser.AST.FunctionTemplateSpecialization) CppSharp.Parser.AST.FunctionTemplateSpecialization.NativeToManagedMap[((Internal*) __Instance)->SpecializationInfo];
+                        else __result0 = CppSharp.Parser.AST.FunctionTemplateSpecialization.__CreateInstance(((Internal*) __Instance)->SpecializationInfo);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->SpecializationInfo = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Function InstantiatedFrom
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Function __result0;
+                        if (((Internal*) __Instance)->InstantiatedFrom == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Function.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->InstantiatedFrom))
+                            __result0 = (CppSharp.Parser.AST.Function) CppSharp.Parser.AST.Function.NativeToManagedMap[((Internal*) __Instance)->InstantiatedFrom];
+                        else __result0 = CppSharp.Parser.AST.Function.__CreateInstance(((Internal*) __Instance)->InstantiatedFrom);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->InstantiatedFrom = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Method : CppSharp.Parser.AST.Function, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 368)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal ReturnType;
+
+                    [FieldOffset(208)]
+                    public byte IsReturnIndirect;
+
+                    [FieldOffset(209)]
+                    public byte HasThisReturn;
+
+                    [FieldOffset(210)]
+                    public byte IsVariadic;
+
+                    [FieldOffset(211)]
+                    public byte IsInline;
+
+                    [FieldOffset(212)]
+                    public byte IsPure;
+
+                    [FieldOffset(213)]
+                    public byte IsDeleted;
+
+                    [FieldOffset(216)]
+                    public CppSharp.Parser.AST.CXXOperatorKind OperatorKind;
+
+                    [FieldOffset(288)]
+                    public CppSharp.Parser.AST.CallingConvention CallingConvention;
+
+                    [FieldOffset(320)]
+                    public global::System.IntPtr SpecializationInfo;
+
+                    [FieldOffset(328)]
+                    public global::System.IntPtr InstantiatedFrom;
+
+                    [FieldOffset(336)]
+                    public byte IsVirtual;
+
+                    [FieldOffset(337)]
+                    public byte IsStatic;
+
+                    [FieldOffset(338)]
+                    public byte IsConst;
+
+                    [FieldOffset(339)]
+                    public byte IsExplicit;
+
+                    [FieldOffset(340)]
+                    public byte IsOverride;
+
+                    [FieldOffset(344)]
+                    public CppSharp.Parser.AST.CXXMethodKind MethodKind;
+
+                    [FieldOffset(348)]
+                    public byte IsDefaultConstructor;
+
+                    [FieldOffset(349)]
+                    public byte IsCopyConstructor;
+
+                    [FieldOffset(350)]
+                    public byte IsMoveConstructor;
+
+                    [FieldOffset(352)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal ConversionType;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST6MethodC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST6MethodC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST6MethodD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new Method __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Method(native.ToPointer(), skipVTables);
+                }
+
+                public static Method __CreateInstance(Method.Internal native, bool skipVTables = false)
+                {
+                    return new Method(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Method.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(368);
+                    CppSharp.Parser.AST.Method.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Method(Method.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Method(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Method()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(368);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Method(CppSharp.Parser.AST.Method _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(368);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public bool IsVirtual
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsVirtual != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsVirtual = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsStatic
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsStatic != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsStatic = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsConst
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsConst != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsConst = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsExplicit
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsExplicit != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsExplicit = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsOverride
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsOverride != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsOverride = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.CXXMethodKind MethodKind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->MethodKind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->MethodKind = value;
+                    }
+                }
+
+                public bool IsDefaultConstructor
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsDefaultConstructor != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsDefaultConstructor = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsCopyConstructor
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsCopyConstructor != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsCopyConstructor = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsMoveConstructor
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsMoveConstructor != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsMoveConstructor = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType ConversionType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->ConversionType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ConversionType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class Enumeration : CppSharp.Parser.AST.DeclarationContext, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 504)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [FieldOffset(460)]
+                    public CppSharp.Parser.AST.Enumeration.EnumModifiers Modifiers;
+
+                    [FieldOffset(464)]
+                    public global::System.IntPtr Type;
+
+                    [FieldOffset(472)]
+                    public global::System.IntPtr BuiltinType;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11EnumerationC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11EnumerationC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11EnumerationD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8getItemsEj")]
+                    internal static extern global::System.IntPtr getItems_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration8addItemsERPNS2_4ItemE")]
+                    internal static extern void addItems_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration10clearItemsEv")]
+                    internal static extern void clearItems_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration13getItemsCountEv")]
+                    internal static extern uint getItemsCount_0(global::System.IntPtr instance);
+                }
+
+                [Flags]
+                public enum EnumModifiers
+                {
+                    Anonymous = 1,
+                    Scoped = 2,
+                    Flags = 4
+                }
+
+                public unsafe partial class Item : CppSharp.Parser.AST.Declaration, IDisposable
+                {
+                    [StructLayout(LayoutKind.Explicit, Size = 232)]
+                    public new partial struct Internal
+                    {
+                        [FieldOffset(0)]
+                        public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                        [FieldOffset(4)]
+                        public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                        [FieldOffset(8)]
+                        public global::System.IntPtr _Namespace;
+
+                        [FieldOffset(16)]
+                        public CppSharp.Parser.SourceLocation.Internal Location;
+
+                        [FieldOffset(20)]
+                        public int LineNumberStart;
+
+                        [FieldOffset(24)]
+                        public int LineNumberEnd;
+
+                        [FieldOffset(128)]
+                        public byte IsIncomplete;
+
+                        [FieldOffset(129)]
+                        public byte IsDependent;
+
+                        [FieldOffset(130)]
+                        public byte IsImplicit;
+
+                        [FieldOffset(136)]
+                        public global::System.IntPtr CompleteDeclaration;
+
+                        [FieldOffset(144)]
+                        public uint DefinitionOrder;
+
+                        [FieldOffset(176)]
+                        public global::System.IntPtr OriginalPtr;
+
+                        [FieldOffset(184)]
+                        public global::System.IntPtr Comment;
+
+                        [FieldOffset(224)]
+                        public ulong Value;
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration4ItemC2Ev")]
+                        internal static extern void ctor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration4ItemC2ERKS3_")]
+                        internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration4ItemD2Ev")]
+                        internal static extern void dtor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration4Item13getExpressionEv")]
+                        internal static extern global::System.IntPtr getExpression_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST11Enumeration4Item13setExpressionEPKc")]
+                        internal static extern void setExpression_0(global::System.IntPtr instance, global::System.IntPtr s);
+                    }
+
+                    public static new Item __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                    {
+                        return new Item(native.ToPointer(), skipVTables);
+                    }
+
+                    public static Item __CreateInstance(Item.Internal native, bool skipVTables = false)
+                    {
+                        return new Item(native, skipVTables);
+                    }
+
+                    private static void* __CopyValue(Item.Internal native)
+                    {
+                        var ret = Marshal.AllocHGlobal(232);
+                        CppSharp.Parser.AST.Enumeration.Item.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                        return ret.ToPointer();
+                    }
+
+                    private Item(Item.Internal native, bool skipVTables = false)
+                        : this(__CopyValue(native), skipVTables)
+                    {
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                    }
+
+                    protected Item(void* native, bool skipVTables = false)
+                        : base((void*) null)
+                    {
+                        __PointerAdjustment = 0;
+                        if (native == null)
+                            return;
+                        __Instance = new global::System.IntPtr(native);
+                    }
+
+                    public Item()
+                        : this((void*) null)
+                    {
+                        __Instance = Marshal.AllocHGlobal(232);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        Internal.ctor_0((__Instance + __PointerAdjustment));
+                    }
+
+                    public Item(CppSharp.Parser.AST.Enumeration.Item _0)
+                        : this((void*) null)
+                    {
+                        __Instance = Marshal.AllocHGlobal(232);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        if (ReferenceEquals(_0, null))
+                            throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                        var __arg0 = _0.__Instance;
+                        Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                    }
+
+                    protected override void Dispose(bool disposing)
+                    {
+                        CppSharp.Parser.AST.Declaration __dummy;
+                        NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                        Internal.dtor_0((__Instance + __PointerAdjustment));
+                        if (__ownsNativeInstance)
+                            Marshal.FreeHGlobal(__Instance);
+                    }
+
+                    public string Expression
+                    {
+                        get
+                        {
+                            var __ret = Internal.getExpression_0((__Instance + __PointerAdjustment));
+                            return Marshal.PtrToStringAnsi(__ret);
+                        }
+
+                        set
+                        {
+                            var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                            Internal.setExpression_0((__Instance + __PointerAdjustment), __arg0);
+                            Marshal.FreeHGlobal(__arg0);
+                        }
+                    }
+
+                    public ulong Value
+                    {
+                        get
+                        {
+                            return ((Internal*) __Instance)->Value;
+                        }
+
+                        set
+                        {
+                            ((Internal*) __Instance)->Value = value;
+                        }
+                    }
+                }
+
+                public static new Enumeration __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Enumeration(native.ToPointer(), skipVTables);
+                }
+
+                public static Enumeration __CreateInstance(Enumeration.Internal native, bool skipVTables = false)
+                {
+                    return new Enumeration(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Enumeration.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(504);
+                    CppSharp.Parser.AST.Enumeration.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Enumeration(Enumeration.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Enumeration(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Enumeration()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(504);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Enumeration(CppSharp.Parser.AST.Enumeration _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(504);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Enumeration.Item getItems(uint i)
+                {
+                    var __ret = Internal.getItems_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Enumeration.Item __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Enumeration.Item) CppSharp.Parser.AST.Enumeration.Item.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Enumeration.Item.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addItems(CppSharp.Parser.AST.Enumeration.Item s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addItems_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearItems()
+                {
+                    Internal.clearItems_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ItemsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getItemsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Enumeration.EnumModifiers Modifiers
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Modifiers;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Modifiers = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Type Type
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Type == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Type))
+                            __result0 = (CppSharp.Parser.AST.Type) CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Type];
+                        else __result0 = CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Type);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.BuiltinType BuiltinType
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.BuiltinType __result0;
+                        if (((Internal*) __Instance)->BuiltinType == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.BuiltinType.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->BuiltinType))
+                            __result0 = (CppSharp.Parser.AST.BuiltinType) CppSharp.Parser.AST.BuiltinType.NativeToManagedMap[((Internal*) __Instance)->BuiltinType];
+                        else __result0 = CppSharp.Parser.AST.BuiltinType.__CreateInstance(((Internal*) __Instance)->BuiltinType);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->BuiltinType = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Variable : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 240)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(224)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8VariableC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8VariableC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8VariableD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Variable10getMangledEv")]
+                    internal static extern global::System.IntPtr getMangled_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Variable10setMangledEPKc")]
+                    internal static extern void setMangled_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new Variable __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Variable(native.ToPointer(), skipVTables);
+                }
+
+                public static Variable __CreateInstance(Variable.Internal native, bool skipVTables = false)
+                {
+                    return new Variable(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Variable.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(240);
+                    CppSharp.Parser.AST.Variable.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Variable(Variable.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Variable(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Variable()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(240);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Variable(CppSharp.Parser.AST.Variable _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(240);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Mangled
+                {
+                    get
+                    {
+                        var __ret = Internal.getMangled_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setMangled_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class BaseClassSpecifier : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 24)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(4)]
+                    public byte IsVirtual;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr Type;
+
+                    [FieldOffset(16)]
+                    public int Offset;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18BaseClassSpecifierC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18BaseClassSpecifierC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, BaseClassSpecifier> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, BaseClassSpecifier>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static BaseClassSpecifier __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new BaseClassSpecifier(native.ToPointer(), skipVTables);
+                }
+
+                public static BaseClassSpecifier __CreateInstance(BaseClassSpecifier.Internal native, bool skipVTables = false)
+                {
+                    return new BaseClassSpecifier(native, skipVTables);
+                }
+
+                private static void* __CopyValue(BaseClassSpecifier.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(24);
+                    *(BaseClassSpecifier.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private BaseClassSpecifier(BaseClassSpecifier.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected BaseClassSpecifier(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public BaseClassSpecifier()
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public BaseClassSpecifier(CppSharp.Parser.AST.BaseClassSpecifier _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((BaseClassSpecifier.Internal*) __Instance) = *((BaseClassSpecifier.Internal*) _0.__Instance);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.BaseClassSpecifier __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.AccessSpecifier Access
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Access;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Access = value;
+                    }
+                }
+
+                public bool IsVirtual
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsVirtual != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsVirtual = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.Type Type
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Type __result0;
+                        if (((Internal*) __Instance)->Type == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Type.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Type))
+                            __result0 = (CppSharp.Parser.AST.Type) CppSharp.Parser.AST.Type.NativeToManagedMap[((Internal*) __Instance)->Type];
+                        else __result0 = CppSharp.Parser.AST.Type.__CreateInstance(((Internal*) __Instance)->Type);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Type = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public int Offset
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Offset;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Offset = value;
+                    }
+                }
+            }
+
+            public unsafe partial class Field : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 224)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal QualifiedType;
+
+                    [FieldOffset(208)]
+                    public global::System.IntPtr Class;
+
+                    [FieldOffset(216)]
+                    public byte IsBitField;
+
+                    [FieldOffset(220)]
+                    public uint BitWidth;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5FieldC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5FieldD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new Field __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Field(native.ToPointer(), skipVTables);
+                }
+
+                public static Field __CreateInstance(Field.Internal native, bool skipVTables = false)
+                {
+                    return new Field(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Field.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(224);
+                    CppSharp.Parser.AST.Field.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Field(Field.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Field(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Field()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Field(CppSharp.Parser.AST.Field _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType QualifiedType
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->QualifiedType);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->QualifiedType = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+
+                public CppSharp.Parser.AST.Class Class
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Class __result0;
+                        if (((Internal*) __Instance)->Class == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Class.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Class))
+                            __result0 = (CppSharp.Parser.AST.Class) CppSharp.Parser.AST.Class.NativeToManagedMap[((Internal*) __Instance)->Class];
+                        else __result0 = CppSharp.Parser.AST.Class.__CreateInstance(((Internal*) __Instance)->Class);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Class = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public bool IsBitField
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsBitField != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsBitField = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public uint BitWidth
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->BitWidth;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->BitWidth = value;
+                    }
+                }
+            }
+
+            public unsafe partial class AccessSpecifierDecl : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 192)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19AccessSpecifierDeclC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19AccessSpecifierDeclC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19AccessSpecifierDeclD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new AccessSpecifierDecl __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new AccessSpecifierDecl(native.ToPointer(), skipVTables);
+                }
+
+                public static AccessSpecifierDecl __CreateInstance(AccessSpecifierDecl.Internal native, bool skipVTables = false)
+                {
+                    return new AccessSpecifierDecl(native, skipVTables);
+                }
+
+                private static void* __CopyValue(AccessSpecifierDecl.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(192);
+                    CppSharp.Parser.AST.AccessSpecifierDecl.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private AccessSpecifierDecl(AccessSpecifierDecl.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected AccessSpecifierDecl(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public AccessSpecifierDecl()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(192);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public AccessSpecifierDecl(CppSharp.Parser.AST.AccessSpecifierDecl _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(192);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+            }
+
+            public unsafe partial class Class : CppSharp.Parser.AST.DeclarationContext, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 584)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [FieldOffset(560)]
+                    public byte IsPOD;
+
+                    [FieldOffset(561)]
+                    public byte IsAbstract;
+
+                    [FieldOffset(562)]
+                    public byte IsUnion;
+
+                    [FieldOffset(563)]
+                    public byte IsDynamic;
+
+                    [FieldOffset(564)]
+                    public byte IsPolymorphic;
+
+                    [FieldOffset(565)]
+                    public byte HasNonTrivialDefaultConstructor;
+
+                    [FieldOffset(566)]
+                    public byte HasNonTrivialCopyConstructor;
+
+                    [FieldOffset(567)]
+                    public byte HasNonTrivialDestructor;
+
+                    [FieldOffset(568)]
+                    public byte IsExternCContext;
+
+                    [FieldOffset(576)]
+                    public global::System.IntPtr Layout;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5ClassC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5ClassC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5ClassD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class8getBasesEj")]
+                    internal static extern global::System.IntPtr getBases_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class8addBasesERPNS1_18BaseClassSpecifierE")]
+                    internal static extern void addBases_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class10clearBasesEv")]
+                    internal static extern void clearBases_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class9getFieldsEj")]
+                    internal static extern global::System.IntPtr getFields_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class9addFieldsERPNS1_5FieldE")]
+                    internal static extern void addFields_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class11clearFieldsEv")]
+                    internal static extern void clearFields_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class10getMethodsEj")]
+                    internal static extern global::System.IntPtr getMethods_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class10addMethodsERPNS1_6MethodE")]
+                    internal static extern void addMethods_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class12clearMethodsEv")]
+                    internal static extern void clearMethods_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class13getSpecifiersEj")]
+                    internal static extern global::System.IntPtr getSpecifiers_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class13addSpecifiersERPNS1_19AccessSpecifierDeclE")]
+                    internal static extern void addSpecifiers_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class15clearSpecifiersEv")]
+                    internal static extern void clearSpecifiers_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class13getBasesCountEv")]
+                    internal static extern uint getBasesCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class14getFieldsCountEv")]
+                    internal static extern uint getFieldsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class15getMethodsCountEv")]
+                    internal static extern uint getMethodsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST5Class18getSpecifiersCountEv")]
+                    internal static extern uint getSpecifiersCount_0(global::System.IntPtr instance);
+                }
+
+                public static new Class __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Class(native.ToPointer(), skipVTables);
+                }
+
+                public static Class __CreateInstance(Class.Internal native, bool skipVTables = false)
+                {
+                    return new Class(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Class.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(584);
+                    CppSharp.Parser.AST.Class.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Class(Class.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Class(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Class()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(584);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Class(CppSharp.Parser.AST.Class _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(584);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.BaseClassSpecifier getBases(uint i)
+                {
+                    var __ret = Internal.getBases_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.BaseClassSpecifier __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.BaseClassSpecifier.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.BaseClassSpecifier) CppSharp.Parser.AST.BaseClassSpecifier.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.BaseClassSpecifier.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addBases(CppSharp.Parser.AST.BaseClassSpecifier s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addBases_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearBases()
+                {
+                    Internal.clearBases_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Field getFields(uint i)
+                {
+                    var __ret = Internal.getFields_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Field __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Field.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Field) CppSharp.Parser.AST.Field.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Field.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addFields(CppSharp.Parser.AST.Field s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addFields_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearFields()
+                {
+                    Internal.clearFields_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.Method getMethods(uint i)
+                {
+                    var __ret = Internal.getMethods_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Method __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Method.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Method) CppSharp.Parser.AST.Method.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Method.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addMethods(CppSharp.Parser.AST.Method s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addMethods_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearMethods()
+                {
+                    Internal.clearMethods_0((__Instance + __PointerAdjustment));
+                }
+
+                public CppSharp.Parser.AST.AccessSpecifierDecl getSpecifiers(uint i)
+                {
+                    var __ret = Internal.getSpecifiers_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.AccessSpecifierDecl __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.AccessSpecifierDecl.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.AccessSpecifierDecl) CppSharp.Parser.AST.AccessSpecifierDecl.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.AccessSpecifierDecl.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addSpecifiers(CppSharp.Parser.AST.AccessSpecifierDecl s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addSpecifiers_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearSpecifiers()
+                {
+                    Internal.clearSpecifiers_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint BasesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getBasesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint FieldsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getFieldsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint MethodsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getMethodsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint SpecifiersCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getSpecifiersCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public bool IsPOD
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsPOD != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsPOD = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsAbstract
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsAbstract != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsAbstract = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsUnion
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsUnion != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsUnion = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsDynamic
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsDynamic != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsDynamic = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsPolymorphic
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsPolymorphic != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsPolymorphic = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool HasNonTrivialDefaultConstructor
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasNonTrivialDefaultConstructor != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasNonTrivialDefaultConstructor = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool HasNonTrivialCopyConstructor
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasNonTrivialCopyConstructor != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasNonTrivialCopyConstructor = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool HasNonTrivialDestructor
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasNonTrivialDestructor != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasNonTrivialDestructor = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsExternCContext
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsExternCContext != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsExternCContext = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.ClassLayout Layout
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.ClassLayout __result0;
+                        if (((Internal*) __Instance)->Layout == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.ClassLayout.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Layout))
+                            __result0 = (CppSharp.Parser.AST.ClassLayout) CppSharp.Parser.AST.ClassLayout.NativeToManagedMap[((Internal*) __Instance)->Layout];
+                        else __result0 = CppSharp.Parser.AST.ClassLayout.__CreateInstance(((Internal*) __Instance)->Layout);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Layout = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class Template : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 224)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8TemplateC2ENS1_15DeclarationKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.DeclarationKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8TemplateC2Ev")]
+                    internal static extern void ctor_1(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8TemplateC2ERKS2_")]
+                    internal static extern void cctor_3(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8TemplateD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Template13getParametersEj")]
+                    internal static extern global::System.IntPtr getParameters_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Template13addParametersERPNS1_11DeclarationE")]
+                    internal static extern void addParameters_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Template15clearParametersEv")]
+                    internal static extern void clearParameters_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST8Template18getParametersCountEv")]
+                    internal static extern uint getParametersCount_0(global::System.IntPtr instance);
+                }
+
+                public static new Template __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Template(native.ToPointer(), skipVTables);
+                }
+
+                public static Template __CreateInstance(Template.Internal native, bool skipVTables = false)
+                {
+                    return new Template(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Template.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(224);
+                    CppSharp.Parser.AST.Template.Internal.cctor_3(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Template(Template.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Template(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Template(CppSharp.Parser.AST.DeclarationKind kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public Template()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_1((__Instance + __PointerAdjustment));
+                }
+
+                public Template(CppSharp.Parser.AST.Template _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_3((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Declaration getParameters(uint i)
+                {
+                    var __ret = Internal.getParameters_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.Declaration __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addParameters(CppSharp.Parser.AST.Declaration s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addParameters_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearParameters()
+                {
+                    Internal.clearParameters_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ParametersCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getParametersCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Declaration TemplatedDecl
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Declaration __result0;
+                        if (((Internal*) __Instance)->TemplatedDecl == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Declaration.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->TemplatedDecl))
+                            __result0 = (CppSharp.Parser.AST.Declaration) CppSharp.Parser.AST.Declaration.NativeToManagedMap[((Internal*) __Instance)->TemplatedDecl];
+                        else __result0 = CppSharp.Parser.AST.Declaration.__CreateInstance(((Internal*) __Instance)->TemplatedDecl);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->TemplatedDecl = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class TypeAliasTemplate : CppSharp.Parser.AST.Template, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 224)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17TypeAliasTemplateC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17TypeAliasTemplateC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17TypeAliasTemplateD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TypeAliasTemplate __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypeAliasTemplate(native.ToPointer(), skipVTables);
+                }
+
+                public static TypeAliasTemplate __CreateInstance(TypeAliasTemplate.Internal native, bool skipVTables = false)
+                {
+                    return new TypeAliasTemplate(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypeAliasTemplate.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(224);
+                    CppSharp.Parser.AST.TypeAliasTemplate.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TypeAliasTemplate(TypeAliasTemplate.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypeAliasTemplate(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypeAliasTemplate()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TypeAliasTemplate(CppSharp.Parser.AST.TypeAliasTemplate _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+            }
+
+            public unsafe partial class TemplateParameter : CppSharp.Parser.AST.Declaration, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 208)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public uint Depth;
+
+                    [FieldOffset(196)]
+                    public uint Index;
+
+                    [FieldOffset(200)]
+                    public byte IsParameterPack;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17TemplateParameterC2ENS1_15DeclarationKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.DeclarationKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17TemplateParameterC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17TemplateParameterD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TemplateParameter __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TemplateParameter(native.ToPointer(), skipVTables);
+                }
+
+                public static TemplateParameter __CreateInstance(TemplateParameter.Internal native, bool skipVTables = false)
+                {
+                    return new TemplateParameter(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TemplateParameter.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(208);
+                    CppSharp.Parser.AST.TemplateParameter.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TemplateParameter(TemplateParameter.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TemplateParameter(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TemplateParameter(CppSharp.Parser.AST.DeclarationKind kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(208);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public TemplateParameter(CppSharp.Parser.AST.TemplateParameter _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(208);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public uint Depth
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Depth;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Depth = value;
+                    }
+                }
+
+                public uint Index
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Index;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Index = value;
+                    }
+                }
+
+                public bool IsParameterPack
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsParameterPack != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsParameterPack = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class TemplateTemplateParameter : CppSharp.Parser.AST.Template, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 232)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [FieldOffset(224)]
+                    public byte IsParameterPack;
+
+                    [FieldOffset(225)]
+                    public byte IsPackExpansion;
+
+                    [FieldOffset(226)]
+                    public byte IsExpandedParameterPack;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST25TemplateTemplateParameterC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST25TemplateTemplateParameterC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST25TemplateTemplateParameterD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TemplateTemplateParameter __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TemplateTemplateParameter(native.ToPointer(), skipVTables);
+                }
+
+                public static TemplateTemplateParameter __CreateInstance(TemplateTemplateParameter.Internal native, bool skipVTables = false)
+                {
+                    return new TemplateTemplateParameter(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TemplateTemplateParameter.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(232);
+                    CppSharp.Parser.AST.TemplateTemplateParameter.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TemplateTemplateParameter(TemplateTemplateParameter.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TemplateTemplateParameter(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TemplateTemplateParameter()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(232);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TemplateTemplateParameter(CppSharp.Parser.AST.TemplateTemplateParameter _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(232);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public bool IsParameterPack
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsParameterPack != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsParameterPack = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsPackExpansion
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsPackExpansion != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsPackExpansion = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsExpandedParameterPack
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsExpandedParameterPack != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsExpandedParameterPack = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class TypeTemplateParameter : CppSharp.Parser.AST.TemplateParameter, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 224)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public uint Depth;
+
+                    [FieldOffset(196)]
+                    public uint Index;
+
+                    [FieldOffset(200)]
+                    public byte IsParameterPack;
+
+                    [FieldOffset(208)]
+                    public CppSharp.Parser.AST.QualifiedType.Internal DefaultArgument;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21TypeTemplateParameterC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21TypeTemplateParameterC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST21TypeTemplateParameterD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new TypeTemplateParameter __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TypeTemplateParameter(native.ToPointer(), skipVTables);
+                }
+
+                public static TypeTemplateParameter __CreateInstance(TypeTemplateParameter.Internal native, bool skipVTables = false)
+                {
+                    return new TypeTemplateParameter(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TypeTemplateParameter.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(224);
+                    CppSharp.Parser.AST.TypeTemplateParameter.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TypeTemplateParameter(TypeTemplateParameter.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TypeTemplateParameter(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TypeTemplateParameter()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TypeTemplateParameter(CppSharp.Parser.AST.TypeTemplateParameter _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.QualifiedType DefaultArgument
+                {
+                    get
+                    {
+                        return CppSharp.Parser.AST.QualifiedType.__CreateInstance(((Internal*) __Instance)->DefaultArgument);
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->DefaultArgument = ReferenceEquals(value, null) ? new CppSharp.Parser.AST.QualifiedType.Internal() : *(CppSharp.Parser.AST.QualifiedType.Internal*) (value.__Instance);
+                    }
+                }
+            }
+
+            public unsafe partial class NonTypeTemplateParameter : CppSharp.Parser.AST.TemplateParameter, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 224)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public uint Depth;
+
+                    [FieldOffset(196)]
+                    public uint Index;
+
+                    [FieldOffset(200)]
+                    public byte IsParameterPack;
+
+                    [FieldOffset(208)]
+                    public global::System.IntPtr DefaultArgument;
+
+                    [FieldOffset(216)]
+                    public uint Position;
+
+                    [FieldOffset(220)]
+                    public byte IsPackExpansion;
+
+                    [FieldOffset(221)]
+                    public byte IsExpandedParameterPack;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24NonTypeTemplateParameterC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24NonTypeTemplateParameterC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24NonTypeTemplateParameterD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new NonTypeTemplateParameter __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new NonTypeTemplateParameter(native.ToPointer(), skipVTables);
+                }
+
+                public static NonTypeTemplateParameter __CreateInstance(NonTypeTemplateParameter.Internal native, bool skipVTables = false)
+                {
+                    return new NonTypeTemplateParameter(native, skipVTables);
+                }
+
+                private static void* __CopyValue(NonTypeTemplateParameter.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(224);
+                    CppSharp.Parser.AST.NonTypeTemplateParameter.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private NonTypeTemplateParameter(NonTypeTemplateParameter.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected NonTypeTemplateParameter(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public NonTypeTemplateParameter()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public NonTypeTemplateParameter(CppSharp.Parser.AST.NonTypeTemplateParameter _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(224);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.Expression DefaultArgument
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Expression __result0;
+                        if (((Internal*) __Instance)->DefaultArgument == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Expression.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->DefaultArgument))
+                            __result0 = (CppSharp.Parser.AST.Expression) CppSharp.Parser.AST.Expression.NativeToManagedMap[((Internal*) __Instance)->DefaultArgument];
+                        else __result0 = CppSharp.Parser.AST.Expression.__CreateInstance(((Internal*) __Instance)->DefaultArgument);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->DefaultArgument = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public uint Position
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Position;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Position = value;
+                    }
+                }
+
+                public bool IsPackExpansion
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsPackExpansion != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsPackExpansion = (byte) (value ? 1 : 0);
+                    }
+                }
+
+                public bool IsExpandedParameterPack
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsExpandedParameterPack != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsExpandedParameterPack = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class ClassTemplate : CppSharp.Parser.AST.Template, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 248)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplateC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplateC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplateD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplate18getSpecializationsEj")]
+                    internal static extern global::System.IntPtr getSpecializations_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplate18addSpecializationsERPNS1_27ClassTemplateSpecializationE")]
+                    internal static extern void addSpecializations_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplate20clearSpecializationsEv")]
+                    internal static extern void clearSpecializations_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13ClassTemplate23getSpecializationsCountEv")]
+                    internal static extern uint getSpecializationsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new ClassTemplate __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ClassTemplate(native.ToPointer(), skipVTables);
+                }
+
+                public static ClassTemplate __CreateInstance(ClassTemplate.Internal native, bool skipVTables = false)
+                {
+                    return new ClassTemplate(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ClassTemplate.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(248);
+                    CppSharp.Parser.AST.ClassTemplate.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ClassTemplate(ClassTemplate.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ClassTemplate(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ClassTemplate()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(248);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ClassTemplate(CppSharp.Parser.AST.ClassTemplate _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(248);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.ClassTemplateSpecialization getSpecializations(uint i)
+                {
+                    var __ret = Internal.getSpecializations_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.ClassTemplateSpecialization __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.ClassTemplateSpecialization.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.ClassTemplateSpecialization) CppSharp.Parser.AST.ClassTemplateSpecialization.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.ClassTemplateSpecialization.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addSpecializations(CppSharp.Parser.AST.ClassTemplateSpecialization s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addSpecializations_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearSpecializations()
+                {
+                    Internal.clearSpecializations_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint SpecializationsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getSpecializationsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class ClassTemplateSpecialization : CppSharp.Parser.AST.Class, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 624)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [FieldOffset(560)]
+                    public byte IsPOD;
+
+                    [FieldOffset(561)]
+                    public byte IsAbstract;
+
+                    [FieldOffset(562)]
+                    public byte IsUnion;
+
+                    [FieldOffset(563)]
+                    public byte IsDynamic;
+
+                    [FieldOffset(564)]
+                    public byte IsPolymorphic;
+
+                    [FieldOffset(565)]
+                    public byte HasNonTrivialDefaultConstructor;
+
+                    [FieldOffset(566)]
+                    public byte HasNonTrivialCopyConstructor;
+
+                    [FieldOffset(567)]
+                    public byte HasNonTrivialDestructor;
+
+                    [FieldOffset(568)]
+                    public byte IsExternCContext;
+
+                    [FieldOffset(576)]
+                    public global::System.IntPtr Layout;
+
+                    [FieldOffset(584)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [FieldOffset(616)]
+                    public CppSharp.Parser.AST.TemplateSpecializationKind SpecializationKind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecializationC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecializationC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecializationD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecialization12getArgumentsEj")]
+                    internal static extern void getArguments_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecialization12addArgumentsERNS1_16TemplateArgumentE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecialization14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST27ClassTemplateSpecialization17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new ClassTemplateSpecialization __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ClassTemplateSpecialization(native.ToPointer(), skipVTables);
+                }
+
+                public static ClassTemplateSpecialization __CreateInstance(ClassTemplateSpecialization.Internal native, bool skipVTables = false)
+                {
+                    return new ClassTemplateSpecialization(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ClassTemplateSpecialization.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(624);
+                    CppSharp.Parser.AST.ClassTemplateSpecialization.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ClassTemplateSpecialization(ClassTemplateSpecialization.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ClassTemplateSpecialization(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ClassTemplateSpecialization()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(624);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ClassTemplateSpecialization(CppSharp.Parser.AST.ClassTemplateSpecialization _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(624);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TemplateArgument getArguments(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.TemplateArgument.Internal();
+                    Internal.getArguments_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.TemplateArgument.__CreateInstance(__ret);
+                }
+
+                public void addArguments(CppSharp.Parser.AST.TemplateArgument s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.ClassTemplate TemplatedDecl
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.ClassTemplate __result0;
+                        if (((Internal*) __Instance)->TemplatedDecl == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.ClassTemplate.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->TemplatedDecl))
+                            __result0 = (CppSharp.Parser.AST.ClassTemplate) CppSharp.Parser.AST.ClassTemplate.NativeToManagedMap[((Internal*) __Instance)->TemplatedDecl];
+                        else __result0 = CppSharp.Parser.AST.ClassTemplate.__CreateInstance(((Internal*) __Instance)->TemplatedDecl);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->TemplatedDecl = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.TemplateSpecializationKind SpecializationKind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->SpecializationKind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->SpecializationKind = value;
+                    }
+                }
+            }
+
+            public unsafe partial class ClassTemplatePartialSpecialization : CppSharp.Parser.AST.ClassTemplateSpecialization, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 624)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [FieldOffset(560)]
+                    public byte IsPOD;
+
+                    [FieldOffset(561)]
+                    public byte IsAbstract;
+
+                    [FieldOffset(562)]
+                    public byte IsUnion;
+
+                    [FieldOffset(563)]
+                    public byte IsDynamic;
+
+                    [FieldOffset(564)]
+                    public byte IsPolymorphic;
+
+                    [FieldOffset(565)]
+                    public byte HasNonTrivialDefaultConstructor;
+
+                    [FieldOffset(566)]
+                    public byte HasNonTrivialCopyConstructor;
+
+                    [FieldOffset(567)]
+                    public byte HasNonTrivialDestructor;
+
+                    [FieldOffset(568)]
+                    public byte IsExternCContext;
+
+                    [FieldOffset(576)]
+                    public global::System.IntPtr Layout;
+
+                    [FieldOffset(584)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [FieldOffset(616)]
+                    public CppSharp.Parser.AST.TemplateSpecializationKind SpecializationKind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST34ClassTemplatePartialSpecializationC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST34ClassTemplatePartialSpecializationC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST34ClassTemplatePartialSpecializationD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new ClassTemplatePartialSpecialization __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ClassTemplatePartialSpecialization(native.ToPointer(), skipVTables);
+                }
+
+                public static ClassTemplatePartialSpecialization __CreateInstance(ClassTemplatePartialSpecialization.Internal native, bool skipVTables = false)
+                {
+                    return new ClassTemplatePartialSpecialization(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ClassTemplatePartialSpecialization.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(624);
+                    CppSharp.Parser.AST.ClassTemplatePartialSpecialization.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ClassTemplatePartialSpecialization(ClassTemplatePartialSpecialization.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ClassTemplatePartialSpecialization(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ClassTemplatePartialSpecialization()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(624);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ClassTemplatePartialSpecialization(CppSharp.Parser.AST.ClassTemplatePartialSpecialization _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(624);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+            }
+
+            public unsafe partial class FunctionTemplate : CppSharp.Parser.AST.Template, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 248)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(192)]
+                    public global::System.IntPtr TemplatedDecl;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplateC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplateC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplateD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplate18getSpecializationsEj")]
+                    internal static extern global::System.IntPtr getSpecializations_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplate18addSpecializationsERPNS1_30FunctionTemplateSpecializationE")]
+                    internal static extern void addSpecializations_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplate20clearSpecializationsEv")]
+                    internal static extern void clearSpecializations_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16FunctionTemplate23getSpecializationsCountEv")]
+                    internal static extern uint getSpecializationsCount_0(global::System.IntPtr instance);
+                }
+
+                public static new FunctionTemplate __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new FunctionTemplate(native.ToPointer(), skipVTables);
+                }
+
+                public static FunctionTemplate __CreateInstance(FunctionTemplate.Internal native, bool skipVTables = false)
+                {
+                    return new FunctionTemplate(native, skipVTables);
+                }
+
+                private static void* __CopyValue(FunctionTemplate.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(248);
+                    CppSharp.Parser.AST.FunctionTemplate.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private FunctionTemplate(FunctionTemplate.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected FunctionTemplate(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public FunctionTemplate()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(248);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public FunctionTemplate(CppSharp.Parser.AST.FunctionTemplate _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(248);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.FunctionTemplateSpecialization getSpecializations(uint i)
+                {
+                    var __ret = Internal.getSpecializations_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.FunctionTemplateSpecialization __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.FunctionTemplateSpecialization.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.FunctionTemplateSpecialization) CppSharp.Parser.AST.FunctionTemplateSpecialization.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.FunctionTemplateSpecialization.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addSpecializations(CppSharp.Parser.AST.FunctionTemplateSpecialization s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addSpecializations_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearSpecializations()
+                {
+                    Internal.clearSpecializations_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint SpecializationsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getSpecializationsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class FunctionTemplateSpecialization : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 48)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public global::System.IntPtr Template;
+
+                    [FieldOffset(32)]
+                    public global::System.IntPtr SpecializedFunction;
+
+                    [FieldOffset(40)]
+                    public CppSharp.Parser.AST.TemplateSpecializationKind SpecializationKind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecializationC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecializationC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecializationD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecialization12getArgumentsEj")]
+                    internal static extern void getArguments_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecialization12addArgumentsERNS1_16TemplateArgumentE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecialization14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST30FunctionTemplateSpecialization17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, FunctionTemplateSpecialization> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, FunctionTemplateSpecialization>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static FunctionTemplateSpecialization __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new FunctionTemplateSpecialization(native.ToPointer(), skipVTables);
+                }
+
+                public static FunctionTemplateSpecialization __CreateInstance(FunctionTemplateSpecialization.Internal native, bool skipVTables = false)
+                {
+                    return new FunctionTemplateSpecialization(native, skipVTables);
+                }
+
+                private static void* __CopyValue(FunctionTemplateSpecialization.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(48);
+                    CppSharp.Parser.AST.FunctionTemplateSpecialization.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private FunctionTemplateSpecialization(FunctionTemplateSpecialization.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected FunctionTemplateSpecialization(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public FunctionTemplateSpecialization()
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public FunctionTemplateSpecialization(CppSharp.Parser.AST.FunctionTemplateSpecialization _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.FunctionTemplateSpecialization __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TemplateArgument getArguments(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.TemplateArgument.Internal();
+                    Internal.getArguments_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.TemplateArgument.__CreateInstance(__ret);
+                }
+
+                public void addArguments(CppSharp.Parser.AST.TemplateArgument s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.FunctionTemplate Template
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.FunctionTemplate __result0;
+                        if (((Internal*) __Instance)->Template == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.FunctionTemplate.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Template))
+                            __result0 = (CppSharp.Parser.AST.FunctionTemplate) CppSharp.Parser.AST.FunctionTemplate.NativeToManagedMap[((Internal*) __Instance)->Template];
+                        else __result0 = CppSharp.Parser.AST.FunctionTemplate.__CreateInstance(((Internal*) __Instance)->Template);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Template = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.Function SpecializedFunction
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.Function __result0;
+                        if (((Internal*) __Instance)->SpecializedFunction == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.Function.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->SpecializedFunction))
+                            __result0 = (CppSharp.Parser.AST.Function) CppSharp.Parser.AST.Function.NativeToManagedMap[((Internal*) __Instance)->SpecializedFunction];
+                        else __result0 = CppSharp.Parser.AST.Function.__CreateInstance(((Internal*) __Instance)->SpecializedFunction);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->SpecializedFunction = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+
+                public CppSharp.Parser.AST.TemplateSpecializationKind SpecializationKind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->SpecializationKind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->SpecializationKind = value;
+                    }
+                }
+            }
+
+            public unsafe partial class Namespace : CppSharp.Parser.AST.DeclarationContext, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 464)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [FieldOffset(457)]
+                    public byte IsInline;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9NamespaceC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9NamespaceC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST9NamespaceD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public static new Namespace __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Namespace(native.ToPointer(), skipVTables);
+                }
+
+                public static Namespace __CreateInstance(Namespace.Internal native, bool skipVTables = false)
+                {
+                    return new Namespace(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Namespace.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(464);
+                    CppSharp.Parser.AST.Namespace.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private Namespace(Namespace.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Namespace(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Namespace()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(464);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public Namespace(CppSharp.Parser.AST.Namespace _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(464);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public bool IsInline
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsInline != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsInline = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class PreprocessedEntity : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 24)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.MacroLocation MacroLocation;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18PreprocessedEntityC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST18PreprocessedEntityC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, PreprocessedEntity> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, PreprocessedEntity>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static PreprocessedEntity __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new PreprocessedEntity(native.ToPointer(), skipVTables);
+                }
+
+                public static PreprocessedEntity __CreateInstance(PreprocessedEntity.Internal native, bool skipVTables = false)
+                {
+                    return new PreprocessedEntity(native, skipVTables);
+                }
+
+                private static void* __CopyValue(PreprocessedEntity.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(24);
+                    *(PreprocessedEntity.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private PreprocessedEntity(PreprocessedEntity.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected PreprocessedEntity(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public PreprocessedEntity()
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public PreprocessedEntity(CppSharp.Parser.AST.PreprocessedEntity _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((PreprocessedEntity.Internal*) __Instance) = *((PreprocessedEntity.Internal*) _0.__Instance);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.PreprocessedEntity __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.MacroLocation MacroLocation
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->MacroLocation;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->MacroLocation = value;
+                    }
+                }
+
+                public global::System.IntPtr OriginalPtr
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->OriginalPtr;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->OriginalPtr = (global::System.IntPtr) value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.DeclarationKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+            }
+
+            public unsafe partial class MacroDefinition : CppSharp.Parser.AST.PreprocessedEntity, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 96)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.MacroLocation MacroLocation;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(88)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(92)]
+                    public int LineNumberEnd;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinitionC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinitionC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinitionD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinition7getNameEv")]
+                    internal static extern global::System.IntPtr getName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinition7setNameEPKc")]
+                    internal static extern void setName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinition13getExpressionEv")]
+                    internal static extern global::System.IntPtr getExpression_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15MacroDefinition13setExpressionEPKc")]
+                    internal static extern void setExpression_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new MacroDefinition __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new MacroDefinition(native.ToPointer(), skipVTables);
+                }
+
+                public static MacroDefinition __CreateInstance(MacroDefinition.Internal native, bool skipVTables = false)
+                {
+                    return new MacroDefinition(native, skipVTables);
+                }
+
+                private static void* __CopyValue(MacroDefinition.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(96);
+                    CppSharp.Parser.AST.MacroDefinition.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private MacroDefinition(MacroDefinition.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected MacroDefinition(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public MacroDefinition()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(96);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public MacroDefinition(CppSharp.Parser.AST.MacroDefinition _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(96);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.PreprocessedEntity __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Name
+                {
+                    get
+                    {
+                        var __ret = Internal.getName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public string Expression
+                {
+                    get
+                    {
+                        var __ret = Internal.getExpression_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setExpression_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public int LineNumberStart
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->LineNumberStart;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->LineNumberStart = value;
+                    }
+                }
+
+                public int LineNumberEnd
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->LineNumberEnd;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->LineNumberEnd = value;
+                    }
+                }
+            }
+
+            public unsafe partial class MacroExpansion : CppSharp.Parser.AST.PreprocessedEntity, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 96)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.MacroLocation MacroLocation;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(88)]
+                    public global::System.IntPtr Definition;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansionC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansionC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansionD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansion7getNameEv")]
+                    internal static extern global::System.IntPtr getName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansion7setNameEPKc")]
+                    internal static extern void setName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansion7getTextEv")]
+                    internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14MacroExpansion7setTextEPKc")]
+                    internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new MacroExpansion __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new MacroExpansion(native.ToPointer(), skipVTables);
+                }
+
+                public static MacroExpansion __CreateInstance(MacroExpansion.Internal native, bool skipVTables = false)
+                {
+                    return new MacroExpansion(native, skipVTables);
+                }
+
+                private static void* __CopyValue(MacroExpansion.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(96);
+                    CppSharp.Parser.AST.MacroExpansion.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private MacroExpansion(MacroExpansion.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected MacroExpansion(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public MacroExpansion()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(96);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public MacroExpansion(CppSharp.Parser.AST.MacroExpansion _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(96);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.PreprocessedEntity __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Name
+                {
+                    get
+                    {
+                        var __ret = Internal.getName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public string Text
+                {
+                    get
+                    {
+                        var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.MacroDefinition Definition
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.MacroDefinition __result0;
+                        if (((Internal*) __Instance)->Definition == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.MacroDefinition.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Definition))
+                            __result0 = (CppSharp.Parser.AST.MacroDefinition) CppSharp.Parser.AST.MacroDefinition.NativeToManagedMap[((Internal*) __Instance)->Definition];
+                        else __result0 = CppSharp.Parser.AST.MacroDefinition.__CreateInstance(((Internal*) __Instance)->Definition);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Definition = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class TranslationUnit : CppSharp.Parser.AST.Namespace, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 528)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.DeclarationKind Kind;
+
+                    [FieldOffset(4)]
+                    public CppSharp.Parser.AST.AccessSpecifier Access;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr _Namespace;
+
+                    [FieldOffset(16)]
+                    public CppSharp.Parser.SourceLocation.Internal Location;
+
+                    [FieldOffset(20)]
+                    public int LineNumberStart;
+
+                    [FieldOffset(24)]
+                    public int LineNumberEnd;
+
+                    [FieldOffset(128)]
+                    public byte IsIncomplete;
+
+                    [FieldOffset(129)]
+                    public byte IsDependent;
+
+                    [FieldOffset(130)]
+                    public byte IsImplicit;
+
+                    [FieldOffset(136)]
+                    public global::System.IntPtr CompleteDeclaration;
+
+                    [FieldOffset(144)]
+                    public uint DefinitionOrder;
+
+                    [FieldOffset(176)]
+                    public global::System.IntPtr OriginalPtr;
+
+                    [FieldOffset(184)]
+                    public global::System.IntPtr Comment;
+
+                    [FieldOffset(456)]
+                    public byte IsAnonymous;
+
+                    [FieldOffset(457)]
+                    public byte IsInline;
+
+                    [FieldOffset(496)]
+                    public byte IsSystemHeader;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnitC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnitC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnitD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnit9getMacrosEj")]
+                    internal static extern global::System.IntPtr getMacros_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnit9addMacrosERPNS1_15MacroDefinitionE")]
+                    internal static extern void addMacros_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnit11clearMacrosEv")]
+                    internal static extern void clearMacros_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnit11getFileNameEv")]
+                    internal static extern global::System.IntPtr getFileName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnit11setFileNameEPKc")]
+                    internal static extern void setFileName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST15TranslationUnit14getMacrosCountEv")]
+                    internal static extern uint getMacrosCount_0(global::System.IntPtr instance);
+                }
+
+                public static new TranslationUnit __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TranslationUnit(native.ToPointer(), skipVTables);
+                }
+
+                public static TranslationUnit __CreateInstance(TranslationUnit.Internal native, bool skipVTables = false)
+                {
+                    return new TranslationUnit(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TranslationUnit.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(528);
+                    CppSharp.Parser.AST.TranslationUnit.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TranslationUnit(TranslationUnit.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TranslationUnit(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TranslationUnit()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(528);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TranslationUnit(CppSharp.Parser.AST.TranslationUnit _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(528);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Declaration __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.MacroDefinition getMacros(uint i)
+                {
+                    var __ret = Internal.getMacros_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.MacroDefinition __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.MacroDefinition.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.MacroDefinition) CppSharp.Parser.AST.MacroDefinition.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.MacroDefinition.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addMacros(CppSharp.Parser.AST.MacroDefinition s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addMacros_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearMacros()
+                {
+                    Internal.clearMacros_0((__Instance + __PointerAdjustment));
+                }
+
+                public string FileName
+                {
+                    get
+                    {
+                        var __ret = Internal.getFileName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setFileName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public uint MacrosCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getMacrosCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public bool IsSystemHeader
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsSystemHeader != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsSystemHeader = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class NativeLibrary : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 88)]
+                public partial struct Internal
+                {
+                    [FieldOffset(32)]
+                    public CppSharp.Parser.AST.ArchType ArchType;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibraryD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary10getSymbolsEj")]
+                    internal static extern global::System.IntPtr getSymbols_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary10addSymbolsEPKc")]
+                    internal static extern void addSymbols_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary12clearSymbolsEv")]
+                    internal static extern void clearSymbols_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary15getDependenciesEj")]
+                    internal static extern global::System.IntPtr getDependencies_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary15addDependenciesEPKc")]
+                    internal static extern void addDependencies_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary17clearDependenciesEv")]
+                    internal static extern void clearDependencies_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary11getFileNameEv")]
+                    internal static extern global::System.IntPtr getFileName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary11setFileNameEPKc")]
+                    internal static extern void setFileName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary15getSymbolsCountEv")]
+                    internal static extern uint getSymbolsCount_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST13NativeLibrary20getDependenciesCountEv")]
+                    internal static extern uint getDependenciesCount_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, NativeLibrary> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, NativeLibrary>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static NativeLibrary __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new NativeLibrary(native.ToPointer(), skipVTables);
+                }
+
+                public static NativeLibrary __CreateInstance(NativeLibrary.Internal native, bool skipVTables = false)
+                {
+                    return new NativeLibrary(native, skipVTables);
+                }
+
+                private static void* __CopyValue(NativeLibrary.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(88);
+                    CppSharp.Parser.AST.NativeLibrary.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private NativeLibrary(NativeLibrary.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected NativeLibrary(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public NativeLibrary()
+                {
+                    __Instance = Marshal.AllocHGlobal(88);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public NativeLibrary(CppSharp.Parser.AST.NativeLibrary _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(88);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.NativeLibrary __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string getSymbols(uint i)
+                {
+                    var __ret = Internal.getSymbols_0((__Instance + __PointerAdjustment), i);
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                public void addSymbols(string s)
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                    Internal.addSymbols_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+
+                public void clearSymbols()
+                {
+                    Internal.clearSymbols_0((__Instance + __PointerAdjustment));
+                }
+
+                public string getDependencies(uint i)
+                {
+                    var __ret = Internal.getDependencies_0((__Instance + __PointerAdjustment), i);
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                public void addDependencies(string s)
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                    Internal.addDependencies_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+
+                public void clearDependencies()
+                {
+                    Internal.clearDependencies_0((__Instance + __PointerAdjustment));
+                }
+
+                public string FileName
+                {
+                    get
+                    {
+                        var __ret = Internal.getFileName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setFileName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public uint SymbolsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getSymbolsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint DependenciesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getDependenciesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public CppSharp.Parser.AST.ArchType ArchType
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->ArchType;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ArchType = value;
+                    }
+                }
+            }
+
+            public unsafe partial class ASTContext : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 24)]
+                public partial struct Internal
+                {
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContextC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContextC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContextD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContext19getTranslationUnitsEj")]
+                    internal static extern global::System.IntPtr getTranslationUnits_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContext19addTranslationUnitsERPNS1_15TranslationUnitE")]
+                    internal static extern void addTranslationUnits_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContext21clearTranslationUnitsEv")]
+                    internal static extern void clearTranslationUnits_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10ASTContext24getTranslationUnitsCountEv")]
+                    internal static extern uint getTranslationUnitsCount_0(global::System.IntPtr instance);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ASTContext> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ASTContext>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static ASTContext __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ASTContext(native.ToPointer(), skipVTables);
+                }
+
+                public static ASTContext __CreateInstance(ASTContext.Internal native, bool skipVTables = false)
+                {
+                    return new ASTContext(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ASTContext.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(24);
+                    CppSharp.Parser.AST.ASTContext.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ASTContext(ASTContext.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ASTContext(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ASTContext()
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ASTContext(CppSharp.Parser.AST.ASTContext _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(24);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.ASTContext __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.TranslationUnit getTranslationUnits(uint i)
+                {
+                    var __ret = Internal.getTranslationUnits_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.TranslationUnit __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.TranslationUnit.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.TranslationUnit) CppSharp.Parser.AST.TranslationUnit.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.TranslationUnit.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addTranslationUnits(CppSharp.Parser.AST.TranslationUnit s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addTranslationUnits_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearTranslationUnits()
+                {
+                    Internal.clearTranslationUnits_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint TranslationUnitsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getTranslationUnitsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class Comment : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 4)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST7CommentC2ENS1_11CommentKindE")]
+                    internal static extern void ctor_0(global::System.IntPtr instance, CppSharp.Parser.AST.CommentKind kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST7CommentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Comment> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Comment>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static Comment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new Comment(native.ToPointer(), skipVTables);
+                }
+
+                public static Comment __CreateInstance(Comment.Internal native, bool skipVTables = false)
+                {
+                    return new Comment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(Comment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(4);
+                    *(Comment.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private Comment(Comment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected Comment(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public Comment(CppSharp.Parser.AST.CommentKind kind)
+                {
+                    __Instance = Marshal.AllocHGlobal(4);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = kind;
+                    Internal.ctor_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public Comment(CppSharp.Parser.AST.Comment _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(4);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((Comment.Internal*) __Instance) = *((Comment.Internal*) _0.__Instance);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.CommentKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+            }
+
+            public unsafe partial class BlockContentComment : CppSharp.Parser.AST.Comment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 4)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockContentCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockContentCommentC2ENS1_11CommentKindE")]
+                    internal static extern void ctor_1(global::System.IntPtr instance, CppSharp.Parser.AST.CommentKind Kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockContentCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new BlockContentComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new BlockContentComment(native.ToPointer(), skipVTables);
+                }
+
+                public static BlockContentComment __CreateInstance(BlockContentComment.Internal native, bool skipVTables = false)
+                {
+                    return new BlockContentComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(BlockContentComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(4);
+                    *(BlockContentComment.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private BlockContentComment(BlockContentComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected BlockContentComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public BlockContentComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(4);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public BlockContentComment(CppSharp.Parser.AST.CommentKind Kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(4);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = Kind;
+                    Internal.ctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public BlockContentComment(CppSharp.Parser.AST.BlockContentComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(4);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((BlockContentComment.Internal*) __Instance) = *((BlockContentComment.Internal*) _0.__Instance);
+                }
+            }
+
+            public unsafe partial class FullComment : CppSharp.Parser.AST.Comment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 32)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullCommentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullComment9getBlocksEj")]
+                    internal static extern global::System.IntPtr getBlocks_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullComment9addBlocksERPNS1_19BlockContentCommentE")]
+                    internal static extern void addBlocks_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullComment11clearBlocksEv")]
+                    internal static extern void clearBlocks_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11FullComment14getBlocksCountEv")]
+                    internal static extern uint getBlocksCount_0(global::System.IntPtr instance);
+                }
+
+                public static new FullComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new FullComment(native.ToPointer(), skipVTables);
+                }
+
+                public static FullComment __CreateInstance(FullComment.Internal native, bool skipVTables = false)
+                {
+                    return new FullComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(FullComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(32);
+                    CppSharp.Parser.AST.FullComment.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private FullComment(FullComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected FullComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public FullComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public FullComment(CppSharp.Parser.AST.FullComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.BlockContentComment getBlocks(uint i)
+                {
+                    var __ret = Internal.getBlocks_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.BlockContentComment __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.BlockContentComment.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.BlockContentComment) CppSharp.Parser.AST.BlockContentComment.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.BlockContentComment.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addBlocks(CppSharp.Parser.AST.BlockContentComment s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addBlocks_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearBlocks()
+                {
+                    Internal.clearBlocks_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint BlocksCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getBlocksCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class InlineContentComment : CppSharp.Parser.AST.Comment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte HasTrailingNewline;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineContentCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineContentCommentC2ENS1_11CommentKindE")]
+                    internal static extern void ctor_1(global::System.IntPtr instance, CppSharp.Parser.AST.CommentKind Kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineContentCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new InlineContentComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new InlineContentComment(native.ToPointer(), skipVTables);
+                }
+
+                public static InlineContentComment __CreateInstance(InlineContentComment.Internal native, bool skipVTables = false)
+                {
+                    return new InlineContentComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(InlineContentComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(8);
+                    *(InlineContentComment.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private InlineContentComment(InlineContentComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected InlineContentComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public InlineContentComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public InlineContentComment(CppSharp.Parser.AST.CommentKind Kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = Kind;
+                    Internal.ctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public InlineContentComment(CppSharp.Parser.AST.InlineContentComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((InlineContentComment.Internal*) __Instance) = *((InlineContentComment.Internal*) _0.__Instance);
+                }
+
+                public bool HasTrailingNewline
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->HasTrailingNewline != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->HasTrailingNewline = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class ParagraphComment : CppSharp.Parser.AST.BlockContentComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 32)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte IsWhitespace;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphCommentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphComment10getContentEj")]
+                    internal static extern global::System.IntPtr getContent_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphComment10addContentERPNS1_20InlineContentCommentE")]
+                    internal static extern void addContent_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphComment12clearContentEv")]
+                    internal static extern void clearContent_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST16ParagraphComment15getContentCountEv")]
+                    internal static extern uint getContentCount_0(global::System.IntPtr instance);
+                }
+
+                public static new ParagraphComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ParagraphComment(native.ToPointer(), skipVTables);
+                }
+
+                public static ParagraphComment __CreateInstance(ParagraphComment.Internal native, bool skipVTables = false)
+                {
+                    return new ParagraphComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ParagraphComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(32);
+                    CppSharp.Parser.AST.ParagraphComment.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ParagraphComment(ParagraphComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ParagraphComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ParagraphComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ParagraphComment(CppSharp.Parser.AST.ParagraphComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(32);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.InlineContentComment getContent(uint i)
+                {
+                    var __ret = Internal.getContent_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.InlineContentComment __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.InlineContentComment.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.InlineContentComment) CppSharp.Parser.AST.InlineContentComment.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.InlineContentComment.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addContent(CppSharp.Parser.AST.InlineContentComment s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addContent_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearContent()
+                {
+                    Internal.clearContent_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ContentCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getContentCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public bool IsWhitespace
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->IsWhitespace != 0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->IsWhitespace = (byte) (value ? 1 : 0);
+                    }
+                }
+            }
+
+            public unsafe partial class BlockCommandComment : CppSharp.Parser.AST.BlockContentComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public uint CommandId;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr ParagraphComment;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandCommentC2ENS1_11CommentKindE")]
+                    internal static extern void ctor_1(global::System.IntPtr instance, CppSharp.Parser.AST.CommentKind Kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment12getArgumentsEj")]
+                    internal static extern void getArguments_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment12addArgumentsERNS2_8ArgumentE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public unsafe partial class Argument : IDisposable
+                {
+                    [StructLayout(LayoutKind.Explicit, Size = 32)]
+                    public partial struct Internal
+                    {
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment8ArgumentC2Ev")]
+                        internal static extern void ctor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment8ArgumentC2ERKS3_")]
+                        internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment8ArgumentD2Ev")]
+                        internal static extern void dtor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment8Argument7getTextEv")]
+                        internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19BlockCommandComment8Argument7setTextEPKc")]
+                        internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                    }
+
+                    public global::System.IntPtr __Instance { get; protected set; }
+
+                    protected int __PointerAdjustment;
+                    public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Argument> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Argument>();
+                    protected void*[] __OriginalVTables;
+
+                    protected bool __ownsNativeInstance;
+
+                    public static Argument __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                    {
+                        return new Argument(native.ToPointer(), skipVTables);
+                    }
+
+                    public static Argument __CreateInstance(Argument.Internal native, bool skipVTables = false)
+                    {
+                        return new Argument(native, skipVTables);
+                    }
+
+                    private static void* __CopyValue(Argument.Internal native)
+                    {
+                        var ret = Marshal.AllocHGlobal(32);
+                        CppSharp.Parser.AST.BlockCommandComment.Argument.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                        return ret.ToPointer();
+                    }
+
+                    private Argument(Argument.Internal native, bool skipVTables = false)
+                        : this(__CopyValue(native), skipVTables)
+                    {
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                    }
+
+                    protected Argument(void* native, bool skipVTables = false)
+                    {
+                        if (native == null)
+                            return;
+                        __Instance = new global::System.IntPtr(native);
+                    }
+
+                    public Argument()
+                    {
+                        __Instance = Marshal.AllocHGlobal(32);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        Internal.ctor_0((__Instance + __PointerAdjustment));
+                    }
+
+                    public Argument(CppSharp.Parser.AST.BlockCommandComment.Argument _0)
+                    {
+                        __Instance = Marshal.AllocHGlobal(32);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        if (ReferenceEquals(_0, null))
+                            throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                        var __arg0 = _0.__Instance;
+                        Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                    }
+
+                    public void Dispose()
+                    {
+                        Dispose(disposing: true);
+                    }
+
+                    protected virtual void Dispose(bool disposing)
+                    {
+                        CppSharp.Parser.AST.BlockCommandComment.Argument __dummy;
+                        NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                        Internal.dtor_0((__Instance + __PointerAdjustment));
+                        if (__ownsNativeInstance)
+                            Marshal.FreeHGlobal(__Instance);
+                    }
+
+                    public string Text
+                    {
+                        get
+                        {
+                            var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                            return Marshal.PtrToStringAnsi(__ret);
+                        }
+
+                        set
+                        {
+                            var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                            Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                            Marshal.FreeHGlobal(__arg0);
+                        }
+                    }
+                }
+
+                public static new BlockCommandComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new BlockCommandComment(native.ToPointer(), skipVTables);
+                }
+
+                public static BlockCommandComment __CreateInstance(BlockCommandComment.Internal native, bool skipVTables = false)
+                {
+                    return new BlockCommandComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(BlockCommandComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.BlockCommandComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private BlockCommandComment(BlockCommandComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected BlockCommandComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public BlockCommandComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public BlockCommandComment(CppSharp.Parser.AST.CommentKind Kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = Kind;
+                    Internal.ctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public BlockCommandComment(CppSharp.Parser.AST.BlockCommandComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.BlockCommandComment.Argument getArguments(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.BlockCommandComment.Argument.Internal();
+                    Internal.getArguments_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.BlockCommandComment.Argument.__CreateInstance(__ret);
+                }
+
+                public void addArguments(CppSharp.Parser.AST.BlockCommandComment.Argument s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint CommandId
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->CommandId;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->CommandId = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.ParagraphComment ParagraphComment
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.ParagraphComment __result0;
+                        if (((Internal*) __Instance)->ParagraphComment == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.ParagraphComment.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->ParagraphComment))
+                            __result0 = (CppSharp.Parser.AST.ParagraphComment) CppSharp.Parser.AST.ParagraphComment.NativeToManagedMap[((Internal*) __Instance)->ParagraphComment];
+                        else __result0 = CppSharp.Parser.AST.ParagraphComment.__CreateInstance(((Internal*) __Instance)->ParagraphComment);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ParagraphComment = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+
+            public unsafe partial class ParamCommandComment : CppSharp.Parser.AST.BlockCommandComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 48)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public uint CommandId;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr ParagraphComment;
+
+                    [FieldOffset(40)]
+                    public CppSharp.Parser.AST.ParamCommandComment.PassDirection Direction;
+
+                    [FieldOffset(44)]
+                    public uint ParamIndex;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19ParamCommandCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19ParamCommandCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19ParamCommandCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+                }
+
+                public enum PassDirection : uint
+                {
+                    In = 0,
+                    Out = 1,
+                    InOut = 2
+                }
+
+                public static new ParamCommandComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new ParamCommandComment(native.ToPointer(), skipVTables);
+                }
+
+                public static ParamCommandComment __CreateInstance(ParamCommandComment.Internal native, bool skipVTables = false)
+                {
+                    return new ParamCommandComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(ParamCommandComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(48);
+                    CppSharp.Parser.AST.ParamCommandComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private ParamCommandComment(ParamCommandComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected ParamCommandComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public ParamCommandComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public ParamCommandComment(CppSharp.Parser.AST.ParamCommandComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(48);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.ParamCommandComment.PassDirection Direction
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Direction;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Direction = value;
+                    }
+                }
+
+                public uint ParamIndex
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->ParamIndex;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->ParamIndex = value;
+                    }
+                }
+            }
+
+            public unsafe partial class TParamCommandComment : CppSharp.Parser.AST.BlockCommandComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 64)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public uint CommandId;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr ParagraphComment;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandComment11getPositionEj")]
+                    internal static extern uint getPosition_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandComment11addPositionERj")]
+                    internal static extern void addPosition_0(global::System.IntPtr instance, uint* s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandComment13clearPositionEv")]
+                    internal static extern void clearPosition_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20TParamCommandComment16getPositionCountEv")]
+                    internal static extern uint getPositionCount_0(global::System.IntPtr instance);
+                }
+
+                public static new TParamCommandComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TParamCommandComment(native.ToPointer(), skipVTables);
+                }
+
+                public static TParamCommandComment __CreateInstance(TParamCommandComment.Internal native, bool skipVTables = false)
+                {
+                    return new TParamCommandComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TParamCommandComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(64);
+                    CppSharp.Parser.AST.TParamCommandComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TParamCommandComment(TParamCommandComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TParamCommandComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TParamCommandComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TParamCommandComment(CppSharp.Parser.AST.TParamCommandComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public uint getPosition(uint i)
+                {
+                    var __ret = Internal.getPosition_0((__Instance + __PointerAdjustment), i);
+                    return __ret;
+                }
+
+                public void addPosition(ref uint s)
+                {
+                    fixed (uint* __refParamPtr0 = &s)
+                    {
+                        var __arg0 = __refParamPtr0;
+                        Internal.addPosition_0((__Instance + __PointerAdjustment), __arg0);
+                    }
+                }
+
+                public void clearPosition()
+                {
+                    Internal.clearPosition_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint PositionCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getPositionCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class VerbatimBlockLineComment : CppSharp.Parser.AST.Comment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24VerbatimBlockLineCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24VerbatimBlockLineCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24VerbatimBlockLineCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24VerbatimBlockLineComment7getTextEv")]
+                    internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST24VerbatimBlockLineComment7setTextEPKc")]
+                    internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new VerbatimBlockLineComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new VerbatimBlockLineComment(native.ToPointer(), skipVTables);
+                }
+
+                public static VerbatimBlockLineComment __CreateInstance(VerbatimBlockLineComment.Internal native, bool skipVTables = false)
+                {
+                    return new VerbatimBlockLineComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(VerbatimBlockLineComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.VerbatimBlockLineComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private VerbatimBlockLineComment(VerbatimBlockLineComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected VerbatimBlockLineComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public VerbatimBlockLineComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public VerbatimBlockLineComment(CppSharp.Parser.AST.VerbatimBlockLineComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Text
+                {
+                    get
+                    {
+                        var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+            }
+
+            public unsafe partial class VerbatimBlockComment : CppSharp.Parser.AST.BlockCommandComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 64)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public uint CommandId;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr ParagraphComment;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockCommentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockComment8getLinesEj")]
+                    internal static extern global::System.IntPtr getLines_0(global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockComment8addLinesERPNS1_24VerbatimBlockLineCommentE")]
+                    internal static extern void addLines_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockComment10clearLinesEv")]
+                    internal static extern void clearLines_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20VerbatimBlockComment13getLinesCountEv")]
+                    internal static extern uint getLinesCount_0(global::System.IntPtr instance);
+                }
+
+                public static new VerbatimBlockComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new VerbatimBlockComment(native.ToPointer(), skipVTables);
+                }
+
+                public static VerbatimBlockComment __CreateInstance(VerbatimBlockComment.Internal native, bool skipVTables = false)
+                {
+                    return new VerbatimBlockComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(VerbatimBlockComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(64);
+                    CppSharp.Parser.AST.VerbatimBlockComment.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private VerbatimBlockComment(VerbatimBlockComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected VerbatimBlockComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public VerbatimBlockComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public VerbatimBlockComment(CppSharp.Parser.AST.VerbatimBlockComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.VerbatimBlockLineComment getLines(uint i)
+                {
+                    var __ret = Internal.getLines_0((__Instance + __PointerAdjustment), i);
+                    CppSharp.Parser.AST.VerbatimBlockLineComment __result0;
+                    if (__ret == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.VerbatimBlockLineComment.NativeToManagedMap.ContainsKey(__ret))
+                        __result0 = (CppSharp.Parser.AST.VerbatimBlockLineComment) CppSharp.Parser.AST.VerbatimBlockLineComment.NativeToManagedMap[__ret];
+                    else __result0 = CppSharp.Parser.AST.VerbatimBlockLineComment.__CreateInstance(__ret);
+                    return __result0;
+                }
+
+                public void addLines(CppSharp.Parser.AST.VerbatimBlockLineComment s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addLines_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearLines()
+                {
+                    Internal.clearLines_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint LinesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getLinesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class VerbatimLineComment : CppSharp.Parser.AST.BlockCommandComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 72)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public uint CommandId;
+
+                    [FieldOffset(8)]
+                    public global::System.IntPtr ParagraphComment;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19VerbatimLineCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19VerbatimLineCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19VerbatimLineCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19VerbatimLineComment7getTextEv")]
+                    internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19VerbatimLineComment7setTextEPKc")]
+                    internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new VerbatimLineComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new VerbatimLineComment(native.ToPointer(), skipVTables);
+                }
+
+                public static VerbatimLineComment __CreateInstance(VerbatimLineComment.Internal native, bool skipVTables = false)
+                {
+                    return new VerbatimLineComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(VerbatimLineComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(72);
+                    CppSharp.Parser.AST.VerbatimLineComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private VerbatimLineComment(VerbatimLineComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected VerbatimLineComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public VerbatimLineComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(72);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public VerbatimLineComment(CppSharp.Parser.AST.VerbatimLineComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(72);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Text
+                {
+                    get
+                    {
+                        var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+            }
+
+            public unsafe partial class InlineCommandComment : CppSharp.Parser.AST.InlineContentComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte HasTrailingNewline;
+
+                    [FieldOffset(8)]
+                    public uint CommandId;
+
+                    [FieldOffset(12)]
+                    public CppSharp.Parser.AST.InlineCommandComment.RenderKind CommentRenderKind;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment12getArgumentsEj")]
+                    internal static extern void getArguments_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment12addArgumentsERNS2_8ArgumentE")]
+                    internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment14clearArgumentsEv")]
+                    internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment17getArgumentsCountEv")]
+                    internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+                }
+
+                public enum RenderKind : uint
+                {
+                    RenderNormal = 0,
+                    RenderBold = 1,
+                    RenderMonospaced = 2,
+                    RenderEmphasized = 3
+                }
+
+                public unsafe partial class Argument : IDisposable
+                {
+                    [StructLayout(LayoutKind.Explicit, Size = 32)]
+                    public partial struct Internal
+                    {
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment8ArgumentC2Ev")]
+                        internal static extern void ctor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment8ArgumentC2ERKS3_")]
+                        internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment8ArgumentD2Ev")]
+                        internal static extern void dtor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment8Argument7getTextEv")]
+                        internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST20InlineCommandComment8Argument7setTextEPKc")]
+                        internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                    }
+
+                    public global::System.IntPtr __Instance { get; protected set; }
+
+                    protected int __PointerAdjustment;
+                    public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Argument> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Argument>();
+                    protected void*[] __OriginalVTables;
+
+                    protected bool __ownsNativeInstance;
+
+                    public static Argument __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                    {
+                        return new Argument(native.ToPointer(), skipVTables);
+                    }
+
+                    public static Argument __CreateInstance(Argument.Internal native, bool skipVTables = false)
+                    {
+                        return new Argument(native, skipVTables);
+                    }
+
+                    private static void* __CopyValue(Argument.Internal native)
+                    {
+                        var ret = Marshal.AllocHGlobal(32);
+                        CppSharp.Parser.AST.InlineCommandComment.Argument.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                        return ret.ToPointer();
+                    }
+
+                    private Argument(Argument.Internal native, bool skipVTables = false)
+                        : this(__CopyValue(native), skipVTables)
+                    {
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                    }
+
+                    protected Argument(void* native, bool skipVTables = false)
+                    {
+                        if (native == null)
+                            return;
+                        __Instance = new global::System.IntPtr(native);
+                    }
+
+                    public Argument()
+                    {
+                        __Instance = Marshal.AllocHGlobal(32);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        Internal.ctor_0((__Instance + __PointerAdjustment));
+                    }
+
+                    public Argument(CppSharp.Parser.AST.InlineCommandComment.Argument _0)
+                    {
+                        __Instance = Marshal.AllocHGlobal(32);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        if (ReferenceEquals(_0, null))
+                            throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                        var __arg0 = _0.__Instance;
+                        Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                    }
+
+                    public void Dispose()
+                    {
+                        Dispose(disposing: true);
+                    }
+
+                    protected virtual void Dispose(bool disposing)
+                    {
+                        CppSharp.Parser.AST.InlineCommandComment.Argument __dummy;
+                        NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                        Internal.dtor_0((__Instance + __PointerAdjustment));
+                        if (__ownsNativeInstance)
+                            Marshal.FreeHGlobal(__Instance);
+                    }
+
+                    public string Text
+                    {
+                        get
+                        {
+                            var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                            return Marshal.PtrToStringAnsi(__ret);
+                        }
+
+                        set
+                        {
+                            var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                            Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                            Marshal.FreeHGlobal(__arg0);
+                        }
+                    }
+                }
+
+                public static new InlineCommandComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new InlineCommandComment(native.ToPointer(), skipVTables);
+                }
+
+                public static InlineCommandComment __CreateInstance(InlineCommandComment.Internal native, bool skipVTables = false)
+                {
+                    return new InlineCommandComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(InlineCommandComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.InlineCommandComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private InlineCommandComment(InlineCommandComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected InlineCommandComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public InlineCommandComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public InlineCommandComment(CppSharp.Parser.AST.InlineCommandComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.InlineCommandComment.Argument getArguments(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.InlineCommandComment.Argument.Internal();
+                    Internal.getArguments_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.InlineCommandComment.Argument.__CreateInstance(__ret);
+                }
+
+                public void addArguments(CppSharp.Parser.AST.InlineCommandComment.Argument s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearArguments()
+                {
+                    Internal.clearArguments_0((__Instance + __PointerAdjustment));
+                }
+
+                public uint ArgumentsCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+
+                public uint CommandId
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->CommandId;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->CommandId = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.InlineCommandComment.RenderKind CommentRenderKind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->CommentRenderKind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->CommentRenderKind = value;
+                    }
+                }
+            }
+
+            public unsafe partial class HTMLTagComment : CppSharp.Parser.AST.InlineContentComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 8)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte HasTrailingNewline;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14HTMLTagCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14HTMLTagCommentC2ENS1_11CommentKindE")]
+                    internal static extern void ctor_1(global::System.IntPtr instance, CppSharp.Parser.AST.CommentKind Kind);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST14HTMLTagCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+                }
+
+                public static new HTMLTagComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new HTMLTagComment(native.ToPointer(), skipVTables);
+                }
+
+                public static HTMLTagComment __CreateInstance(HTMLTagComment.Internal native, bool skipVTables = false)
+                {
+                    return new HTMLTagComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(HTMLTagComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(8);
+                    *(HTMLTagComment.Internal*) ret = native;
+                    return ret.ToPointer();
+                }
+
+                private HTMLTagComment(HTMLTagComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected HTMLTagComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public HTMLTagComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public HTMLTagComment(CppSharp.Parser.AST.CommentKind Kind)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    var __arg0 = Kind;
+                    Internal.ctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public HTMLTagComment(CppSharp.Parser.AST.HTMLTagComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(8);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    *((HTMLTagComment.Internal*) __Instance) = *((HTMLTagComment.Internal*) _0.__Instance);
+                }
+            }
+
+            public unsafe partial class HTMLStartTagComment : CppSharp.Parser.AST.HTMLTagComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 64)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte HasTrailingNewline;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment13getAttributesEj")]
+                    internal static extern void getAttributes_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment13addAttributesERNS2_9AttributeE")]
+                    internal static extern void addAttributes_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment15clearAttributesEv")]
+                    internal static extern void clearAttributes_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment10getTagNameEv")]
+                    internal static extern global::System.IntPtr getTagName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment10setTagNameEPKc")]
+                    internal static extern void setTagName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment18getAttributesCountEv")]
+                    internal static extern uint getAttributesCount_0(global::System.IntPtr instance);
+                }
+
+                public unsafe partial class Attribute : IDisposable
+                {
+                    [StructLayout(LayoutKind.Explicit, Size = 64)]
+                    public partial struct Internal
+                    {
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9AttributeC2Ev")]
+                        internal static extern void ctor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9AttributeC2ERKS3_")]
+                        internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9AttributeD2Ev")]
+                        internal static extern void dtor_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9Attribute7getNameEv")]
+                        internal static extern global::System.IntPtr getName_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9Attribute7setNameEPKc")]
+                        internal static extern void setName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9Attribute8getValueEv")]
+                        internal static extern global::System.IntPtr getValue_0(global::System.IntPtr instance);
+
+                        [SuppressUnmanagedCodeSecurity]
+                        [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                            EntryPoint="_ZN8CppSharp9CppParser3AST19HTMLStartTagComment9Attribute8setValueEPKc")]
+                        internal static extern void setValue_0(global::System.IntPtr instance, global::System.IntPtr s);
+                    }
+
+                    public global::System.IntPtr __Instance { get; protected set; }
+
+                    protected int __PointerAdjustment;
+                    public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Attribute> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, Attribute>();
+                    protected void*[] __OriginalVTables;
+
+                    protected bool __ownsNativeInstance;
+
+                    public static Attribute __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                    {
+                        return new Attribute(native.ToPointer(), skipVTables);
+                    }
+
+                    public static Attribute __CreateInstance(Attribute.Internal native, bool skipVTables = false)
+                    {
+                        return new Attribute(native, skipVTables);
+                    }
+
+                    private static void* __CopyValue(Attribute.Internal native)
+                    {
+                        var ret = Marshal.AllocHGlobal(64);
+                        CppSharp.Parser.AST.HTMLStartTagComment.Attribute.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                        return ret.ToPointer();
+                    }
+
+                    private Attribute(Attribute.Internal native, bool skipVTables = false)
+                        : this(__CopyValue(native), skipVTables)
+                    {
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                    }
+
+                    protected Attribute(void* native, bool skipVTables = false)
+                    {
+                        if (native == null)
+                            return;
+                        __Instance = new global::System.IntPtr(native);
+                    }
+
+                    public Attribute()
+                    {
+                        __Instance = Marshal.AllocHGlobal(64);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        Internal.ctor_0((__Instance + __PointerAdjustment));
+                    }
+
+                    public Attribute(CppSharp.Parser.AST.HTMLStartTagComment.Attribute _0)
+                    {
+                        __Instance = Marshal.AllocHGlobal(64);
+                        __ownsNativeInstance = true;
+                        NativeToManagedMap[__Instance] = this;
+                        if (ReferenceEquals(_0, null))
+                            throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                        var __arg0 = _0.__Instance;
+                        Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                    }
+
+                    public void Dispose()
+                    {
+                        Dispose(disposing: true);
+                    }
+
+                    protected virtual void Dispose(bool disposing)
+                    {
+                        CppSharp.Parser.AST.HTMLStartTagComment.Attribute __dummy;
+                        NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                        Internal.dtor_0((__Instance + __PointerAdjustment));
+                        if (__ownsNativeInstance)
+                            Marshal.FreeHGlobal(__Instance);
+                    }
+
+                    public string Name
+                    {
+                        get
+                        {
+                            var __ret = Internal.getName_0((__Instance + __PointerAdjustment));
+                            return Marshal.PtrToStringAnsi(__ret);
+                        }
+
+                        set
+                        {
+                            var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                            Internal.setName_0((__Instance + __PointerAdjustment), __arg0);
+                            Marshal.FreeHGlobal(__arg0);
+                        }
+                    }
+
+                    public string Value
+                    {
+                        get
+                        {
+                            var __ret = Internal.getValue_0((__Instance + __PointerAdjustment));
+                            return Marshal.PtrToStringAnsi(__ret);
+                        }
+
+                        set
+                        {
+                            var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                            Internal.setValue_0((__Instance + __PointerAdjustment), __arg0);
+                            Marshal.FreeHGlobal(__arg0);
+                        }
+                    }
+                }
+
+                public static new HTMLStartTagComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new HTMLStartTagComment(native.ToPointer(), skipVTables);
+                }
+
+                public static HTMLStartTagComment __CreateInstance(HTMLStartTagComment.Internal native, bool skipVTables = false)
+                {
+                    return new HTMLStartTagComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(HTMLStartTagComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(64);
+                    CppSharp.Parser.AST.HTMLStartTagComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private HTMLStartTagComment(HTMLStartTagComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected HTMLStartTagComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public HTMLStartTagComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public HTMLStartTagComment(CppSharp.Parser.AST.HTMLStartTagComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(64);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public CppSharp.Parser.AST.HTMLStartTagComment.Attribute getAttributes(uint i)
+                {
+                    var __ret = new CppSharp.Parser.AST.HTMLStartTagComment.Attribute.Internal();
+                    Internal.getAttributes_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                    return CppSharp.Parser.AST.HTMLStartTagComment.Attribute.__CreateInstance(__ret);
+                }
+
+                public void addAttributes(CppSharp.Parser.AST.HTMLStartTagComment.Attribute s)
+                {
+                    if (ReferenceEquals(s, null))
+                        throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = s.__Instance;
+                    Internal.addAttributes_0((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void clearAttributes()
+                {
+                    Internal.clearAttributes_0((__Instance + __PointerAdjustment));
+                }
+
+                public string TagName
+                {
+                    get
+                    {
+                        var __ret = Internal.getTagName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setTagName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public uint AttributesCount
+                {
+                    get
+                    {
+                        var __ret = Internal.getAttributesCount_0((__Instance + __PointerAdjustment));
+                        return __ret;
+                    }
+                }
+            }
+
+            public unsafe partial class HTMLEndTagComment : CppSharp.Parser.AST.HTMLTagComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte HasTrailingNewline;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17HTMLEndTagCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17HTMLEndTagCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17HTMLEndTagCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17HTMLEndTagComment10getTagNameEv")]
+                    internal static extern global::System.IntPtr getTagName_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST17HTMLEndTagComment10setTagNameEPKc")]
+                    internal static extern void setTagName_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new HTMLEndTagComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new HTMLEndTagComment(native.ToPointer(), skipVTables);
+                }
+
+                public static HTMLEndTagComment __CreateInstance(HTMLEndTagComment.Internal native, bool skipVTables = false)
+                {
+                    return new HTMLEndTagComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(HTMLEndTagComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.HTMLEndTagComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private HTMLEndTagComment(HTMLEndTagComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected HTMLEndTagComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public HTMLEndTagComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public HTMLEndTagComment(CppSharp.Parser.AST.HTMLEndTagComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string TagName
+                {
+                    get
+                    {
+                        var __ret = Internal.getTagName_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setTagName_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+            }
+
+            public unsafe partial class TextComment : CppSharp.Parser.AST.InlineContentComment, IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 40)]
+                public new partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.CommentKind Kind;
+
+                    [FieldOffset(4)]
+                    public byte HasTrailingNewline;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TextCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TextCommentC2ERKS2_")]
+                    internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TextCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TextComment7getTextEv")]
+                    internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST11TextComment7setTextEPKc")]
+                    internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public static new TextComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new TextComment(native.ToPointer(), skipVTables);
+                }
+
+                public static TextComment __CreateInstance(TextComment.Internal native, bool skipVTables = false)
+                {
+                    return new TextComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(TextComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(40);
+                    CppSharp.Parser.AST.TextComment.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private TextComment(TextComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected TextComment(void* native, bool skipVTables = false)
+                    : base((void*) null)
+                {
+                    __PointerAdjustment = 0;
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public TextComment()
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public TextComment(CppSharp.Parser.AST.TextComment _0)
+                    : this((void*) null)
+                {
+                    __Instance = Marshal.AllocHGlobal(40);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                protected override void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.Comment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Text
+                {
+                    get
+                    {
+                        var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+            }
+
+            public unsafe partial class RawComment : IDisposable
+            {
+                [StructLayout(LayoutKind.Explicit, Size = 80)]
+                public partial struct Internal
+                {
+                    [FieldOffset(0)]
+                    public CppSharp.Parser.AST.RawCommentKind Kind;
+
+                    [FieldOffset(72)]
+                    public global::System.IntPtr FullCommentBlock;
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawCommentC2Ev")]
+                    internal static extern void ctor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawCommentC2ERKS2_")]
+                    internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawCommentD2Ev")]
+                    internal static extern void dtor_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawComment7getTextEv")]
+                    internal static extern global::System.IntPtr getText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawComment7setTextEPKc")]
+                    internal static extern void setText_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawComment12getBriefTextEv")]
+                    internal static extern global::System.IntPtr getBriefText_0(global::System.IntPtr instance);
+
+                    [SuppressUnmanagedCodeSecurity]
+                    [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                        EntryPoint="_ZN8CppSharp9CppParser3AST10RawComment12setBriefTextEPKc")]
+                    internal static extern void setBriefText_0(global::System.IntPtr instance, global::System.IntPtr s);
+                }
+
+                public global::System.IntPtr __Instance { get; protected set; }
+
+                protected int __PointerAdjustment;
+                public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, RawComment> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, RawComment>();
+                protected void*[] __OriginalVTables;
+
+                protected bool __ownsNativeInstance;
+
+                public static RawComment __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+                {
+                    return new RawComment(native.ToPointer(), skipVTables);
+                }
+
+                public static RawComment __CreateInstance(RawComment.Internal native, bool skipVTables = false)
+                {
+                    return new RawComment(native, skipVTables);
+                }
+
+                private static void* __CopyValue(RawComment.Internal native)
+                {
+                    var ret = Marshal.AllocHGlobal(80);
+                    CppSharp.Parser.AST.RawComment.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                    return ret.ToPointer();
+                }
+
+                private RawComment(RawComment.Internal native, bool skipVTables = false)
+                    : this(__CopyValue(native), skipVTables)
+                {
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                }
+
+                protected RawComment(void* native, bool skipVTables = false)
+                {
+                    if (native == null)
+                        return;
+                    __Instance = new global::System.IntPtr(native);
+                }
+
+                public RawComment()
+                {
+                    __Instance = Marshal.AllocHGlobal(80);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    Internal.ctor_0((__Instance + __PointerAdjustment));
+                }
+
+                public RawComment(CppSharp.Parser.AST.RawComment _0)
+                {
+                    __Instance = Marshal.AllocHGlobal(80);
+                    __ownsNativeInstance = true;
+                    NativeToManagedMap[__Instance] = this;
+                    if (ReferenceEquals(_0, null))
+                        throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                    var __arg0 = _0.__Instance;
+                    Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+                }
+
+                public void Dispose()
+                {
+                    Dispose(disposing: true);
+                }
+
+                protected virtual void Dispose(bool disposing)
+                {
+                    CppSharp.Parser.AST.RawComment __dummy;
+                    NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                    Internal.dtor_0((__Instance + __PointerAdjustment));
+                    if (__ownsNativeInstance)
+                        Marshal.FreeHGlobal(__Instance);
+                }
+
+                public string Text
+                {
+                    get
+                    {
+                        var __ret = Internal.getText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public string BriefText
+                {
+                    get
+                    {
+                        var __ret = Internal.getBriefText_0((__Instance + __PointerAdjustment));
+                        return Marshal.PtrToStringAnsi(__ret);
+                    }
+
+                    set
+                    {
+                        var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                        Internal.setBriefText_0((__Instance + __PointerAdjustment), __arg0);
+                        Marshal.FreeHGlobal(__arg0);
+                    }
+                }
+
+                public CppSharp.Parser.AST.RawCommentKind Kind
+                {
+                    get
+                    {
+                        return ((Internal*) __Instance)->Kind;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->Kind = value;
+                    }
+                }
+
+                public CppSharp.Parser.AST.FullComment FullCommentBlock
+                {
+                    get
+                    {
+                        CppSharp.Parser.AST.FullComment __result0;
+                        if (((Internal*) __Instance)->FullCommentBlock == IntPtr.Zero) __result0 = null;
+                        else if (CppSharp.Parser.AST.FullComment.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->FullCommentBlock))
+                            __result0 = (CppSharp.Parser.AST.FullComment) CppSharp.Parser.AST.FullComment.NativeToManagedMap[((Internal*) __Instance)->FullCommentBlock];
+                        else __result0 = CppSharp.Parser.AST.FullComment.__CreateInstance(((Internal*) __Instance)->FullCommentBlock);
+                        return __result0;
+                    }
+
+                    set
+                    {
+                        ((Internal*) __Instance)->FullCommentBlock = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppParser.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppParser.cs
new file mode 100644
index 00000000..1707b13b
--- /dev/null
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppParser.cs
@@ -0,0 +1,1207 @@
+//----------------------------------------------------------------------------
+// <auto-generated>
+// This is autogenerated code by CppSharp.
+// Do not edit this file or all your changes will be lost after re-generation.
+// </auto-generated>
+//----------------------------------------------------------------------------
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace CppSharp
+{
+    namespace Parser
+    {
+        public enum LanguageVersion
+        {
+            /// <summary>The C programming language.</summary>
+            C = 0,
+            /// <summary>The C++ programming language year 1998; supports deprecated constructs.</summary>
+            CPlusPlus98 = 1,
+            /// <summary>The C++ programming language year 2011.</summary>
+            CPlusPlus11 = 2
+        }
+
+        public enum ParserDiagnosticLevel
+        {
+            Ignored = 0,
+            Note = 1,
+            Warning = 2,
+            Error = 3,
+            Fatal = 4
+        }
+
+        public enum ParserResultKind
+        {
+            Success = 0,
+            Error = 1,
+            FileNotFound = 2
+        }
+
+        public enum SourceLocationKind
+        {
+            Invalid = 0,
+            Builtin = 1,
+            CommandLine = 2,
+            System = 3,
+            User = 4
+        }
+
+        public unsafe partial class ParserOptions : IDisposable
+        {
+            [StructLayout(LayoutKind.Explicit, Size = 272)]
+            public partial struct Internal
+            {
+                [FieldOffset(200)]
+                public global::System.IntPtr ASTContext;
+
+                [FieldOffset(208)]
+                public int ToolSetToUse;
+
+                [FieldOffset(248)]
+                public CppSharp.Parser.AST.CppAbi Abi;
+
+                [FieldOffset(252)]
+                public byte NoStandardIncludes;
+
+                [FieldOffset(253)]
+                public byte NoBuiltinIncludes;
+
+                [FieldOffset(254)]
+                public byte MicrosoftMode;
+
+                [FieldOffset(255)]
+                public byte Verbose;
+
+                [FieldOffset(256)]
+                public CppSharp.Parser.LanguageVersion LanguageVersion;
+
+                [FieldOffset(264)]
+                public global::System.IntPtr TargetInfo;
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptionsC2Ev")]
+                internal static extern void ctor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptionsC2ERKS1_")]
+                internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptionsD2Ev")]
+                internal static extern void dtor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions12getArgumentsEj")]
+                internal static extern global::System.IntPtr getArguments_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions12addArgumentsEPKc")]
+                internal static extern void addArguments_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14clearArgumentsEv")]
+                internal static extern void clearArguments_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14getSourceFilesEj")]
+                internal static extern global::System.IntPtr getSourceFiles_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14addSourceFilesEPKc")]
+                internal static extern void addSourceFiles_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions16clearSourceFilesEv")]
+                internal static extern void clearSourceFiles_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14getIncludeDirsEj")]
+                internal static extern global::System.IntPtr getIncludeDirs_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14addIncludeDirsEPKc")]
+                internal static extern void addIncludeDirs_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions16clearIncludeDirsEv")]
+                internal static extern void clearIncludeDirs_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions20getSystemIncludeDirsEj")]
+                internal static extern global::System.IntPtr getSystemIncludeDirs_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions20addSystemIncludeDirsEPKc")]
+                internal static extern void addSystemIncludeDirs_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions22clearSystemIncludeDirsEv")]
+                internal static extern void clearSystemIncludeDirs_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions10getDefinesEj")]
+                internal static extern global::System.IntPtr getDefines_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions10addDefinesEPKc")]
+                internal static extern void addDefines_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions12clearDefinesEv")]
+                internal static extern void clearDefines_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions12getUndefinesEj")]
+                internal static extern global::System.IntPtr getUndefines_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions12addUndefinesEPKc")]
+                internal static extern void addUndefines_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14clearUndefinesEv")]
+                internal static extern void clearUndefines_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14getLibraryDirsEj")]
+                internal static extern global::System.IntPtr getLibraryDirs_0(global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14addLibraryDirsEPKc")]
+                internal static extern void addLibraryDirs_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions16clearLibraryDirsEv")]
+                internal static extern void clearLibraryDirs_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions17getArgumentsCountEv")]
+                internal static extern uint getArgumentsCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14getLibraryFileEv")]
+                internal static extern global::System.IntPtr getLibraryFile_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions14setLibraryFileEPKc")]
+                internal static extern void setLibraryFile_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions19getSourceFilesCountEv")]
+                internal static extern uint getSourceFilesCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions19getIncludeDirsCountEv")]
+                internal static extern uint getIncludeDirsCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions25getSystemIncludeDirsCountEv")]
+                internal static extern uint getSystemIncludeDirsCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions15getDefinesCountEv")]
+                internal static extern uint getDefinesCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions17getUndefinesCountEv")]
+                internal static extern uint getUndefinesCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions19getLibraryDirsCountEv")]
+                internal static extern uint getLibraryDirsCount_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions15getTargetTripleEv")]
+                internal static extern global::System.IntPtr getTargetTriple_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser13ParserOptions15setTargetTripleEPKc")]
+                internal static extern void setTargetTriple_0(global::System.IntPtr instance, global::System.IntPtr s);
+            }
+
+            public global::System.IntPtr __Instance { get; protected set; }
+
+            protected int __PointerAdjustment;
+            public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserOptions> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserOptions>();
+            protected void*[] __OriginalVTables;
+
+            protected bool __ownsNativeInstance;
+
+            public static ParserOptions __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+            {
+                return new ParserOptions(native.ToPointer(), skipVTables);
+            }
+
+            public static ParserOptions __CreateInstance(ParserOptions.Internal native, bool skipVTables = false)
+            {
+                return new ParserOptions(native, skipVTables);
+            }
+
+            private static void* __CopyValue(ParserOptions.Internal native)
+            {
+                var ret = Marshal.AllocHGlobal(272);
+                CppSharp.Parser.ParserOptions.Internal.cctor_2(ret, new global::System.IntPtr(&native));
+                return ret.ToPointer();
+            }
+
+            private ParserOptions(ParserOptions.Internal native, bool skipVTables = false)
+                : this(__CopyValue(native), skipVTables)
+            {
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+            }
+
+            protected ParserOptions(void* native, bool skipVTables = false)
+            {
+                if (native == null)
+                    return;
+                __Instance = new global::System.IntPtr(native);
+            }
+
+            public ParserOptions()
+            {
+                __Instance = Marshal.AllocHGlobal(272);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                Internal.ctor_0((__Instance + __PointerAdjustment));
+            }
+
+            public ParserOptions(CppSharp.Parser.ParserOptions _0)
+            {
+                __Instance = Marshal.AllocHGlobal(272);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                if (ReferenceEquals(_0, null))
+                    throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                var __arg0 = _0.__Instance;
+                Internal.cctor_2((__Instance + __PointerAdjustment), __arg0);
+            }
+
+            public void Dispose()
+            {
+                Dispose(disposing: true);
+            }
+
+            protected virtual void Dispose(bool disposing)
+            {
+                CppSharp.Parser.ParserOptions __dummy;
+                NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                Internal.dtor_0((__Instance + __PointerAdjustment));
+                if (__ownsNativeInstance)
+                    Marshal.FreeHGlobal(__Instance);
+            }
+
+            public string getArguments(uint i)
+            {
+                var __ret = Internal.getArguments_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addArguments(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addArguments_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearArguments()
+            {
+                Internal.clearArguments_0((__Instance + __PointerAdjustment));
+            }
+
+            public string getSourceFiles(uint i)
+            {
+                var __ret = Internal.getSourceFiles_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addSourceFiles(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addSourceFiles_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearSourceFiles()
+            {
+                Internal.clearSourceFiles_0((__Instance + __PointerAdjustment));
+            }
+
+            public string getIncludeDirs(uint i)
+            {
+                var __ret = Internal.getIncludeDirs_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addIncludeDirs(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addIncludeDirs_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearIncludeDirs()
+            {
+                Internal.clearIncludeDirs_0((__Instance + __PointerAdjustment));
+            }
+
+            public string getSystemIncludeDirs(uint i)
+            {
+                var __ret = Internal.getSystemIncludeDirs_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addSystemIncludeDirs(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addSystemIncludeDirs_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearSystemIncludeDirs()
+            {
+                Internal.clearSystemIncludeDirs_0((__Instance + __PointerAdjustment));
+            }
+
+            public string getDefines(uint i)
+            {
+                var __ret = Internal.getDefines_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addDefines(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addDefines_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearDefines()
+            {
+                Internal.clearDefines_0((__Instance + __PointerAdjustment));
+            }
+
+            public string getUndefines(uint i)
+            {
+                var __ret = Internal.getUndefines_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addUndefines(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addUndefines_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearUndefines()
+            {
+                Internal.clearUndefines_0((__Instance + __PointerAdjustment));
+            }
+
+            public string getLibraryDirs(uint i)
+            {
+                var __ret = Internal.getLibraryDirs_0((__Instance + __PointerAdjustment), i);
+                return Marshal.PtrToStringAnsi(__ret);
+            }
+
+            public void addLibraryDirs(string s)
+            {
+                var __arg0 = Marshal.StringToHGlobalAnsi(s);
+                Internal.addLibraryDirs_0((__Instance + __PointerAdjustment), __arg0);
+                Marshal.FreeHGlobal(__arg0);
+            }
+
+            public void clearLibraryDirs()
+            {
+                Internal.clearLibraryDirs_0((__Instance + __PointerAdjustment));
+            }
+
+            public uint ArgumentsCount
+            {
+                get
+                {
+                    var __ret = Internal.getArgumentsCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public string LibraryFile
+            {
+                get
+                {
+                    var __ret = Internal.getLibraryFile_0((__Instance + __PointerAdjustment));
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                set
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                    Internal.setLibraryFile_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+            }
+
+            public uint SourceFilesCount
+            {
+                get
+                {
+                    var __ret = Internal.getSourceFilesCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public uint IncludeDirsCount
+            {
+                get
+                {
+                    var __ret = Internal.getIncludeDirsCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public uint SystemIncludeDirsCount
+            {
+                get
+                {
+                    var __ret = Internal.getSystemIncludeDirsCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public uint DefinesCount
+            {
+                get
+                {
+                    var __ret = Internal.getDefinesCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public uint UndefinesCount
+            {
+                get
+                {
+                    var __ret = Internal.getUndefinesCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public uint LibraryDirsCount
+            {
+                get
+                {
+                    var __ret = Internal.getLibraryDirsCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public string TargetTriple
+            {
+                get
+                {
+                    var __ret = Internal.getTargetTriple_0((__Instance + __PointerAdjustment));
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                set
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                    Internal.setTargetTriple_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+            }
+
+            public CppSharp.Parser.AST.ASTContext ASTContext
+            {
+                get
+                {
+                    CppSharp.Parser.AST.ASTContext __result0;
+                    if (((Internal*) __Instance)->ASTContext == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.ASTContext.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->ASTContext))
+                        __result0 = (CppSharp.Parser.AST.ASTContext) CppSharp.Parser.AST.ASTContext.NativeToManagedMap[((Internal*) __Instance)->ASTContext];
+                    else __result0 = CppSharp.Parser.AST.ASTContext.__CreateInstance(((Internal*) __Instance)->ASTContext);
+                    return __result0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->ASTContext = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                }
+            }
+
+            public int ToolSetToUse
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->ToolSetToUse;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->ToolSetToUse = value;
+                }
+            }
+
+            public CppSharp.Parser.AST.CppAbi Abi
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Abi;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Abi = value;
+                }
+            }
+
+            public bool NoStandardIncludes
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->NoStandardIncludes != 0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->NoStandardIncludes = (byte) (value ? 1 : 0);
+                }
+            }
+
+            public bool NoBuiltinIncludes
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->NoBuiltinIncludes != 0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->NoBuiltinIncludes = (byte) (value ? 1 : 0);
+                }
+            }
+
+            public bool MicrosoftMode
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->MicrosoftMode != 0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->MicrosoftMode = (byte) (value ? 1 : 0);
+                }
+            }
+
+            public bool Verbose
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Verbose != 0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Verbose = (byte) (value ? 1 : 0);
+                }
+            }
+
+            public CppSharp.Parser.LanguageVersion LanguageVersion
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LanguageVersion;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LanguageVersion = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserTargetInfo TargetInfo
+            {
+                get
+                {
+                    CppSharp.Parser.ParserTargetInfo __result0;
+                    if (((Internal*) __Instance)->TargetInfo == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.ParserTargetInfo.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->TargetInfo))
+                        __result0 = (CppSharp.Parser.ParserTargetInfo) CppSharp.Parser.ParserTargetInfo.NativeToManagedMap[((Internal*) __Instance)->TargetInfo];
+                    else __result0 = CppSharp.Parser.ParserTargetInfo.__CreateInstance(((Internal*) __Instance)->TargetInfo);
+                    return __result0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->TargetInfo = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                }
+            }
+        }
+
+        public unsafe partial class ParserDiagnostic : IDisposable
+        {
+            [StructLayout(LayoutKind.Explicit, Size = 80)]
+            public partial struct Internal
+            {
+                [FieldOffset(64)]
+                public CppSharp.Parser.ParserDiagnosticLevel Level;
+
+                [FieldOffset(68)]
+                public int LineNumber;
+
+                [FieldOffset(72)]
+                public int ColumnNumber;
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnosticC2Ev")]
+                internal static extern void ctor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnosticC2ERKS1_")]
+                internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnosticD2Ev")]
+                internal static extern void dtor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnostic11getFileNameEv")]
+                internal static extern global::System.IntPtr getFileName_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnostic11setFileNameEPKc")]
+                internal static extern void setFileName_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnostic10getMessageEv")]
+                internal static extern global::System.IntPtr getMessage_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserDiagnostic10setMessageEPKc")]
+                internal static extern void setMessage_0(global::System.IntPtr instance, global::System.IntPtr s);
+            }
+
+            public global::System.IntPtr __Instance { get; protected set; }
+
+            protected int __PointerAdjustment;
+            public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserDiagnostic> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserDiagnostic>();
+            protected void*[] __OriginalVTables;
+
+            protected bool __ownsNativeInstance;
+
+            public static ParserDiagnostic __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+            {
+                return new ParserDiagnostic(native.ToPointer(), skipVTables);
+            }
+
+            public static ParserDiagnostic __CreateInstance(ParserDiagnostic.Internal native, bool skipVTables = false)
+            {
+                return new ParserDiagnostic(native, skipVTables);
+            }
+
+            private static void* __CopyValue(ParserDiagnostic.Internal native)
+            {
+                var ret = Marshal.AllocHGlobal(80);
+                CppSharp.Parser.ParserDiagnostic.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                return ret.ToPointer();
+            }
+
+            private ParserDiagnostic(ParserDiagnostic.Internal native, bool skipVTables = false)
+                : this(__CopyValue(native), skipVTables)
+            {
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+            }
+
+            protected ParserDiagnostic(void* native, bool skipVTables = false)
+            {
+                if (native == null)
+                    return;
+                __Instance = new global::System.IntPtr(native);
+            }
+
+            public ParserDiagnostic()
+            {
+                __Instance = Marshal.AllocHGlobal(80);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                Internal.ctor_0((__Instance + __PointerAdjustment));
+            }
+
+            public ParserDiagnostic(CppSharp.Parser.ParserDiagnostic _0)
+            {
+                __Instance = Marshal.AllocHGlobal(80);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                if (ReferenceEquals(_0, null))
+                    throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                var __arg0 = _0.__Instance;
+                Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+            }
+
+            public void Dispose()
+            {
+                Dispose(disposing: true);
+            }
+
+            protected virtual void Dispose(bool disposing)
+            {
+                CppSharp.Parser.ParserDiagnostic __dummy;
+                NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                Internal.dtor_0((__Instance + __PointerAdjustment));
+                if (__ownsNativeInstance)
+                    Marshal.FreeHGlobal(__Instance);
+            }
+
+            public string FileName
+            {
+                get
+                {
+                    var __ret = Internal.getFileName_0((__Instance + __PointerAdjustment));
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                set
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                    Internal.setFileName_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+            }
+
+            public string Message
+            {
+                get
+                {
+                    var __ret = Internal.getMessage_0((__Instance + __PointerAdjustment));
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                set
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                    Internal.setMessage_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+            }
+
+            public CppSharp.Parser.ParserDiagnosticLevel Level
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Level;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Level = value;
+                }
+            }
+
+            public int LineNumber
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LineNumber;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LineNumber = value;
+                }
+            }
+
+            public int ColumnNumber
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->ColumnNumber;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->ColumnNumber = value;
+                }
+            }
+        }
+
+        public unsafe partial class ParserResult : IDisposable
+        {
+            [StructLayout(LayoutKind.Explicit, Size = 56)]
+            public partial struct Internal
+            {
+                [FieldOffset(0)]
+                public CppSharp.Parser.ParserResultKind Kind;
+
+                [FieldOffset(32)]
+                public global::System.IntPtr ASTContext;
+
+                [FieldOffset(40)]
+                public global::System.IntPtr Library;
+
+                [FieldOffset(48)]
+                public global::System.IntPtr CodeParser;
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResultC2Ev")]
+                internal static extern void ctor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResultC2ERKS1_")]
+                internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResultD2Ev")]
+                internal static extern void dtor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResult14getDiagnosticsEj")]
+                internal static extern void getDiagnostics_0(global::System.IntPtr @return, global::System.IntPtr instance, uint i);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResult14addDiagnosticsERNS0_16ParserDiagnosticE")]
+                internal static extern void addDiagnostics_0(global::System.IntPtr instance, global::System.IntPtr s);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResult16clearDiagnosticsEv")]
+                internal static extern void clearDiagnostics_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser12ParserResult19getDiagnosticsCountEv")]
+                internal static extern uint getDiagnosticsCount_0(global::System.IntPtr instance);
+            }
+
+            public global::System.IntPtr __Instance { get; protected set; }
+
+            protected int __PointerAdjustment;
+            public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserResult> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserResult>();
+            protected void*[] __OriginalVTables;
+
+            protected bool __ownsNativeInstance;
+
+            public static ParserResult __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+            {
+                return new ParserResult(native.ToPointer(), skipVTables);
+            }
+
+            public static ParserResult __CreateInstance(ParserResult.Internal native, bool skipVTables = false)
+            {
+                return new ParserResult(native, skipVTables);
+            }
+
+            private static void* __CopyValue(ParserResult.Internal native)
+            {
+                var ret = Marshal.AllocHGlobal(56);
+                CppSharp.Parser.ParserResult.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                return ret.ToPointer();
+            }
+
+            private ParserResult(ParserResult.Internal native, bool skipVTables = false)
+                : this(__CopyValue(native), skipVTables)
+            {
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+            }
+
+            protected ParserResult(void* native, bool skipVTables = false)
+            {
+                if (native == null)
+                    return;
+                __Instance = new global::System.IntPtr(native);
+            }
+
+            public ParserResult()
+            {
+                __Instance = Marshal.AllocHGlobal(56);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                Internal.ctor_0((__Instance + __PointerAdjustment));
+            }
+
+            public ParserResult(CppSharp.Parser.ParserResult _0)
+            {
+                __Instance = Marshal.AllocHGlobal(56);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                if (ReferenceEquals(_0, null))
+                    throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                var __arg0 = _0.__Instance;
+                Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+            }
+
+            public void Dispose()
+            {
+                Dispose(disposing: true);
+            }
+
+            protected virtual void Dispose(bool disposing)
+            {
+                CppSharp.Parser.ParserResult __dummy;
+                NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                Internal.dtor_0((__Instance + __PointerAdjustment));
+                if (__ownsNativeInstance)
+                    Marshal.FreeHGlobal(__Instance);
+            }
+
+            public CppSharp.Parser.ParserDiagnostic getDiagnostics(uint i)
+            {
+                var __ret = new CppSharp.Parser.ParserDiagnostic.Internal();
+                Internal.getDiagnostics_0(new IntPtr(&__ret), (__Instance + __PointerAdjustment), i);
+                return CppSharp.Parser.ParserDiagnostic.__CreateInstance(__ret);
+            }
+
+            public void addDiagnostics(CppSharp.Parser.ParserDiagnostic s)
+            {
+                if (ReferenceEquals(s, null))
+                    throw new global::System.ArgumentNullException("s", "Cannot be null because it is a C++ reference (&).");
+                var __arg0 = s.__Instance;
+                Internal.addDiagnostics_0((__Instance + __PointerAdjustment), __arg0);
+            }
+
+            public void clearDiagnostics()
+            {
+                Internal.clearDiagnostics_0((__Instance + __PointerAdjustment));
+            }
+
+            public uint DiagnosticsCount
+            {
+                get
+                {
+                    var __ret = Internal.getDiagnosticsCount_0((__Instance + __PointerAdjustment));
+                    return __ret;
+                }
+            }
+
+            public CppSharp.Parser.ParserResultKind Kind
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Kind;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Kind = value;
+                }
+            }
+
+            public CppSharp.Parser.AST.ASTContext ASTContext
+            {
+                get
+                {
+                    CppSharp.Parser.AST.ASTContext __result0;
+                    if (((Internal*) __Instance)->ASTContext == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.ASTContext.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->ASTContext))
+                        __result0 = (CppSharp.Parser.AST.ASTContext) CppSharp.Parser.AST.ASTContext.NativeToManagedMap[((Internal*) __Instance)->ASTContext];
+                    else __result0 = CppSharp.Parser.AST.ASTContext.__CreateInstance(((Internal*) __Instance)->ASTContext);
+                    return __result0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->ASTContext = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                }
+            }
+
+            public CppSharp.Parser.AST.NativeLibrary Library
+            {
+                get
+                {
+                    CppSharp.Parser.AST.NativeLibrary __result0;
+                    if (((Internal*) __Instance)->Library == IntPtr.Zero) __result0 = null;
+                    else if (CppSharp.Parser.AST.NativeLibrary.NativeToManagedMap.ContainsKey(((Internal*) __Instance)->Library))
+                        __result0 = (CppSharp.Parser.AST.NativeLibrary) CppSharp.Parser.AST.NativeLibrary.NativeToManagedMap[((Internal*) __Instance)->Library];
+                    else __result0 = CppSharp.Parser.AST.NativeLibrary.__CreateInstance(((Internal*) __Instance)->Library);
+                    return __result0;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Library = ReferenceEquals(value, null) ? global::System.IntPtr.Zero : value.__Instance;
+                }
+            }
+        }
+
+        public unsafe partial class ClangParser : IDisposable
+        {
+            [StructLayout(LayoutKind.Explicit, Size = 0)]
+            public partial struct Internal
+            {
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser11ClangParserC2ERKS1_")]
+                internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser11ClangParser11ParseHeaderEPNS0_13ParserOptionsE")]
+                internal static extern global::System.IntPtr ParseHeader_0(global::System.IntPtr Opts);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser11ClangParser12ParseLibraryEPNS0_13ParserOptionsE")]
+                internal static extern global::System.IntPtr ParseLibrary_0(global::System.IntPtr Opts);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser11ClangParser13GetTargetInfoEPNS0_13ParserOptionsE")]
+                internal static extern global::System.IntPtr GetTargetInfo_0(global::System.IntPtr Opts);
+            }
+
+            public global::System.IntPtr __Instance { get; protected set; }
+
+            protected int __PointerAdjustment;
+            public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ClangParser> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ClangParser>();
+            protected void*[] __OriginalVTables;
+
+            protected bool __ownsNativeInstance;
+
+            public static ClangParser __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+            {
+                return new ClangParser(native.ToPointer(), skipVTables);
+            }
+
+            public static ClangParser __CreateInstance(ClangParser.Internal native, bool skipVTables = false)
+            {
+                return new ClangParser(native, skipVTables);
+            }
+
+            private static void* __CopyValue(ClangParser.Internal native)
+            {
+                var ret = Marshal.AllocHGlobal(0);
+                *(ClangParser.Internal*) ret = native;
+                return ret.ToPointer();
+            }
+
+            private ClangParser(ClangParser.Internal native, bool skipVTables = false)
+                : this(__CopyValue(native), skipVTables)
+            {
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+            }
+
+            protected ClangParser(void* native, bool skipVTables = false)
+            {
+                if (native == null)
+                    return;
+                __Instance = new global::System.IntPtr(native);
+            }
+
+            public ClangParser()
+            {
+                __Instance = Marshal.AllocHGlobal(0);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+            }
+
+            public ClangParser(CppSharp.Parser.ClangParser _0)
+            {
+                __Instance = Marshal.AllocHGlobal(0);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                *((ClangParser.Internal*) __Instance) = *((ClangParser.Internal*) _0.__Instance);
+            }
+
+            public void Dispose()
+            {
+                Dispose(disposing: true);
+            }
+
+            protected virtual void Dispose(bool disposing)
+            {
+                CppSharp.Parser.ClangParser __dummy;
+                NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                if (__ownsNativeInstance)
+                    Marshal.FreeHGlobal(__Instance);
+            }
+
+            public static CppSharp.Parser.ParserResult ParseHeader(CppSharp.Parser.ParserOptions Opts)
+            {
+                var __arg0 = ReferenceEquals(Opts, null) ? global::System.IntPtr.Zero : Opts.__Instance;
+                var __ret = Internal.ParseHeader_0(__arg0);
+                CppSharp.Parser.ParserResult __result0;
+                if (__ret == IntPtr.Zero) __result0 = null;
+                else if (CppSharp.Parser.ParserResult.NativeToManagedMap.ContainsKey(__ret))
+                    __result0 = (CppSharp.Parser.ParserResult) CppSharp.Parser.ParserResult.NativeToManagedMap[__ret];
+                else __result0 = CppSharp.Parser.ParserResult.__CreateInstance(__ret);
+                return __result0;
+            }
+
+            public static CppSharp.Parser.ParserResult ParseLibrary(CppSharp.Parser.ParserOptions Opts)
+            {
+                var __arg0 = ReferenceEquals(Opts, null) ? global::System.IntPtr.Zero : Opts.__Instance;
+                var __ret = Internal.ParseLibrary_0(__arg0);
+                CppSharp.Parser.ParserResult __result0;
+                if (__ret == IntPtr.Zero) __result0 = null;
+                else if (CppSharp.Parser.ParserResult.NativeToManagedMap.ContainsKey(__ret))
+                    __result0 = (CppSharp.Parser.ParserResult) CppSharp.Parser.ParserResult.NativeToManagedMap[__ret];
+                else __result0 = CppSharp.Parser.ParserResult.__CreateInstance(__ret);
+                return __result0;
+            }
+
+            public static CppSharp.Parser.ParserTargetInfo GetTargetInfo(CppSharp.Parser.ParserOptions Opts)
+            {
+                var __arg0 = ReferenceEquals(Opts, null) ? global::System.IntPtr.Zero : Opts.__Instance;
+                var __ret = Internal.GetTargetInfo_0(__arg0);
+                CppSharp.Parser.ParserTargetInfo __result0;
+                if (__ret == IntPtr.Zero) __result0 = null;
+                else if (CppSharp.Parser.ParserTargetInfo.NativeToManagedMap.ContainsKey(__ret))
+                    __result0 = (CppSharp.Parser.ParserTargetInfo) CppSharp.Parser.ParserTargetInfo.NativeToManagedMap[__ret];
+                else __result0 = CppSharp.Parser.ParserTargetInfo.__CreateInstance(__ret);
+                return __result0;
+            }
+        }
+    }
+}
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.dll-templates.cpp b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.dll-templates.cpp
new file mode 100644
index 00000000..021e4448
--- /dev/null
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/CppSharp.CppParser.dll-templates.cpp
@@ -0,0 +1,29 @@
+#include <AST.h>
+#include <Sources.h>
+#include <CppParser.h>
+
+template class vector<CppSharp::CppParser::AST::Namespace*>;
+template class vector<CppSharp::CppParser::AST::Enumeration*>;
+template class vector<CppSharp::CppParser::AST::Function*>;
+template class vector<CppSharp::CppParser::AST::Class*>;
+template class vector<CppSharp::CppParser::AST::Template*>;
+template class vector<CppSharp::CppParser::AST::TypedefDecl*>;
+template class vector<CppSharp::CppParser::AST::TypeAlias*>;
+template class vector<CppSharp::CppParser::AST::Variable*>;
+template class vector<CppSharp::CppParser::AST::Friend*>;
+template class vector<CppSharp::CppParser::AST::BaseClassSpecifier*>;
+template class vector<CppSharp::CppParser::AST::Field*>;
+template class vector<CppSharp::CppParser::AST::Method*>;
+template class vector<CppSharp::CppParser::AST::AccessSpecifierDecl*>;
+template class vector<CppSharp::CppParser::AST::Declaration*>;
+template class vector<CppSharp::CppParser::AST::FunctionTemplateSpecialization*>;
+template class vector<CppSharp::CppParser::AST::Parameter*>;
+template class vector<CppSharp::CppParser::AST::ClassTemplateSpecialization*>;
+template class vector<CppSharp::CppParser::AST::Enumeration::Item*>;
+template class vector<CppSharp::CppParser::AST::BlockContentComment*>;
+template class vector<CppSharp::CppParser::AST::PreprocessedEntity*>;
+template class vector<CppSharp::CppParser::AST::Expression*>;
+template class vector<CppSharp::CppParser::AST::MacroDefinition*>;
+template class vector<CppSharp::CppParser::AST::TranslationUnit*>;
+template class vector<CppSharp::CppParser::AST::InlineContentComment*>;
+template class vector<CppSharp::CppParser::AST::VerbatimBlockLineComment*>;
\ No newline at end of file
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Sources.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Sources.cs
new file mode 100644
index 00000000..f088944b
--- /dev/null
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Sources.cs
@@ -0,0 +1,97 @@
+//----------------------------------------------------------------------------
+// <auto-generated>
+// This is autogenerated code by CppSharp.
+// Do not edit this file or all your changes will be lost after re-generation.
+// </auto-generated>
+//----------------------------------------------------------------------------
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace CppSharp
+{
+    namespace Parser
+    {
+        public unsafe partial struct SourceLocation
+        {
+            [StructLayout(LayoutKind.Explicit, Size = 4)]
+            public partial struct Internal
+            {
+                [FieldOffset(0)]
+                public uint ID;
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser14SourceLocationC2Ev")]
+                internal static extern void ctor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser14SourceLocationC2Ej")]
+                internal static extern void ctor_1(global::System.IntPtr instance, uint ID);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser14SourceLocationC2ERKS1_")]
+                internal static extern void cctor_2(global::System.IntPtr instance, global::System.IntPtr _0);
+            }
+
+            private SourceLocation.Internal __instance;
+            public SourceLocation.Internal __Instance { get { return __instance; } }
+
+            public static SourceLocation __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+            {
+                return new SourceLocation(native.ToPointer(), skipVTables);
+            }
+
+            public static SourceLocation __CreateInstance(SourceLocation.Internal native, bool skipVTables = false)
+            {
+                return new SourceLocation(native, skipVTables);
+            }
+
+            private SourceLocation(SourceLocation.Internal native, bool skipVTables = false)
+                : this()
+            {
+                __instance = native;
+            }
+
+            private SourceLocation(void* native, bool skipVTables = false) : this()
+            {
+                __instance = *(Internal*) native;
+            }
+
+            public SourceLocation(uint ID)
+                : this()
+            {
+                fixed (Internal* __instancePtr = &__instance)
+                {
+                    Internal.ctor_1(new global::System.IntPtr(__instancePtr), ID);
+                }
+            }
+
+            public SourceLocation(CppSharp.Parser.SourceLocation _0)
+                : this()
+            {
+                var ____arg0 = _0.__Instance;
+                var __arg0 = new global::System.IntPtr(&____arg0);
+                fixed (Internal* __instancePtr = &__instance)
+                {
+                    Internal.cctor_2(new global::System.IntPtr(__instancePtr), __arg0);
+                }
+            }
+
+            public uint ID
+            {
+                get
+                {
+                    return __instance.ID;
+                }
+
+                set
+                {
+                    __instance.ID = value;
+                }
+            }
+        }
+    }
+}
diff --git a/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Target.cs b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Target.cs
new file mode 100644
index 00000000..7dfd2c4d
--- /dev/null
+++ b/src/CppParser/Bindings/CSharp/x86_64-linux-gnu-cxx11abi/Target.cs
@@ -0,0 +1,758 @@
+//----------------------------------------------------------------------------
+// <auto-generated>
+// This is autogenerated code by CppSharp.
+// Do not edit this file or all your changes will be lost after re-generation.
+// </auto-generated>
+//----------------------------------------------------------------------------
+using System;
+using System.Runtime.InteropServices;
+using System.Security;
+
+namespace CppSharp
+{
+    namespace Parser
+    {
+        public enum ParserIntType
+        {
+            NoInt = 0,
+            SignedChar = 1,
+            UnsignedChar = 2,
+            SignedShort = 3,
+            UnsignedShort = 4,
+            SignedInt = 5,
+            UnsignedInt = 6,
+            SignedLong = 7,
+            UnsignedLong = 8,
+            SignedLongLong = 9,
+            UnsignedLongLong = 10
+        }
+
+        public unsafe partial class ParserTargetInfo : IDisposable
+        {
+            [StructLayout(LayoutKind.Explicit, Size = 184)]
+            public partial struct Internal
+            {
+                [FieldOffset(32)]
+                public CppSharp.Parser.ParserIntType Char16Type;
+
+                [FieldOffset(36)]
+                public CppSharp.Parser.ParserIntType Char32Type;
+
+                [FieldOffset(40)]
+                public CppSharp.Parser.ParserIntType Int64Type;
+
+                [FieldOffset(44)]
+                public CppSharp.Parser.ParserIntType IntMaxType;
+
+                [FieldOffset(48)]
+                public CppSharp.Parser.ParserIntType IntPtrType;
+
+                [FieldOffset(52)]
+                public CppSharp.Parser.ParserIntType SizeType;
+
+                [FieldOffset(56)]
+                public CppSharp.Parser.ParserIntType UIntMaxType;
+
+                [FieldOffset(60)]
+                public CppSharp.Parser.ParserIntType WCharType;
+
+                [FieldOffset(64)]
+                public CppSharp.Parser.ParserIntType WIntType;
+
+                [FieldOffset(68)]
+                public uint BoolAlign;
+
+                [FieldOffset(72)]
+                public uint BoolWidth;
+
+                [FieldOffset(76)]
+                public uint CharAlign;
+
+                [FieldOffset(80)]
+                public uint CharWidth;
+
+                [FieldOffset(84)]
+                public uint Char16Align;
+
+                [FieldOffset(88)]
+                public uint Char16Width;
+
+                [FieldOffset(92)]
+                public uint Char32Align;
+
+                [FieldOffset(96)]
+                public uint Char32Width;
+
+                [FieldOffset(100)]
+                public uint HalfAlign;
+
+                [FieldOffset(104)]
+                public uint HalfWidth;
+
+                [FieldOffset(108)]
+                public uint FloatAlign;
+
+                [FieldOffset(112)]
+                public uint FloatWidth;
+
+                [FieldOffset(116)]
+                public uint DoubleAlign;
+
+                [FieldOffset(120)]
+                public uint DoubleWidth;
+
+                [FieldOffset(124)]
+                public uint ShortAlign;
+
+                [FieldOffset(128)]
+                public uint ShortWidth;
+
+                [FieldOffset(132)]
+                public uint IntAlign;
+
+                [FieldOffset(136)]
+                public uint IntWidth;
+
+                [FieldOffset(140)]
+                public uint IntMaxTWidth;
+
+                [FieldOffset(144)]
+                public uint LongAlign;
+
+                [FieldOffset(148)]
+                public uint LongWidth;
+
+                [FieldOffset(152)]
+                public uint LongDoubleAlign;
+
+                [FieldOffset(156)]
+                public uint LongDoubleWidth;
+
+                [FieldOffset(160)]
+                public uint LongLongAlign;
+
+                [FieldOffset(164)]
+                public uint LongLongWidth;
+
+                [FieldOffset(168)]
+                public uint PointerAlign;
+
+                [FieldOffset(172)]
+                public uint PointerWidth;
+
+                [FieldOffset(176)]
+                public uint WCharAlign;
+
+                [FieldOffset(180)]
+                public uint WCharWidth;
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserTargetInfoC2Ev")]
+                internal static extern void ctor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserTargetInfoC2ERKS1_")]
+                internal static extern void cctor_1(global::System.IntPtr instance, global::System.IntPtr _0);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserTargetInfoD2Ev")]
+                internal static extern void dtor_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserTargetInfo6getABIEv")]
+                internal static extern global::System.IntPtr getABI_0(global::System.IntPtr instance);
+
+                [SuppressUnmanagedCodeSecurity]
+                [DllImport("CppSharp.CppParser.dll", CallingConvention = global::System.Runtime.InteropServices.CallingConvention.Cdecl,
+                    EntryPoint="_ZN8CppSharp9CppParser16ParserTargetInfo6setABIEPKc")]
+                internal static extern void setABI_0(global::System.IntPtr instance, global::System.IntPtr s);
+            }
+
+            public global::System.IntPtr __Instance { get; protected set; }
+
+            protected int __PointerAdjustment;
+            public static readonly System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserTargetInfo> NativeToManagedMap = new System.Collections.Concurrent.ConcurrentDictionary<IntPtr, ParserTargetInfo>();
+            protected void*[] __OriginalVTables;
+
+            protected bool __ownsNativeInstance;
+
+            public static ParserTargetInfo __CreateInstance(global::System.IntPtr native, bool skipVTables = false)
+            {
+                return new ParserTargetInfo(native.ToPointer(), skipVTables);
+            }
+
+            public static ParserTargetInfo __CreateInstance(ParserTargetInfo.Internal native, bool skipVTables = false)
+            {
+                return new ParserTargetInfo(native, skipVTables);
+            }
+
+            private static void* __CopyValue(ParserTargetInfo.Internal native)
+            {
+                var ret = Marshal.AllocHGlobal(184);
+                CppSharp.Parser.ParserTargetInfo.Internal.cctor_1(ret, new global::System.IntPtr(&native));
+                return ret.ToPointer();
+            }
+
+            private ParserTargetInfo(ParserTargetInfo.Internal native, bool skipVTables = false)
+                : this(__CopyValue(native), skipVTables)
+            {
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+            }
+
+            protected ParserTargetInfo(void* native, bool skipVTables = false)
+            {
+                if (native == null)
+                    return;
+                __Instance = new global::System.IntPtr(native);
+            }
+
+            public ParserTargetInfo()
+            {
+                __Instance = Marshal.AllocHGlobal(184);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                Internal.ctor_0((__Instance + __PointerAdjustment));
+            }
+
+            public ParserTargetInfo(CppSharp.Parser.ParserTargetInfo _0)
+            {
+                __Instance = Marshal.AllocHGlobal(184);
+                __ownsNativeInstance = true;
+                NativeToManagedMap[__Instance] = this;
+                if (ReferenceEquals(_0, null))
+                    throw new global::System.ArgumentNullException("_0", "Cannot be null because it is a C++ reference (&).");
+                var __arg0 = _0.__Instance;
+                Internal.cctor_1((__Instance + __PointerAdjustment), __arg0);
+            }
+
+            public void Dispose()
+            {
+                Dispose(disposing: true);
+            }
+
+            protected virtual void Dispose(bool disposing)
+            {
+                CppSharp.Parser.ParserTargetInfo __dummy;
+                NativeToManagedMap.TryRemove(__Instance, out __dummy);
+                Internal.dtor_0((__Instance + __PointerAdjustment));
+                if (__ownsNativeInstance)
+                    Marshal.FreeHGlobal(__Instance);
+            }
+
+            public string ABI
+            {
+                get
+                {
+                    var __ret = Internal.getABI_0((__Instance + __PointerAdjustment));
+                    return Marshal.PtrToStringAnsi(__ret);
+                }
+
+                set
+                {
+                    var __arg0 = Marshal.StringToHGlobalAnsi(value);
+                    Internal.setABI_0((__Instance + __PointerAdjustment), __arg0);
+                    Marshal.FreeHGlobal(__arg0);
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType Char16Type
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Char16Type;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Char16Type = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType Char32Type
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Char32Type;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Char32Type = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType Int64Type
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Int64Type;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Int64Type = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType IntMaxType
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->IntMaxType;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->IntMaxType = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType IntPtrType
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->IntPtrType;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->IntPtrType = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType SizeType
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->SizeType;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->SizeType = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType UIntMaxType
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->UIntMaxType;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->UIntMaxType = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType WCharType
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->WCharType;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->WCharType = value;
+                }
+            }
+
+            public CppSharp.Parser.ParserIntType WIntType
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->WIntType;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->WIntType = value;
+                }
+            }
+
+            public uint BoolAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->BoolAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->BoolAlign = value;
+                }
+            }
+
+            public uint BoolWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->BoolWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->BoolWidth = value;
+                }
+            }
+
+            public uint CharAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->CharAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->CharAlign = value;
+                }
+            }
+
+            public uint CharWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->CharWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->CharWidth = value;
+                }
+            }
+
+            public uint Char16Align
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Char16Align;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Char16Align = value;
+                }
+            }
+
+            public uint Char16Width
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Char16Width;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Char16Width = value;
+                }
+            }
+
+            public uint Char32Align
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Char32Align;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Char32Align = value;
+                }
+            }
+
+            public uint Char32Width
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->Char32Width;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->Char32Width = value;
+                }
+            }
+
+            public uint HalfAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->HalfAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->HalfAlign = value;
+                }
+            }
+
+            public uint HalfWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->HalfWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->HalfWidth = value;
+                }
+            }
+
+            public uint FloatAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->FloatAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->FloatAlign = value;
+                }
+            }
+
+            public uint FloatWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->FloatWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->FloatWidth = value;
+                }
+            }
+
+            public uint DoubleAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->DoubleAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->DoubleAlign = value;
+                }
+            }
+
+            public uint DoubleWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->DoubleWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->DoubleWidth = value;
+                }
+            }
+
+            public uint ShortAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->ShortAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->ShortAlign = value;
+                }
+            }
+
+            public uint ShortWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->ShortWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->ShortWidth = value;
+                }
+            }
+
+            public uint IntAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->IntAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->IntAlign = value;
+                }
+            }
+
+            public uint IntWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->IntWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->IntWidth = value;
+                }
+            }
+
+            public uint IntMaxTWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->IntMaxTWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->IntMaxTWidth = value;
+                }
+            }
+
+            public uint LongAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LongAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LongAlign = value;
+                }
+            }
+
+            public uint LongWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LongWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LongWidth = value;
+                }
+            }
+
+            public uint LongDoubleAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LongDoubleAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LongDoubleAlign = value;
+                }
+            }
+
+            public uint LongDoubleWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LongDoubleWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LongDoubleWidth = value;
+                }
+            }
+
+            public uint LongLongAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LongLongAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LongLongAlign = value;
+                }
+            }
+
+            public uint LongLongWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->LongLongWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->LongLongWidth = value;
+                }
+            }
+
+            public uint PointerAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->PointerAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->PointerAlign = value;
+                }
+            }
+
+            public uint PointerWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->PointerWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->PointerWidth = value;
+                }
+            }
+
+            public uint WCharAlign
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->WCharAlign;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->WCharAlign = value;
+                }
+            }
+
+            public uint WCharWidth
+            {
+                get
+                {
+                    return ((Internal*) __Instance)->WCharWidth;
+                }
+
+                set
+                {
+                    ((Internal*) __Instance)->WCharWidth = value;
+                }
+            }
+        }
+    }
+}
diff --git a/src/CppParser/Bindings/ParserGen.cs b/src/CppParser/Bindings/ParserGen.cs
index 766c1e0c..49e4361a 100644
--- a/src/CppParser/Bindings/ParserGen.cs
+++ b/src/CppParser/Bindings/ParserGen.cs
@@ -15,17 +15,18 @@ namespace CppSharp
     /// </summary>
     class ParserGen : ILibrary
     {
-        const string LINUX_INCLUDE_BASE_DIR = "../../../../build/headers/x86_64-linux-gnu";
-
         internal readonly GeneratorKind Kind;
         internal readonly string Triple;
         internal readonly CppAbi Abi;
+        internal readonly bool IsGnuCpp11Abi;
 
-        public ParserGen(GeneratorKind kind, string triple, CppAbi abi)
+        public ParserGen(GeneratorKind kind, string triple, CppAbi abi,
+            bool isGnuCpp11Abi = false)
         {
             Kind = kind;
             Triple = triple;
             Abi = abi;
+            IsGnuCpp11Abi = isGnuCpp11Abi;
         }
 
         static string GetSourceDirectory(string dir)
@@ -77,31 +78,47 @@ namespace CppSharp
             options.OutputDir = Path.Combine(GetSourceDirectory("src"), "CppParser",
                 "Bindings", Kind.ToString());
 
+            var extraTriple = IsGnuCpp11Abi ? "-cxx11abi" : string.Empty;
+
             if (Kind == GeneratorKind.CSharp)
-                options.OutputDir = Path.Combine(options.OutputDir, options.TargetTriple);
+                options.OutputDir = Path.Combine(options.OutputDir, options.TargetTriple + extraTriple);
 
             options.GenerateLibraryNamespace = false;
             options.CheckSymbols = false;
         }
 
-        private static void SetupLinuxOptions(DriverOptions options)
+        private void SetupLinuxOptions(DriverOptions options)
         {
             options.MicrosoftMode = false;
             options.NoBuiltinIncludes = true;
 
-            string[] sysincdirs = new[] {
-                "/usr/include/c++/4.8",
-                "/usr/include/x86_64-linux-gnu/c++/4.8",
-                "/usr/include/c++/4.8/backward",
-                "/usr/lib/gcc/x86_64-linux-gnu/4.8/include",
-                "/usr/include/x86_64-linux-gnu",
-                "/usr/include",
+            var headersPath = Platform.IsLinux ? string.Empty :
+                Path.Combine(GetSourceDirectory("build"), "headers", "x86_64-linux-gnu");
+
+            // Search for the available GCC versions on the provided headers.
+            var versions = Directory.EnumerateDirectories(Path.Combine(headersPath,
+                "usr/include/c++"));
+
+            if (versions.Count() == 0)
+                throw new Exception("No valid GCC version found on system include paths");
+
+            string gccVersionPath = versions.First();
+            string gccVersion = gccVersionPath.Substring(
+                gccVersionPath.LastIndexOf(Path.DirectorySeparatorChar) + 1);
+
+            string[] systemIncludeDirs = new[] {
+                Path.Combine("usr", "include", "c++", gccVersion),
+                Path.Combine("usr", "include", "x86_64-linux-gnu", "c++", gccVersion),
+                Path.Combine("usr", "include", "c++", gccVersion, "backward"),
+                Path.Combine("usr", "lib", "gcc", "x86_64-linux-gnu", gccVersion, "include"),
+                Path.Combine("usr", "include", "x86_64-linux-gnu"),
+                Path.Combine("usr", "include")
             };
 
-            foreach (var dir in sysincdirs)
-            {
-                options.addSystemIncludeDirs(LINUX_INCLUDE_BASE_DIR + dir);
-            }
+            foreach (var dir in systemIncludeDirs)
+                options.addSystemIncludeDirs(Path.Combine(headersPath, dir));
+
+            options.addDefines("_GLIBCXX_USE_CXX11_ABI=" + (IsGnuCpp11Abi ? "1" : "0"));
         }
 
         private static void SetupMacOptions(DriverOptions options)
@@ -183,13 +200,18 @@ namespace CppSharp
                 Console.WriteLine();
             }
 
-
-            if (Directory.Exists(LINUX_INCLUDE_BASE_DIR))
+            var linuxHeadersPath = Path.Combine(GetSourceDirectory("build"), @"headers\x86_64-linux-gnu");
+            if (Directory.Exists(linuxHeadersPath) || Platform.IsLinux)
             {
                 Console.WriteLine("Generating the C# parser bindings for Linux...");
                 ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "x86_64-linux-gnu",
                      CppAbi.Itanium));
                 Console.WriteLine();
+
+                Console.WriteLine("Generating the C# parser bindings for Linux (GCC C++11 ABI)...");
+                ConsoleDriver.Run(new ParserGen(GeneratorKind.CSharp, "x86_64-linux-gnu",
+                     CppAbi.Itanium, isGnuCpp11Abi: true));
+                Console.WriteLine();
             }
         }
     }