From 8722a9920c1f6119bf6e769cba270e63097f8e25 Mon Sep 17 00:00:00 2001
From: chai <215380520@qq.com>
Date: Thu, 23 May 2024 10:08:29 +0800
Subject: + astar project
---
.../Core/Pooling/StackPool.cs | 98 ++++++++++++++++++++++
1 file changed, 98 insertions(+)
create mode 100644 Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Core/Pooling/StackPool.cs
(limited to 'Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Core/Pooling/StackPool.cs')
diff --git a/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Core/Pooling/StackPool.cs b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Core/Pooling/StackPool.cs
new file mode 100644
index 0000000..daf7a53
--- /dev/null
+++ b/Other/AstarPathfindingDemo/Packages/com.arongranberg.astar/Core/Pooling/StackPool.cs
@@ -0,0 +1,98 @@
+//#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;
+ }
+ }
+}
--
cgit v1.1-26-g67d0