You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Zero/ZeroLevel/Services/MemoryPools/Collections/Specialized/LongLocalList.cs

139 lines
2.6 KiB

using System;
using System.Collections.Generic;
namespace MemoryPools.Collections.Specialized
{
/// <summary>
/// Contains 8 elements as struct fields as Maximum. Use it when you have guaranteed count of elements <= 8
/// </summary>
public struct LongLocalList<T>
{
private static readonly EqualityComparer<T> ItemComparer = EqualityComparer<T>.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<T> other && Equals(other);
}
public bool Equals(LongLocalList<T> other)
{
return _items.Equals(other._items);
}
}
}

Powered by TurnKey Linux.