2025-06-09 18:33:47 +03:00

41 lines
993 B
C#

using System;
using System.Collections.Generic;
namespace Syntriax.Engine.Core;
public class ListPool<T> : IPool<List<T>>
{
public Event<IPool<List<T>>, List<T>> OnReturned { get; } = new();
public Event<IPool<List<T>>, List<T>> OnRemoved { get; } = new();
private readonly Func<List<T>> generator = null!;
private readonly Queue<List<T>> queue = new();
public List<T> Get()
{
if (!queue.TryDequeue(out List<T>? result))
result = generator();
result.Clear();
OnRemoved?.Invoke(this, result);
return result;
}
public void Return(List<T> list)
{
if (queue.Contains(list))
return;
list.Clear();
queue.Enqueue(list);
OnReturned?.Invoke(this, list);
}
public ListPool(Func<List<T>> generator, int initialCapacity = 1)
{
this.generator = generator;
for (int i = 0; i < initialCapacity; i++)
queue.Enqueue(generator());
}
}