Int32FrozenSet
using System.Buffers;
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace System.Collections.Frozen
{
internal sealed class Int32FrozenSet : FrozenSetInternalBase<int, Int32FrozenSet.GSW>
{
internal struct GSW : IGenericSpecializedWrapper
{
private Int32FrozenSet _set;
public int Count => _set.Count;
[System.Runtime.CompilerServices.Nullable(1)]
public IEqualityComparer<int> Comparer {
[System.Runtime.CompilerServices.NullableContext(1)]
get {
return _set.Comparer;
}
}
[System.Runtime.CompilerServices.NullableContext(1)]
public void Store(FrozenSet<int> set)
{
_set = (Int32FrozenSet)set;
}
public int FindItemIndex(int item)
{
return _set.FindItemIndex(item);
}
public Enumerator GetEnumerator()
{
return _set.GetEnumerator();
}
}
private readonly FrozenHashTable _hashTable;
[System.Runtime.CompilerServices.Nullable(1)]
private protected override int[] ItemsCore {
[System.Runtime.CompilerServices.NullableContext(1)]
get {
return _hashTable.HashCodes;
}
}
private protected override int CountCore => _hashTable.Count;
[System.Runtime.CompilerServices.NullableContext(1)]
internal Int32FrozenSet(HashSet<int> source)
: base((IEqualityComparer<int>)EqualityComparer<int>.Default)
{
int count = source.Count;
int[] array = ArrayPool<int>.Shared.Rent(count);
source.CopyTo(array);
_hashTable = FrozenHashTable.Create(new Span<int>(array, 0, count), true);
ArrayPool<int>.Shared.Return(array, false);
}
private protected override Enumerator GetEnumeratorCore()
{
return new Enumerator(_hashTable.HashCodes);
}
private protected override int FindItemIndex(int item)
{
_hashTable.FindMatchingEntries(item, out int i, out int endIndex);
int[] hashCodes = _hashTable.HashCodes;
for (; i <= endIndex; i++) {
if (item == hashCodes[i])
return i;
}
return -1;
}
}
}