diff --git a/Engine.Core/Helpers/IPool.cs b/Engine.Core/Helpers/IPool.cs new file mode 100644 index 0000000..e151ff6 --- /dev/null +++ b/Engine.Core/Helpers/IPool.cs @@ -0,0 +1,10 @@ +namespace Syntriax.Engine.Core; + +public interface IPool +{ + Event, T> OnRemoved { get; } + Event, T> OnReturned { get; } + + T Get(); + void Return(T item); +} diff --git a/Engine.Core/Helpers/Pool.cs b/Engine.Core/Helpers/Pool.cs index b9f5c99..1b42c77 100644 --- a/Engine.Core/Helpers/Pool.cs +++ b/Engine.Core/Helpers/Pool.cs @@ -3,17 +3,21 @@ using System.Collections.Generic; namespace Syntriax.Engine.Core; -public class Pool +public class Pool : IPool { - private readonly Func factory; + public Event, T> OnRemoved { get; } = new(); + public Event, T> OnReturned { get; } = new(); + + private readonly Func generator = null!; private readonly Queue queue = new(); public T Get() { - if (queue.TryDequeue(out T? result)) - return result; + if (!queue.TryDequeue(out T? result)) + result = generator(); - return factory(); + OnRemoved?.Invoke(this, result); + return result; } public void Return(T item) @@ -22,12 +26,13 @@ public class Pool return; queue.Enqueue(item); + OnReturned?.Invoke(this, item); } - public Pool(Func factory, int initialCapacity = 1) + public Pool(Func generator, int initialCapacity = 1) { - this.factory = factory; + this.generator = generator; for (int i = 0; i < initialCapacity; i++) - queue.Enqueue(factory()); + queue.Enqueue(generator()); } }