using System; using Gum.Core.Assert; namespace Gum.Pooling { public sealed class PoolBuilder where T : IPoolable { private CreationInfo _creationInfo; public PoolBuilder FromMethod(Func func) { _creationInfo.providerType = ProviderType.FromMethod; _creationInfo.instanceProviderCallback = func; return this; } public PoolBuilder FromPoolableInstanceProvider(IPoolableInstanceProvider instanceProvider) { _creationInfo.providerType = ProviderType.FromPoolableInstanceProvider; _creationInfo.poolableInstanceProvider = instanceProvider; return this; } public PoolBuilder WithInitialSize(int size) { _creationInfo.initialSize = size; return this; } public PoolBuilder SetPoolType(PoolType poolType) { _creationInfo.poolType = poolType; return this; } public IPool Build() { GumAssert.IsTrue(_creationInfo.providerType != ProviderType.Undefined, "No provider type defined!"); switch (_creationInfo.poolType) { case PoolType.Stack: return GetStackPool(); case PoolType.WeakStack: return GetWeakStackPool(); case PoolType.Queue: return GetQueuePool(); default: throw new ArgumentOutOfRangeException(); } } private IPool GetQueuePool() { switch (_creationInfo.providerType) { case ProviderType.FromPoolableInstanceProvider: return new QueuePool(_creationInfo.poolableInstanceProvider, _creationInfo.initialSize); case ProviderType.FromMethod: return new QueuePool(_creationInfo.instanceProviderCallback, _creationInfo.initialSize); default: throw new ArgumentOutOfRangeException(); } } private IPool GetWeakStackPool() { switch (_creationInfo.providerType) { case ProviderType.FromPoolableInstanceProvider: return new WeakStackPool(_creationInfo.poolableInstanceProvider, _creationInfo.initialSize); case ProviderType.FromMethod: return new WeakStackPool(_creationInfo.instanceProviderCallback, _creationInfo.initialSize); default: throw new ArgumentOutOfRangeException(); } } private IPool GetStackPool() { switch (_creationInfo.providerType) { case ProviderType.FromPoolableInstanceProvider: return new StackPool(_creationInfo.poolableInstanceProvider, _creationInfo.initialSize); case ProviderType.FromMethod: return new StackPool(_creationInfo.instanceProviderCallback, _creationInfo.initialSize); default: throw new ArgumentOutOfRangeException(); } } public void Clear() { _creationInfo = default; } private struct CreationInfo { public int initialSize; public IPoolableInstanceProvider poolableInstanceProvider; public Func instanceProviderCallback; public ProviderType providerType; public PoolType poolType; } } }