private void CreateTable_NativeMemoryRegions(List <APITable> tables)
        {
            APITable table = new APITable(this, m_Snapshot, m_Snapshot.nativeMemoryRegions.dataSet);

            table.AddColumn(
                new MetaColumn("parentIndex", "parentIndex", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeMemoryRegions.parentIndex)
                );
            table.AddColumn(
                new MetaColumn("name", "name", typeof(string), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeMemoryRegions.memoryRegionName)
                );
            table.AddColumn(
                new MetaColumn("addressBase", "addressBase", typeof(ulong), true, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeMemoryRegions.addressBase)
                );
            table.AddColumn(
                new MetaColumn("addressSize", "addressSize", typeof(ulong), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(ulong)), "size")
                , DataArray.MakeColumn(m_Snapshot.nativeMemoryRegions.addressSize)
                );
            table.AddColumn(
                new MetaColumn("firstAllocationIndex", "firstAllocationIndex", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeMemoryRegions.firstAllocationIndex)
                );
            table.AddColumn(
                new MetaColumn("numAllocations", "numAllocations", typeof(int), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(int)))
                , DataArray.MakeColumn(m_Snapshot.nativeMemoryRegions.numAllocations)
                );
            table.CreateTable(kPrefixTableName + "NativeMemoryRegion", kPrefixTableDisplayName + "Native Memory Region");
            AddTable(table, tables);
        }
        private void CreateTable_TypeDescriptions(List <APITable> tables)
        {
            APITable table = new APITable(this, m_Snapshot, m_Snapshot.typeDescriptions.dataSet);


            table.AddColumn(
                new MetaColumn("name", "name", typeof(string), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.typeDescriptions.typeDescriptionName)
                );
            table.AddColumn(
                new MetaColumn("assembly", "assembly", typeof(string), true, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.typeDescriptions.assembly)
                );

            table.AddColumn(
                new MetaColumn("isValueType", "isValueType", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.typeDescriptions.flags, (a) => HasBit(a, TypeFlags.kValueType), (ref TypeFlags o, bool v) => SetBit(ref o, TypeFlags.kValueType, v))
                );
            table.AddColumn(
                new MetaColumn("isArray", "isArray", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.typeDescriptions.flags, (a) => HasBit(a, TypeFlags.kArray), (ref TypeFlags o, bool v) => SetBit(ref o, TypeFlags.kArray, v))
                );

            table.AddColumn(
                new MetaColumn("arrayRank", "arrayRank", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.typeDescriptions.flags, (a) => GetBits(a, TypeFlags.kArrayRankMask, 16), (ref TypeFlags o, int v) => SetBits(ref o, TypeFlags.kArrayRankMask, 16, v))
                );
            table.AddColumn(
                new MetaColumn("baseOrElementTypeIndex", "baseOrElementTypeIndex", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.typeDescriptions.baseOrElementTypeIndex)
                );
            table.AddColumn(
                new MetaColumn("size", "size", typeof(int), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(int)), "size")
                , DataArray.MakeColumn(m_Snapshot.typeDescriptions.size)
                );
            table.AddColumn(
                new MetaColumn("typeInfoAddress", "typeInfoAddress", typeof(ulong), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.typeDescriptions.typeInfoAddress)
                );
            table.AddColumn(
                new MetaColumn("typeIndex", "typeIndex", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.typeDescriptions.typeIndex)
                );
            table.CreateTable(kPrefixTableName + "ManagedType", kPrefixTableDisplayName + "Managed Type");
            AddTable(table, tables);
        }
        private void CreateTable_NativeAllocations(List <APITable> tables)
        {
            APITable table = new APITable(this, m_Snapshot, m_Snapshot.nativeAllocations.dataSet);

            table.AddColumn(
                new MetaColumn("rootReferenceId", "Root Reference Id", typeof(long), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.rootReferenceId)
                );
            table.AddColumn(
                new MetaColumn("memoryRegionIndex", "Memory Region Index", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.memoryRegionIndex)
                );
            table.AddColumn(
                new MetaColumn("allocationSiteId", "Allocation Site Id", typeof(long), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.allocationSiteId)
                );
            table.AddColumn(
                new MetaColumn("address", "Address", typeof(ulong), true, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.address)
                );
            table.AddColumn(
                new MetaColumn("size", "Size", typeof(ulong), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(ulong)), "size")
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.size)
                );
            table.AddColumn(
                new MetaColumn("overheadSize", "Overhead Size", typeof(int), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(int)), "size")
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.overheadSize)
                );
            table.AddColumn(
                new MetaColumn("paddingSize", "Padding Size", typeof(int), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(int)), "size")
                , DataArray.MakeColumn(m_Snapshot.nativeAllocations.paddingSize)
                );
            table.CreateTable(kPrefixTableName + "NativeAllocation", kPrefixTableDisplayName + "Native Allocation");
            AddTable(table, tables);
        }
        private void CreateTable_RootReferences(List <APITable> tables)
        {
            APITable table = new APITable(this, m_Snapshot, m_Snapshot.nativeRootReferences.dataSet);

            table.AddColumn(
                new MetaColumn("id", "id", typeof(long), true, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeRootReferences.id)
                );
            table.AddColumn(
                new MetaColumn("areaName", "areaName", typeof(string), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeRootReferences.areaName)
                );
            table.AddColumn(
                new MetaColumn("objectName", "objectName", typeof(string), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeRootReferences.objectName)
                );
            table.AddColumn(
                new MetaColumn("accumulatedSize", "accumulatedSize", typeof(ulong), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(ulong)), "size")
                , DataArray.MakeColumn(m_Snapshot.nativeRootReferences.accumulatedSize)
                );
            table.CreateTable(kPrefixTableName + "RootReference", kPrefixTableDisplayName + "Root Reference");
            AddTable(table, tables);
        }
        static ObjectTable()
        {
            s_Meta = new Database.MetaTable[(int)ObjectMetaType.Count];

            var metaManaged = new Database.MetaTable();
            var metaNative  = new Database.MetaTable();

            s_Meta[(int)ObjectMetaType.Managed] = metaManaged;
            s_Meta[(int)ObjectMetaType.Native]  = metaNative;
            s_Meta[(int)ObjectMetaType.All]     = metaManaged;

            metaManaged.name        = TableName;
            metaManaged.displayName = TableDisplayName;
            metaNative.name         = TableName;
            metaNative.displayName  = TableDisplayName;

            var metaColIndex        = new Database.MetaColumn("Index", "Index", typeof(int), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(int)), 40);
            var metaColName         = new Database.MetaColumn("Name", "Name", typeof(string), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(string)), 200);
            var metaColValue        = new Database.MetaColumn("Value", "Value", typeof(string), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(string)), 180);
            var metaColType         = new Database.MetaColumn("Type", "Type", typeof(string), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(string)), 250);
            var metaColDataType     = new Database.MetaColumn("DataType", "Data Type", typeof(string), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(string)), 150);
            var metaColNOName       = new Database.MetaColumn("NativeObjectName", "Native Object Name", typeof(string), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(string)), 125);
            var metaColLength       = new Database.MetaColumn("Length", "Length", typeof(int), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.sumpositive, typeof(int)), 50);
            var metaColStatic       = new Database.MetaColumn("Static", "Static", typeof(bool), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.first, typeof(bool)), 50);
            var metaColRefCount     = new Database.MetaColumn("RefCount", "RefCount", typeof(int), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.sumpositive, typeof(int)), 50);
            var metaColOwnerSize    = new Database.MetaColumn("OwnedSize", "Owned Size", typeof(long), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.sumpositive, typeof(long)), 50);
            var metaColTargetSize   = new Database.MetaColumn("TargetSize", "Target Size", typeof(long), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.sumpositive, typeof(long)), 50);
            var metaColNativeSize   = new Database.MetaColumn("NativeSize", "Native Size", typeof(long), false, Grouping.groupByDuplicate, Grouping.GetMergeAlgo(Grouping.MergeAlgo.sumpositive, typeof(long)), 75);
            var metaColNativeId     = new Database.MetaColumn("NativeInstanceId", "Native Instance ID", typeof(int), false, Grouping.groupByDuplicate, null, 75);
            var metaColAddress      = new Database.MetaColumn("Address", "Address", typeof(ulong), false, Grouping.groupByDuplicate, null, 75);
            var metaColUniqueString = new Database.MetaColumn("UniqueString", "Unique String", typeof(string), true, Grouping.groupByDuplicate, null, 250);

            var metaManagedCol = new List <Database.MetaColumn>();

            metaManagedCol.Add(metaColIndex);
            metaManagedCol.Add(metaColName);
            metaManagedCol.Add(metaColValue);
            metaManagedCol.Add(metaColType);
            metaManagedCol.Add(metaColDataType);
            metaManagedCol.Add(metaColNOName);
            metaManagedCol.Add(metaColLength);
            metaManagedCol.Add(metaColStatic);
            metaManagedCol.Add(metaColRefCount);
            metaManagedCol.Add(metaColOwnerSize);
            metaManagedCol.Add(metaColTargetSize);
            metaManagedCol.Add(metaColNativeSize);
            metaManagedCol.Add(metaColNativeId);
            metaManagedCol.Add(metaColAddress);
            metaManagedCol.Add(metaColUniqueString);
            var metaNativeCol = new List <Database.MetaColumn>();

            metaNativeCol.Add(new Database.MetaColumn(metaColIndex));
            metaNativeCol.Add(new Database.MetaColumn(metaColName));
            metaNativeCol.Add(new Database.MetaColumn(metaColValue));
            metaNativeCol.Add(new Database.MetaColumn(metaColType));
            metaNativeCol.Add(new Database.MetaColumn(metaColNOName));
            metaNativeCol.Add(new Database.MetaColumn(metaColDataType));
            metaNativeCol.Add(new Database.MetaColumn(metaColRefCount));
            metaNativeCol.Add(new Database.MetaColumn(metaColOwnerSize));
            metaNativeCol.Add(new Database.MetaColumn(metaColTargetSize));
            metaNativeCol.Add(new Database.MetaColumn(metaColNativeId));
            metaNativeCol.Add(new Database.MetaColumn(metaColAddress));
            metaNativeCol.Add(new Database.MetaColumn(metaColUniqueString));

            metaManaged.SetColumns(metaManagedCol.ToArray());
            metaNative.SetColumns(metaNativeCol.ToArray());
        }
        private void CreateTable_NativeObjects(List <APITable> tables)
        {
            APITable table = new APITable(this, m_Snapshot, m_Snapshot.nativeObjects.dataSet);

            table.AddColumn(
                new MetaColumn("name", "name", typeof(string), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeObjects.objectName)
                );
            table.AddColumn(
                new MetaColumn("instanceId", "instanceId", typeof(int), true, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeObjects.instanceId)
                );
            table.AddColumn(
                new MetaColumn("size", "size", typeof(ulong), false, Grouping.groupByDuplicate
                               , Grouping.GetMergeAlgo(Grouping.MergeAlgo.sum, typeof(ulong)), "size")
                , DataArray.MakeColumn(m_Snapshot.nativeObjects.size)
                );

            table.AddColumn(
                new MetaColumn("nativeObjectAddress", "nativeObjectAddress", typeof(ulong), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeObjects.nativeObjectAddress)
                );
            table.AddColumn(
                new MetaColumn("rootReferenceId", "rootReferenceId", typeof(long), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeObjects.rootReferenceId)
                );

            table.AddColumn(
                new MetaColumn("nativeTypeArrayIndex", "nativeTypeArrayIndex", typeof(int), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn(m_Snapshot.nativeObjects.nativeTypeArrayIndex)
                );

            table.AddColumn(
                new MetaColumn("isPersistent", "isPersistent", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.flags, (a) => HasBit(a, ObjectFlags.IsPersistent), (ref ObjectFlags o, bool v) => SetBit(ref o, ObjectFlags.IsPersistent, v))
                );
            table.AddColumn(
                new MetaColumn("isDontDestroyOnLoad", "isDontDestroyOnLoad", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.flags, (a) => HasBit(a, ObjectFlags.IsDontDestroyOnLoad), (ref ObjectFlags o, bool v) => SetBit(ref o, ObjectFlags.IsDontDestroyOnLoad, v))
                );
            table.AddColumn(
                new MetaColumn("isManager", "isManager", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.flags, (a) => HasBit(a, ObjectFlags.IsManager), (ref ObjectFlags o, bool v) => SetBit(ref o, ObjectFlags.IsManager, v))
                );

            table.AddColumn(
                new MetaColumn("HideInHierarchy", "HideInHierarchy", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.hideFlags, (a) => HasBit(a, HideFlags.HideInHierarchy), (ref HideFlags o, bool v) => SetBit(ref o, HideFlags.HideInHierarchy, v))
                );
            table.AddColumn(
                new MetaColumn("HideInInspector", "HideInInspector", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.hideFlags, (a) => HasBit(a, HideFlags.HideInInspector), (ref HideFlags o, bool v) => SetBit(ref o, HideFlags.HideInInspector, v))
                );
            table.AddColumn(
                new MetaColumn("DontSaveInEditor", "DontSaveInEditor", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.hideFlags, (a) => HasBit(a, HideFlags.DontSaveInEditor), (ref HideFlags o, bool v) => SetBit(ref o, HideFlags.DontSaveInEditor, v))
                );
            table.AddColumn(
                new MetaColumn("NotEditable", "NotEditable", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.hideFlags, (a) => HasBit(a, HideFlags.NotEditable), (ref HideFlags o, bool v) => SetBit(ref o, HideFlags.NotEditable, v))
                );
            table.AddColumn(
                new MetaColumn("DontSaveInBuild", "DontSaveInBuild", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.hideFlags, (a) => HasBit(a, HideFlags.DontSaveInBuild), (ref HideFlags o, bool v) => SetBit(ref o, HideFlags.DontSaveInBuild, v))
                );
            table.AddColumn(
                new MetaColumn("DontUnloadUnusedAsset", "DontUnloadUnusedAsset", typeof(bool), false, Grouping.groupByDuplicate, null)
                , DataArray.MakeColumn_Transform(m_Snapshot.nativeObjects.hideFlags, (a) => HasBit(a, HideFlags.DontUnloadUnusedAsset), (ref HideFlags o, bool v) => SetBit(ref o, HideFlags.DontUnloadUnusedAsset, v))
                );

            table.CreateTable(kPrefixTableName + "NativeObject", kPrefixTableDisplayName + "Native Object");
            AddTable(table, tables);
        }