using System; 
 | 
using UnityEditor.MemoryProfiler; 
 | 
using UnityEngine; 
 | 
  
 | 
namespace MemoryProfilerWindow 
 | 
{ 
 | 
    using System.Linq; 
 | 
  
 | 
    //this is the highest level dataformat. it can be unpacked from the PackedCrawledMemorySnapshot, which contains all the interesting information we want. The Packed format 
 | 
    //however is designed to be serializable and relatively storage compact.  This dataformat is designed to give a nice c# api experience. so while the packed version uses typeIndex, 
 | 
    //this version has TypeReferences,  and also uses references to ThingInObject, instead of the more obscure object indexing pattern that the packed format uses. 
 | 
    public class CrawledMemorySnapshot 
 | 
    { 
 | 
        public NativeUnityEngineObject[] nativeObjects; 
 | 
        public GCHandle[] gcHandles; 
 | 
        public ManagedObject[] managedObjects; 
 | 
        public StaticFields[] staticFields; 
 | 
  
 | 
        //contains concatenation of nativeObjects, gchandles, managedobjects and staticfields 
 | 
        public ThingInMemory[] allObjects { get; private set; } 
 | 
        public long totalSize { get; private set; } 
 | 
  
 | 
        public MemorySection[] managedHeap; 
 | 
        public TypeDescription[] typeDescriptions; 
 | 
        public PackedNativeType[] nativeTypes; 
 | 
        public VirtualMachineInformation virtualMachineInformation; 
 | 
  
 | 
        public void FinishSnapshot() 
 | 
        { 
 | 
            allObjects = new ThingInMemory[0].Concat(gcHandles).Concat(nativeObjects).Concat(staticFields).Concat(managedObjects).ToArray(); 
 | 
            totalSize = allObjects != null ? allObjects.Sum(o => o.size) : 0; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    public class ThingInMemory 
 | 
    { 
 | 
        public long size; 
 | 
        public string caption; 
 | 
        public ThingInMemory[] references; 
 | 
        public ThingInMemory[] referencedBy; 
 | 
    } 
 | 
  
 | 
    public class ManagedObject : ThingInMemory 
 | 
    { 
 | 
        public UInt64 address; 
 | 
        public TypeDescription typeDescription; 
 | 
    } 
 | 
  
 | 
    public class NativeUnityEngineObject : ThingInMemory 
 | 
    { 
 | 
        public int instanceID; 
 | 
        public int classID; 
 | 
        public string className; 
 | 
        public string name; 
 | 
        public bool isPersistent; 
 | 
        public bool isDontDestroyOnLoad; 
 | 
        public bool isManager; 
 | 
        public HideFlags hideFlags; 
 | 
    } 
 | 
  
 | 
    public class GCHandle : ThingInMemory 
 | 
    { 
 | 
    } 
 | 
  
 | 
    public class StaticFields : ThingInMemory 
 | 
    { 
 | 
        public TypeDescription typeDescription; 
 | 
        public byte[] storage; 
 | 
    } 
 | 
} 
 |