/ src / Spv.Generator / GeneratorPool.cs
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  }