using System.Collections.Generic; using System.Runtime.CompilerServices; namespace Projectiles { public class ListPool { // CONSTANTS private const int POOL_CAPACITY = 4; private const int LIST_CAPACITY = 16; // PUBLIC MEMBERS public static readonly ListPool Shared = new(); // PRIVATE MEMBERS private List> _pool = new(POOL_CAPACITY); // PUBLIC METHODS [MethodImpl(MethodImplOptions.AggressiveInlining)] public List Get(int capacity) { lock (_pool) { int poolCount = _pool.Count; if (poolCount == 0) { return new List(capacity > 0 ? capacity : LIST_CAPACITY); } for (int i = 0; i < poolCount; ++i) { List list = _pool[i]; if (list.Capacity < capacity) continue; _pool.RemoveBySwap(i); return list; } int lastListIndex = poolCount - 1; List lastList = _pool[lastListIndex]; lastList.Capacity = capacity; _pool.RemoveAt(lastListIndex); return lastList; } } [MethodImpl(MethodImplOptions.AggressiveInlining)] public void Return(List list) { if (list == null) return; list.Clear(); lock (_pool) { _pool.Add(list); } } } public static class ListPool { [MethodImpl(MethodImplOptions.AggressiveInlining)] public static List Get(int capacity) { return ListPool.Shared.Get(capacity); } [MethodImpl(MethodImplOptions.AggressiveInlining)] public static void Return(List list) { ListPool.Shared.Return(list); } } }