From dc7922d80c1d133b6261b8af1d521567d2c0a35d Mon Sep 17 00:00:00 2001
From: hch <305670599@qq.com>
Date: 星期四, 30 十月 2025 16:51:39 +0800
Subject: [PATCH] Merge branch 'master' of http://mobile.secondworld.net.cn:10010/r/Project_SG_scripts

---
 Main/Component/UI/EnhancedScroller/SmallList.cs |  219 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 219 insertions(+), 0 deletions(-)

diff --git a/Main/Component/UI/EnhancedScroller/SmallList.cs b/Main/Component/UI/EnhancedScroller/SmallList.cs
new file mode 100644
index 0000000..b681c5b
--- /dev/null
+++ b/Main/Component/UI/EnhancedScroller/SmallList.cs
@@ -0,0 +1,219 @@
+锘縰sing UnityEngine;
+using System.Collections.Generic;
+
+namespace EnhancedUI
+{
+    /// <summary>
+    /// This is a super light implementation of an array that 
+    /// behaves like a list, automatically allocating new memory
+    /// when needed, but not releasing it to garbage collection.
+    /// </summary>
+    /// <typeparam name="T">The type of the list</typeparam>
+    public class SmallList<T>
+    {
+        /// <summary>
+        /// internal storage of list data
+        /// </summary>
+        public T[] data;
+
+        /// <summary>
+        /// The number of elements in the list
+        /// </summary>
+        public int Count = 0;
+
+        /// <summary>
+        /// Indexed access to the list items
+        /// </summary>
+        /// <param name="i"></param>
+        /// <returns></returns>
+        public T this[int i]
+        {
+            get { return data[i]; }
+            set { data[i] = value; }
+        }
+
+        /// <summary>
+        /// Resizes the array when more memory is needed.
+        /// </summary>
+        private void ResizeArray()
+        {
+            T[] newData;
+
+            if (data != null)
+                newData = new T[Mathf.Max(data.Length << 1, 64)];
+            else
+                newData = new T[64];
+
+            if (data != null && Count > 0)
+                data.CopyTo(newData, 0);
+
+            data = newData;
+        }
+
+        /// <summary>
+        /// Instead of releasing the memory to garbage collection, 
+        /// the list size is set back to zero
+        /// </summary>
+        public void Clear()
+        {
+            Count = 0;
+        }
+
+        /// <summary>
+        /// Returns the first element of the list
+        /// </summary>
+        /// <returns></returns>
+        public T First()
+        {
+            if (data == null || Count == 0) return default(T);
+            return data[0];
+        }
+
+        /// <summary>
+        /// Returns the last element of the list
+        /// </summary>
+        /// <returns></returns>
+        public T Last()
+        {
+            if (data == null || Count == 0) return default(T);
+            return data[Count - 1];
+        }
+
+        /// <summary>
+        /// Adds a new element to the array, creating more
+        /// memory if necessary
+        /// </summary>
+        /// <param name="item"></param>
+        public void Add(T item)
+        {
+            if (data == null || Count == data.Length)
+                ResizeArray();
+
+            data[Count] = item;
+            Count++;
+        }
+
+        /// <summary>
+        /// Adds a new element to the start of the array, creating more
+        /// memory if necessary
+        /// </summary>
+        /// <param name="item"></param>
+        public void AddStart(T item)
+        {
+            Insert(item, 0);
+        }
+
+        /// <summary>
+        /// Inserts a new element to the array at the index specified, creating more
+        /// memory if necessary
+        /// </summary>
+        /// <param name="item"></param>
+        public void Insert(T item, int index)
+        {
+            if (data == null || Count == data.Length)
+                ResizeArray();
+
+            for (var i = Count; i > index; i--)
+            {
+                data[i] = data[i - 1];
+            }
+
+            data[index] = item;
+            Count++;
+        }
+
+        /// <summary>
+        /// Removes an item from the start of the data
+        /// </summary>
+        /// <returns></returns>
+        public T RemoveStart()
+        {
+            return RemoveAt(0);
+        }
+
+        /// <summary>
+        /// Removes an item from the index of the data
+        /// </summary>
+        /// <returns></returns>
+        public T RemoveAt(int index)
+        {
+            if (data != null && Count != 0)
+            {
+                T val = data[index];
+
+                for (var i = index; i < Count - 1; i++)
+                {
+                    data[i] = data[i + 1];
+                }
+
+                Count--;
+                data[Count] = default(T);
+                return val;
+            }
+            else
+            {
+                return default(T);
+            }
+        }
+
+        /// <summary>
+        /// Removes an item from the data
+        /// </summary>
+        /// <param name="item"></param>
+        /// <returns></returns>
+        public T Remove(T item)
+        {
+            if (data != null && Count != 0)
+            {
+                for (var i = 0; i < Count; i++)
+                {
+                    if (data[i].Equals(item))
+                    {
+                        return RemoveAt(i);
+                    }
+                }
+            }
+
+            return default(T);
+        }
+
+        /// <summary>
+        /// Removes an item from the end of the data
+        /// </summary>
+        /// <returns></returns>
+        public T RemoveEnd()
+        {
+            if (data != null && Count != 0)
+            {
+                Count--;
+                T val = data[Count];
+                data[Count] = default(T);
+
+                return val;
+            }
+            else
+            {
+                return default(T);
+            }
+        }
+
+        /// <summary>
+        /// Determines if the data contains the item
+        /// </summary>
+        /// <param name="item">The item to compare</param>
+        /// <returns>True if the item exists in teh data</returns>
+        public bool Contains(T item)
+        {
+            if (data == null)
+                return false;
+
+            for (var i = 0; i < Count; i++)
+            {
+                if (data[i].Equals(item))
+                    return true;
+            }
+
+            return false;
+        }
+    }
+}
\ No newline at end of file

--
Gitblit v1.8.0