using UnityEngine; using System; using System.Collections; using System.Collections.Generic; public class FastList { /// /// Comparison function should return -1 if left is less than right, 1 if left is greater than right, and 0 if they match. /// public delegate int CompareFunc(T left, T right); public T[] array = null; public int size = 0; public FastList () { } public FastList(int size) { if (size > 0) { this.size = 0; array = new T[size]; } else { this.size = 0; } } public int Count { get { return size;} set { } } public T this[int i] { get { return array[i];} set { array[i] = value;} } //Add item to end of list. public void Add(T item) { if (array == null || size == array.Length) { Allocate(); } array[size] = item; size++; } //Add item to end of list if it is unique. public void AddUnique( T item ) { if ( array == null || size == array.Length ) { Allocate(); } if ( !Contains( item ) ) { array[size] = item; size++; } } //Add items to the end of the list public void AddRange( IEnumerable items ) { foreach ( T item in items ) { Add( item ); } } //Insert item at specified index public void Insert(int index, T item) { if (array == null || size == array.Length) { Allocate(); } if (index < size) { //move things back 1 for (int i = size; i > index; i--) { array[i] = array[i-1]; } array[index] = item; size++; } else Add(item); } //Removes specified item and keeps everything else in order public bool Remove(T item) { if (array != null) { for (int i = 0; i < size; i++) { if (item.Equals(array[i])) { //found it, push everything up size--; for (int j = i; j < size; j++) { array[j] = array[j+1]; } array[size] = default(T); return true; } } } return false; } //Removes item at specified index while keeping everything else in order //O(n) public void RemoveAt(int index) { if (array != null && size > 0 && index < size) { size--; for (int i = index; i < size; i++) { array[i] = array[i+1]; } array[size] = default(T); } } //Removes the specified item from the list and replaces with last item. Return true if removed, false if not found. public bool RemoveFast(T item) { if (array != null) { for (int i = 0; i < size; i++) { if ( item.Equals( array[i] )) { //found //Move last item here if (i < (size - 1)) { T lastItem = array[size-1]; array[size-1] = default(T); array[i] = lastItem; } else { array[i] = default(T); } size--; return true; } } } return false; } //Removes item at specified index and replace with last item. public void RemoveAtFast(int index) { if (array != null && index < size && index >= 0) { //last element if (index == size - 1) { array[index] = default(T); } else { T lastItem = array[size - 1]; array[index] = lastItem; array[size - 1] = default(T); } size--; } } //Return whether an item is contained within the list //O(n) public bool Contains(T item) { if (array == null || size <= 0 ) return false; for (int i = 0; i < size; i++) { if (array[i].Equals(item)) { return true;} } return false; } //Returns index of specified item, or -1 if not found. //O(n) public int IndexOf(T item) { if (size <= 0 || array == null) { return -1;} for (int i = 0; i < size; i++) { if (item.Equals(array[i])) { return i;} } return -1; } public T Pop() { if (array != null && size > 0) { T lastItem = array[size-1]; array[size-1] = default(T); size--; return lastItem; } return default(T); } public T[] ToArray() { Trim(); return array; } public void Sort (CompareFunc comparer) { int start = 0; int end = size - 1; bool changed = true; while (changed) { changed = false; for (int i = start; i < end; i++) { if (comparer(array[i], array[i + 1]) > 0) { T temp = array[i]; array[i] = array[i+1]; array[i+1] = temp; changed = true; } else if (!changed) { start = (i==0) ? 0 : i-1; } } } } public void InsertionSort(CompareFunc comparer) { for (int i = 1; i < size; i++) { T curr = array[i]; int j = i; while (j > 0 && comparer(array[j - 1], curr) > 0) { array[j] = array[j-1]; j--; } array[j] = curr; } } public IEnumerator GetEnumerator() { if (array != null) { for (int i = 0; i < size; i++) { yield return array[i]; } } } public T Find(Predicate match) { if (match != null) { if (array != null) { for (int i = 0; i < size; i++) { if (match(array[i])) { return array[i];} } } } return default(T); } //Allocate more space to internal array. void Allocate() { T[] newArray; if (array == null) { newArray = new T[32]; } else { newArray = new T[Mathf.Max(array.Length << 1, 32)]; } if (array != null && size > 0) { array.CopyTo(newArray, 0); } array = newArray; } void Trim() { if (size > 0) { T[] newArray = new T[size]; for (int i = 0; i < size; i++) { newArray[i] = array[i]; } array = newArray; } else { array = null; } } //Set size to 0, does not delete array from memory public void Clear() { size = 0; } //Delete array from memory public void Release() { Clear(); array = null; } }