EditorTool3D/Assets/ZXL/Scripts/Helper/ListPool.cs

67 lines
1.5 KiB
C#

using System;
using System.Collections.Generic;
namespace ZXL
{
public static class ListPool<T>
{
private static readonly object @lock = new object();
private static readonly Stack<List<T>> free = new Stack<List<T>>();
private static readonly HashSet<List<T>> busy = new HashSet<List<T>>();
public static List<T> New()
{
lock (@lock)
{
if (free.Count == 0)
{
free.Push(new List<T>());
}
var array = free.Pop();
busy.Add(array);
return array;
}
}
public static void Free(List<T> list)
{
lock (@lock)
{
if (!busy.Contains(list))
{
throw new ArgumentException("The list to free is not in use by the pool.", nameof(list));
}
list.Clear();
busy.Remove(list);
free.Push(list);
}
}
}
public static class XListPool
{
public static List<T> ToListPooled<T>(this IEnumerable<T> source)
{
var list = ListPool<T>.New();
foreach (var item in source)
{
list.Add(item);
}
return list;
}
public static void Free<T>(this List<T> list)
{
ListPool<T>.Free(list);
}
}
}