/// <summary> /// Creates the <see cref="ItemStore" /> based on the given <see cref="EPoolItemAccessMode" /> /// </summary> /// <param name="mode"></param> /// <param name="capacity"></param> /// <returns></returns> protected IPoolItemStore <T> CreateItemStore(EPoolItemAccessMode mode, int capacity) { switch (mode) { case EPoolItemAccessMode.Fifo: return(new QueuePoolItemStore <T>(capacity)); case EPoolItemAccessMode.Lifo: return(new StackPoolItemStore <T>(capacity)); default: Debug.Assert(mode == EPoolItemAccessMode.Circular, "Invalid AccessMode in CreateItemStore"); return(new CircularStore <T>(capacity)); } }
protected AbstractPool(int poolSize, Func <IPool <T>, T> itemFactoryFunc, EPoolItemAccessMode accessMode = EPoolItemAccessMode.Fifo) { if (poolSize <= 0) { throw new ArgumentOutOfRangeException("poolSize", poolSize, "Size of the pool must be greater than zero."); } if (itemFactoryFunc == null) { throw new ArgumentNullException("itemFactoryFunc"); } _sync = new Semaphore(poolSize, poolSize); PoolSize = poolSize; ItemFactoryFunc = itemFactoryFunc; ItemStore = CreateItemStore(accessMode, poolSize); }
public LazyPool(int poolSize, Func <IPool <T>, T> itemFactoryFunc, EPoolItemAccessMode accessMode = EPoolItemAccessMode.Fifo) : base(poolSize, itemFactoryFunc, accessMode) { }
public EagerPool(int poolSize, Func <IPool <T>, T> itemFactoryFunc, EPoolItemAccessMode accessMode = EPoolItemAccessMode.Fifo) : base(poolSize, itemFactoryFunc, accessMode) { PreloadItems(); }