diff --git a/src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.cs b/src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.cs index 86038795cef8d..2eb47a31fcc8f 100644 --- a/src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.cs +++ b/src/libraries/System.Private.CoreLib/src/System/MemoryExtensions.cs @@ -619,98 +619,8 @@ ref Unsafe.As(ref MemoryMarshal.GetReference(span)), /// The span to search. /// The set of values to search for. [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static int IndexOfAny(this Span span, ReadOnlySpan values) where T : IEquatable - { - if (RuntimeHelpers.IsBitwiseEquatable()) - { - if (Unsafe.SizeOf() == sizeof(byte)) - { - ref byte valueRef = ref Unsafe.As(ref MemoryMarshal.GetReference(values)); - if (values.Length == 2) - { - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - Unsafe.Add(ref valueRef, 1), - span.Length); - } - else if (values.Length == 3) - { - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - Unsafe.Add(ref valueRef, 1), - Unsafe.Add(ref valueRef, 2), - span.Length); - } - else - { - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - span.Length, - ref valueRef, - values.Length); - } - } - - if (Unsafe.SizeOf() == sizeof(char)) - { - ref char valueRef = ref Unsafe.As(ref MemoryMarshal.GetReference(values)); - if (values.Length == 5) - { - // Length 5 is a common length for FileSystemName expression (", <, >, *, ?) and in preference to 2 as it has an explicit overload - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - Unsafe.Add(ref valueRef, 1), - Unsafe.Add(ref valueRef, 2), - Unsafe.Add(ref valueRef, 3), - Unsafe.Add(ref valueRef, 4), - span.Length); - } - else if (values.Length == 2) - { - // Length 2 is a common length for simple wildcards (*, ?), directory separators (/, \), quotes (", '), brackets, etc - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - Unsafe.Add(ref valueRef, 1), - span.Length); - } - else if (values.Length == 4) - { - // Length 4 before 3 as 3 has an explicit overload - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - Unsafe.Add(ref valueRef, 1), - Unsafe.Add(ref valueRef, 2), - Unsafe.Add(ref valueRef, 3), - span.Length); - } - else if (values.Length == 3) - { - return SpanHelpers.IndexOfAny( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - Unsafe.Add(ref valueRef, 1), - Unsafe.Add(ref valueRef, 2), - span.Length); - } - else if (values.Length == 1) - { - // Length 1 last, as ctoring a ReadOnlySpan to call this overload for a single value - // is already throwing away a bunch of performance vs just calling IndexOf - return SpanHelpers.IndexOf( - ref Unsafe.As(ref MemoryMarshal.GetReference(span)), - valueRef, - span.Length); - } - } - } - - return SpanHelpers.IndexOfAny(ref MemoryMarshal.GetReference(span), span.Length, ref MemoryMarshal.GetReference(values), values.Length); - } + public static int IndexOfAny(this Span span, ReadOnlySpan values) where T : IEquatable => + IndexOfAny((ReadOnlySpan)span, values); /// /// Searches for the first index of any of the specified values similar to calling IndexOf several times with the logical OR operator. If not found, returns -1.