aboutsummaryrefslogtreecommitdiff
path: root/Spv.Generator/GeneratorPool.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Spv.Generator/GeneratorPool.cs')
-rw-r--r--Spv.Generator/GeneratorPool.cs58
1 files changed, 58 insertions, 0 deletions
diff --git a/Spv.Generator/GeneratorPool.cs b/Spv.Generator/GeneratorPool.cs
new file mode 100644
index 00000000..f6c92918
--- /dev/null
+++ b/Spv.Generator/GeneratorPool.cs
@@ -0,0 +1,58 @@
+using System.Collections.Generic;
+
+namespace Spv.Generator
+{
+ public class GeneratorPool<T> where T : class, new()
+ {
+ private List<T[]> _pool;
+ private int _chunkIndex = -1;
+ private int _poolIndex = -1;
+ private int _initialSize;
+ private int _poolSizeIncrement;
+
+ public GeneratorPool(): this(1000, 200) { }
+
+ public GeneratorPool(int chunkSizeLimit, int poolSizeIncrement)
+ {
+ _initialSize = chunkSizeLimit;
+ _poolSizeIncrement = poolSizeIncrement;
+
+ _pool = new(chunkSizeLimit * 2);
+
+ AddChunkIfNeeded();
+ }
+
+ public T Allocate()
+ {
+ if (++_poolIndex >= _poolSizeIncrement)
+ {
+ AddChunkIfNeeded();
+
+ _poolIndex = 0;
+ }
+
+ return _pool[_chunkIndex][_poolIndex];
+ }
+
+ private void AddChunkIfNeeded()
+ {
+ if (++_chunkIndex >= _pool.Count)
+ {
+ T[] pool = new T[_poolSizeIncrement];
+
+ for (int i = 0; i < _poolSizeIncrement; i++)
+ {
+ pool[i] = new T();
+ }
+
+ _pool.Add(pool);
+ }
+ }
+
+ public void Clear()
+ {
+ _chunkIndex = 0;
+ _poolIndex = -1;
+ }
+ }
+}