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