refactor: extracted interface from pool and added events
This commit is contained in:
		
							
								
								
									
										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;
 | 
			
		||||
 | 
			
		||||
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();
 | 
			
		||||
 | 
			
		||||
    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<T>
 | 
			
		||||
            return;
 | 
			
		||||
 | 
			
		||||
        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++)
 | 
			
		||||
            queue.Enqueue(factory());
 | 
			
		||||
            queue.Enqueue(generator());
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user