//#define ASTAR_NO_POOLING //@SHOWINEDITOR Disable pooling for some reason. Could be debugging or just for measuring the difference.
using System.Collections.Generic;
namespace Pathfinding.Util {
///
/// Lightweight Stack Pool.
/// Handy class for pooling stacks of type T.
///
/// Usage:
/// - Claim a new stack using Stack foo = StackPool.Claim ();
/// - Use it and do stuff with it
/// - Release it with StackPool.Release (foo);
///
/// You do not need to clear the stack before releasing it.
/// After you have released a stack, you should never use it again.
///
/// Warning: This class is not thread safe
///
/// \since Version 3.2
/// See: Pathfinding.Util.ListPool
///
public static class StackPool {
/// Internal pool
static readonly List > pool;
/// Static constructor
static StackPool () {
pool = new List >();
}
///
/// Claim a stack.
/// Returns a pooled stack if any are in the pool.
/// Otherwise it creates a new one.
/// After usage, this stack should be released using the Release function (though not strictly necessary).
///
public static Stack Claim () {
#if ASTAR_NO_POOLING
return new Stack();
#else
lock (pool) {
if (pool.Count > 0) {
Stack ls = pool[pool.Count-1];
pool.RemoveAt(pool.Count-1);
return ls;
}
}
return new Stack();
#endif
}
///
/// Makes sure the pool contains at least count pooled items.
/// This is good if you want to do all allocations at start.
///
public static void Warmup (int count) {
var tmp = new Stack[count];
for (int i = 0; i < count; i++) tmp[i] = Claim();
for (int i = 0; i < count; i++) Release(tmp[i]);
}
///
/// Releases a stack.
/// After the stack has been released it should not be used anymore.
/// Releasing a stack twice will cause an error.
///
public static void Release (Stack stack) {
#if !ASTAR_NO_POOLING
stack.Clear();
lock (pool) {
for (int i = 0; i < pool.Count; i++)
if (pool[i] == stack) UnityEngine.Debug.LogError("The Stack is released even though it is inside the pool");
pool.Add(stack);
}
#endif
}
///
/// Clears all pooled stacks of this type.
/// This is an O(n) operation, where n is the number of pooled stacks
///
public static void Clear () {
lock (pool) {
pool.Clear();
}
}
/// Number of stacks of this type in the pool
public static int GetSize () {
return pool.Count;
}
}
}