diff --git a/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs b/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs index 136e345747897b..20e95c15d75230 100644 --- a/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs +++ b/src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs @@ -37,9 +37,9 @@ public static IndexOfAnyValues Create(ReadOnlySpan values) } // IndexOfAnyValuesInRange is slower than IndexOfAny1Value, but faster than IndexOfAny2Values - if (TryGetSingleRange(values, out byte maxInclusive) is IndexOfAnyValues range) + if (TryGetSingleRange(values, out byte minInclusive, out byte maxInclusive)) { - return range; + return new IndexOfAnyByteValuesInRange(minInclusive, maxInclusive); } if (values.Length <= 5) @@ -86,9 +86,11 @@ public static IndexOfAnyValues Create(ReadOnlySpan values) } // IndexOfAnyValuesInRange is slower than IndexOfAny1Value, but faster than IndexOfAny2Values - if (TryGetSingleRange(values, out char maxInclusive) is IndexOfAnyValues charRange) + if (TryGetSingleRange(values, out char minInclusive, out char maxInclusive)) { - return charRange; + return PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(minInclusive) && PackedSpanHelpers.CanUsePackedIndexOf(maxInclusive) + ? new IndexOfAnyCharValuesInRange(minInclusive, maxInclusive) + : new IndexOfAnyCharValuesInRange(minInclusive, maxInclusive); } if (values.Length == 2) @@ -144,7 +146,7 @@ ref Unsafe.As(ref MemoryMarshal.GetReference(values)), return new IndexOfAnyCharValuesProbabilistic(values); } - private static unsafe IndexOfAnyValues? TryGetSingleRange(ReadOnlySpan values, out T maxInclusive) + private static bool TryGetSingleRange(ReadOnlySpan values, out T minInclusive, out T maxInclusive) where T : struct, INumber, IMinMaxValue { T min = T.MaxValue; @@ -156,12 +158,13 @@ ref Unsafe.As(ref MemoryMarshal.GetReference(values)), max = T.Max(max, value); } + minInclusive = min; maxInclusive = max; uint range = uint.CreateChecked(max - min) + 1; if (range > values.Length) { - return null; + return false; } Span seenValues = range <= 256 ? stackalloc bool[256] : new bool[range]; @@ -176,18 +179,10 @@ ref Unsafe.As(ref MemoryMarshal.GetReference(values)), if (seenValues.Contains(false)) { - return null; + return false; } - if (typeof(T) == typeof(byte)) - { - return (IndexOfAnyValues)(object)new IndexOfAnyByteValuesInRange(byte.CreateChecked(min), byte.CreateChecked(max)); - } - - Debug.Assert(typeof(T) == typeof(char)); - return (IndexOfAnyValues)(object)(PackedSpanHelpers.PackedIndexOfIsSupported && PackedSpanHelpers.CanUsePackedIndexOf(min) && PackedSpanHelpers.CanUsePackedIndexOf(max) - ? new IndexOfAnyCharValuesInRange(*(char*)&min, *(char*)&max) - : new IndexOfAnyCharValuesInRange(*(char*)&min, *(char*)&max)); + return true; } internal interface IRuntimeConst