in csharp/src/Containers/GPMemoryManager.cs [28:112]
public class GPMemoryManager<T> : IMemoryManager<T> where T : new()
{
T[] freeObjects;
Int32 numberOfFreeObjects = 0;
Int32 totalObjectsCount = 0;
Double coefficient;
/// <summary>
/// Default maximal value of number object increment.
/// </summary>
public Int32 MaxIncrement
{
get; set;
} = 1000000;
/// <summary>
/// Creates new geometric progression memory manager.
/// </summary>
/// <param name="capacity">Initial pool capacity.</param>
/// <param name="coefficient">Scale factor of geometric progression.</param>
public GPMemoryManager(Int32 capacity, Double coefficient)
{
if (coefficient <= 1.0)
throw new ArgumentException("coefficient");
this.coefficient = coefficient;
freeObjects = new T[capacity];
totalObjectsCount = capacity;
for (int i = 0; i < capacity; ++i)
freeObjects[i] = new T();
}
/// <summary>
/// Creates new geometric progression memory manager.
/// </summary>
public GPMemoryManager()
: this(0x10, 2)
{
}
/// <summary>
/// Reserve new instance of an object.
/// </summary>
/// <returns>Instance of an object</returns>
public T New()
{
if (numberOfFreeObjects == 0)
{
Int32 length = freeObjects.Length;
Int32 newLength = Math.Min(MaxIncrement, (Int32)(freeObjects.Length * coefficient));
freeObjects = new T[newLength];
numberOfFreeObjects = newLength;
for (int i = 0; i < numberOfFreeObjects; ++i)
freeObjects[i] = new T();
}
numberOfFreeObjects--;
return freeObjects[numberOfFreeObjects];
}
/// <summary>
/// Free instance of an object and return it to the pool.
/// </summary>
/// <param name="obj">Instance of an object to free.</param>
public void Delete(T obj)
{
if (numberOfFreeObjects == freeObjects.Length)
{
Array.Resize(ref freeObjects, freeObjects.Length << 1);
}
freeObjects[numberOfFreeObjects] = obj;
numberOfFreeObjects++;
}
/// <summary>
/// Number of free objects in pool.
/// </summary>
public Int32 FreeObjectsCount { get { return numberOfFreeObjects; } }
/// <summary>
/// Total number of objects in pool free + reserverd.
/// </summary>
public Int32 TotalObjectsCount { get { return freeObjects.Length; } }
}