refactor: extracted interface from pool and added events
This commit is contained in:
parent
62b54ee836
commit
3f914fe46f
10
Engine.Core/Helpers/IPool.cs
Normal file
10
Engine.Core/Helpers/IPool.cs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
|
public interface IPool<T>
|
||||||
|
{
|
||||||
|
Event<IPool<T>, T> OnRemoved { get; }
|
||||||
|
Event<IPool<T>, T> OnReturned { get; }
|
||||||
|
|
||||||
|
T Get();
|
||||||
|
void Return(T item);
|
||||||
|
}
|
@ -3,17 +3,21 @@ using System.Collections.Generic;
|
|||||||
|
|
||||||
namespace Syntriax.Engine.Core;
|
namespace Syntriax.Engine.Core;
|
||||||
|
|
||||||
public class Pool<T>
|
public class Pool<T> : IPool<T>
|
||||||
{
|
{
|
||||||
private readonly Func<T> factory;
|
public Event<IPool<T>, T> OnRemoved { get; } = new();
|
||||||
|
public Event<IPool<T>, T> OnReturned { get; } = new();
|
||||||
|
|
||||||
|
private readonly Func<T> generator = null!;
|
||||||
private readonly Queue<T> queue = new();
|
private readonly Queue<T> queue = new();
|
||||||
|
|
||||||
public T Get()
|
public T Get()
|
||||||
{
|
{
|
||||||
if (queue.TryDequeue(out T? result))
|
if (!queue.TryDequeue(out T? result))
|
||||||
return result;
|
result = generator();
|
||||||
|
|
||||||
return factory();
|
OnRemoved?.Invoke(this, result);
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Return(T item)
|
public void Return(T item)
|
||||||
@ -22,12 +26,13 @@ public class Pool<T>
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
queue.Enqueue(item);
|
queue.Enqueue(item);
|
||||||
|
OnReturned?.Invoke(this, item);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Pool(Func<T> factory, int initialCapacity = 1)
|
public Pool(Func<T> generator, int initialCapacity = 1)
|
||||||
{
|
{
|
||||||
this.factory = factory;
|
this.generator = generator;
|
||||||
for (int i = 0; i < initialCapacity; i++)
|
for (int i = 0; i < initialCapacity; i++)
|
||||||
queue.Enqueue(factory());
|
queue.Enqueue(generator());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user