| New file |
| | |
| | | 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; |
| | | } |
| | | } |
| | | } |