LengthBucketsFrozenSet
using System.Collections.Generic;
using System.Runtime.CompilerServices;
namespace System.Collections.Frozen
{
[System.Runtime.CompilerServices.NullableContext(1)]
[System.Runtime.CompilerServices.Nullable(new byte[] {
0,
1
})]
internal sealed class LengthBucketsFrozenSet : FrozenSetInternalBase<string, LengthBucketsFrozenSet.GSW>
{
[System.Runtime.CompilerServices.Nullable(0)]
internal struct GSW : IGenericSpecializedWrapper
{
private LengthBucketsFrozenSet _set;
public int Count => _set.Count;
public IEqualityComparer<string> Comparer => _set.Comparer;
public void Store(FrozenSet<string> set)
{
_set = (LengthBucketsFrozenSet)set;
}
public int FindItemIndex(string item)
{
return _set.FindItemIndex(item);
}
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
0,
1
})]
public Enumerator GetEnumerator()
{
return _set.GetEnumerator();
}
}
private readonly int[] _lengthBuckets;
private readonly int _minLength;
private readonly string[] _items;
private readonly bool _ignoreCase;
private protected override string[] ItemsCore => _items;
private protected override int CountCore => _items.Length;
private LengthBucketsFrozenSet(string[] items, int[] lengthBuckets, int minLength, IEqualityComparer<string> comparer)
: base(comparer)
{
_items = items;
_lengthBuckets = lengthBuckets;
_minLength = minLength;
_ignoreCase = (comparer == StringComparer.OrdinalIgnoreCase);
}
[return: System.Runtime.CompilerServices.Nullable(2)]
internal static LengthBucketsFrozenSet CreateLengthBucketsFrozenSetIfAppropriate(string[] items, IEqualityComparer<string> comparer, int minLength, int maxLength)
{
int[] array = LengthBuckets.CreateLengthBucketsArrayIfAppropriate(items, comparer, minLength, maxLength);
if (array == null)
return null;
return new LengthBucketsFrozenSet(items, array, minLength, comparer);
}
[return: System.Runtime.CompilerServices.Nullable(new byte[] {
0,
1
})]
private protected override Enumerator GetEnumeratorCore()
{
return new Enumerator(_items);
}
[System.Runtime.CompilerServices.NullableContext(2)]
private protected override int FindItemIndex(string item)
{
if (item != null) {
int i = (item.Length - _minLength) * 5;
int num = i + 5;
int[] lengthBuckets = _lengthBuckets;
if (i >= 0 && num <= lengthBuckets.Length) {
string[] items = _items;
if (_ignoreCase) {
for (; i < num; i++) {
int num2 = lengthBuckets[i];
if ((uint)num2 >= (uint)items.Length)
break;
if (StringComparer.OrdinalIgnoreCase.Equals(item, items[num2]))
return num2;
}
} else {
for (; i < num; i++) {
int num3 = lengthBuckets[i];
if ((uint)num3 >= (uint)items.Length)
break;
if (item == items[num3])
return num3;
}
}
}
}
return -1;
}
}
}