using System; using System.Collections.Generic; using UnityEngine.Assertions; namespace UnityEditor.ShaderGraph { class PooledList : List, IDisposable { static Stack> s_Pool = new Stack>(); bool m_Active; PooledList() { } public static PooledList Get() { if (s_Pool.Count == 0) { return new PooledList { m_Active = true }; } var list = s_Pool.Pop(); list.m_Active = true; #if DEBUG GC.ReRegisterForFinalize(list); #endif return list; } public void Dispose() { Assert.IsTrue(m_Active); m_Active = false; Clear(); s_Pool.Push(this); #if DEBUG GC.SuppressFinalize(this); #endif } // Destructor causes some GC alloc so only do this sanity check in debug build #if DEBUG ~PooledList() { throw new InvalidOperationException($"{nameof(PooledList)} must be disposed manually."); } #endif } }