GeneratorPool.cs 1.3 KB

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