| using 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; | 
|         } | 
|     } | 
| } |