You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

87 lines
1.5 KiB
C#

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