GeneratorPool.cs
1 using System.Collections.Generic; 2 3 namespace Spv.Generator 4 { 5 public class GeneratorPool<T> where T : class, new() 6 { 7 private readonly List<T[]> _pool; 8 private int _chunkIndex = -1; 9 private int _poolIndex = -1; 10 private readonly int _poolSizeIncrement; 11 12 public GeneratorPool() : this(1000, 200) { } 13 14 public GeneratorPool(int chunkSizeLimit, int poolSizeIncrement) 15 { 16 _poolSizeIncrement = poolSizeIncrement; 17 18 _pool = new(chunkSizeLimit * 2); 19 20 AddChunkIfNeeded(); 21 } 22 23 public T Allocate() 24 { 25 if (++_poolIndex >= _poolSizeIncrement) 26 { 27 AddChunkIfNeeded(); 28 29 _poolIndex = 0; 30 } 31 32 return _pool[_chunkIndex][_poolIndex]; 33 } 34 35 private void AddChunkIfNeeded() 36 { 37 if (++_chunkIndex >= _pool.Count) 38 { 39 T[] pool = new T[_poolSizeIncrement]; 40 41 for (int i = 0; i < _poolSizeIncrement; i++) 42 { 43 pool[i] = new T(); 44 } 45 46 _pool.Add(pool); 47 } 48 } 49 50 public void Clear() 51 { 52 _chunkIndex = 0; 53 _poolIndex = -1; 54 } 55 } 56 }