using System; using System.Collections.Generic; namespace MemoryPools.Collections.Specialized { /// /// Contains 8 elements as struct fields as Maximum. Use it when you have guaranteed count of elements <= 8 /// public struct LongLocalList { private static readonly EqualityComparer ItemComparer = EqualityComparer.Default; private (T, T, T, T, T, T, T, T) _items; public const int Capacity = 8; public void Add(T item) { Count++; if (Count >= Capacity) throw new ArgumentOutOfRangeException(); this[Count - 1] = item; } public void Clear() { Count = 0; _items = default; } public bool Contains(T item) { return IndexOf(item) >= 0; } public void CopyTo(T[] array, int arrayIndex) { for (var i = 0; i < Capacity; i++) array[i] = this[i]; } public bool Remove(T item) { var i = 0; var j = 0; for (; i < Capacity; i++) { if (ItemComparer.Equals(this[i], item) != true) j++; else continue; this[j] = this[i]; } return j != i; } public int Count { get; private set; } public bool IsReadOnly => false; public int IndexOf(T item) { for (var i = 0; i < Capacity; i++) if (ItemComparer.Equals(this[i], item)) return i; return -1; } public T this[int index] { get { if (index < 0 || index >= Count) throw new IndexOutOfRangeException(); switch (index) { case 0: return _items.Item1; case 1: return _items.Item2; case 2: return _items.Item3; case 3: return _items.Item4; case 4: return _items.Item5; case 5: return _items.Item6; case 6: return _items.Item7; case 7: return _items.Item8; default: throw new IndexOutOfRangeException(); } } set { if (index < 0 || index >= Count) throw new IndexOutOfRangeException(); switch (index) { case 0: _items.Item1 = value; break; case 1: _items.Item2 = value; break; case 2: _items.Item3 = value; break; case 3: _items.Item4 = value; break; case 4: _items.Item5 = value; break; case 5: _items.Item6 = value; break; case 6: _items.Item7 = value; break; case 7: _items.Item8 = value; break; default: throw new IndexOutOfRangeException(); } } } public override int GetHashCode() { return _items.GetHashCode(); } public override bool Equals(object obj) { return obj is LongLocalList other && Equals(other); } public bool Equals(LongLocalList other) { return _items.Equals(other._items); } } }