Skip to content

Commit 15afc4c

Browse files
committed
Add Contains and IndexOfValue(3 chars)
1 parent 92a644d commit 15afc4c

11 files changed

+453
-65
lines changed

src/libraries/System.Private.CoreLib/src/System.Private.CoreLib.Shared.projitems

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -425,20 +425,21 @@
425425
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny1ByteValue.cs" />
426426
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny2ByteValues.cs" />
427427
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny2CharValues.cs" />
428-
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny3Values.cs" />
428+
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny3ByteValues.cs" />
429+
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny3CharValues.cs" />
429430
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny4Values.cs" />
430431
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAny5Values.cs" />
431432
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyAsciiByteValues.cs" />
432433
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyAsciiCharValues.cs" />
433434
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyAsciiSearcher.cs" />
434435
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyByteValues.cs" />
436+
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyByteValuesInRange.cs" />
435437
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyCharValuesInRange.cs" />
436438
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyCharValuesProbabilistic.cs" />
437439
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyLatin1CharValues.cs" />
438440
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyValues.cs" />
439441
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyValues.T.cs" />
440442
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyValuesDebugView.cs" />
441-
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfAnyByteValuesInRange.cs" />
442443
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\IndexOfEmptyValues.cs" />
443444
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOfAnyValues\ProbabilisticMap.cs" />
444445
<Compile Include="$(MSBuildThisFileDirectory)System\IndexOutOfRangeException.cs" />
@@ -1031,8 +1032,8 @@
10311032
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.BinarySearch.cs" />
10321033
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.Byte.cs" />
10331034
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.Char.cs" />
1034-
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.Char.Packed.cs" />
10351035
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.cs" />
1036+
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.Packed.cs" />
10361037
<Compile Include="$(MSBuildThisFileDirectory)System\SpanHelpers.T.cs" />
10371038
<Compile Include="$(MSBuildThisFileDirectory)System\SR.cs" />
10381039
<Compile Include="$(MSBuildThisFileDirectory)System\StackOverflowException.cs" />

src/libraries/System.Private.CoreLib/src/System/Globalization/Ordinal.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -339,8 +339,8 @@ internal static int IndexOfOrdinalIgnoreCase(ReadOnlySpan<char> source, ReadOnly
339339
{
340340
// Do a quick search for the first element of "value".
341341
int relativeIndex = isLetter ?
342-
SpanHelpers.PackedIndexOfIsSupported
343-
? SpanHelpers.PackedIndexOfAny(ref Unsafe.Add(ref searchSpace, offset), valueCharU, valueCharL, searchSpaceLength)
342+
PackedSpanHelpers.PackedIndexOfIsSupported
343+
? PackedSpanHelpers.PackedIndexOfAny(ref Unsafe.Add(ref searchSpace, offset), valueCharU, valueCharL, searchSpaceLength)
344344
: SpanHelpers.IndexOfAnyChar(ref Unsafe.Add(ref searchSpace, offset), valueCharU, valueCharL, searchSpaceLength) :
345345
SpanHelpers.IndexOfChar(ref Unsafe.Add(ref searchSpace, offset), valueChar, searchSpaceLength);
346346
if (relativeIndex < 0)

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny1CharValue.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ internal override bool ContainsCore(char value) =>
2323
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2424
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
2525
TShouldUsePacked.Value
26-
? SpanHelpers.PackedIndexOf(ref MemoryMarshal.GetReference(span), _e0, span.Length)
26+
? PackedSpanHelpers.PackedIndexOf(ref MemoryMarshal.GetReference(span), _e0, span.Length)
2727
: SpanHelpers.NonPackedIndexOfValueType<short, SpanHelpers.DontNegate<short>>(
2828
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
2929
Unsafe.As<char, short>(ref _e0),
@@ -32,7 +32,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3232
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3333
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
3434
TShouldUsePacked.Value
35-
? SpanHelpers.PackedIndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, span.Length)
35+
? PackedSpanHelpers.PackedIndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, span.Length)
3636
: SpanHelpers.NonPackedIndexOfValueType<short, SpanHelpers.Negate<short>>(
3737
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3838
Unsafe.As<char, short>(ref _e0),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny2CharValues.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ internal sealed class IndexOfAny2CharValue<TShouldUsePacked> : IndexOfAnyValues<
1414
public IndexOfAny2CharValue(char value0, char value1) =>
1515
(_e0, _e1) = (value0, value1);
1616

17-
internal override char[] GetValues() => new[] { _e0 };
17+
internal override char[] GetValues() => new[] { _e0, _e1 };
1818

1919
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2020
internal override bool ContainsCore(char value) =>
@@ -23,7 +23,7 @@ internal override bool ContainsCore(char value) =>
2323
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2424
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
2525
TShouldUsePacked.Value
26-
? SpanHelpers.PackedIndexOfAny(ref MemoryMarshal.GetReference(span), _e0, _e1, span.Length)
26+
? PackedSpanHelpers.PackedIndexOfAny(ref MemoryMarshal.GetReference(span), _e0, _e1, span.Length)
2727
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.DontNegate<short>>(
2828
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
2929
Unsafe.As<char, short>(ref _e0),
@@ -33,7 +33,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3333
[MethodImpl(MethodImplOptions.AggressiveInlining)]
3434
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
3535
TShouldUsePacked.Value
36-
? SpanHelpers.PackedIndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, _e1, span.Length)
36+
? PackedSpanHelpers.PackedIndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, _e1, span.Length)
3737
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.Negate<short>>(
3838
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
3939
Unsafe.As<char, short>(ref _e0),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny3Values.cs renamed to src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAny3ByteValues.cs

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,42 +2,40 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33

44
using System.Diagnostics;
5-
using System.Numerics;
65
using System.Runtime.CompilerServices;
76

87
namespace System.Buffers
98
{
10-
internal sealed class IndexOfAny3Values<T> : IndexOfAnyValues<T>
11-
where T : struct, INumber<T>
9+
internal sealed class IndexOfAny3ByteValues : IndexOfAnyValues<byte>
1210
{
13-
private readonly T _e0, _e1, _e2;
11+
private readonly byte _e0, _e1, _e2;
1412

15-
public IndexOfAny3Values(ReadOnlySpan<T> values)
13+
public IndexOfAny3ByteValues(ReadOnlySpan<byte> values)
1614
{
1715
Debug.Assert(values.Length == 3);
1816
(_e0, _e1, _e2) = (values[0], values[1], values[2]);
1917
}
2018

21-
internal override T[] GetValues() => new[] { _e0, _e1, _e2 };
19+
internal override byte[] GetValues() => new[] { _e0, _e1, _e2 };
2220

2321
[MethodImpl(MethodImplOptions.AggressiveInlining)]
24-
internal override bool ContainsCore(T value) =>
22+
internal override bool ContainsCore(byte value) =>
2523
value == _e0 || value == _e1 || value == _e2;
2624

2725
[MethodImpl(MethodImplOptions.AggressiveInlining)]
28-
internal override int IndexOfAny(ReadOnlySpan<T> span) =>
26+
internal override int IndexOfAny(ReadOnlySpan<byte> span) =>
2927
span.IndexOfAny(_e0, _e1, _e2);
3028

3129
[MethodImpl(MethodImplOptions.AggressiveInlining)]
32-
internal override int IndexOfAnyExcept(ReadOnlySpan<T> span) =>
30+
internal override int IndexOfAnyExcept(ReadOnlySpan<byte> span) =>
3331
span.IndexOfAnyExcept(_e0, _e1, _e2);
3432

3533
[MethodImpl(MethodImplOptions.AggressiveInlining)]
36-
internal override int LastIndexOfAny(ReadOnlySpan<T> span) =>
34+
internal override int LastIndexOfAny(ReadOnlySpan<byte> span) =>
3735
span.LastIndexOfAny(_e0, _e1, _e2);
3836

3937
[MethodImpl(MethodImplOptions.AggressiveInlining)]
40-
internal override int LastIndexOfAnyExcept(ReadOnlySpan<T> span) =>
38+
internal override int LastIndexOfAnyExcept(ReadOnlySpan<byte> span) =>
4139
span.LastIndexOfAnyExcept(_e0, _e1, _e2);
4240
}
4341
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
using System.Runtime.CompilerServices;
5+
using System.Runtime.InteropServices;
6+
7+
namespace System.Buffers
8+
{
9+
internal sealed class IndexOfAny3CharValue<TShouldUsePacked> : IndexOfAnyValues<char>
10+
where TShouldUsePacked : struct, IndexOfAnyValues.IRuntimeConst
11+
{
12+
private char _e0, _e1, _e2;
13+
14+
public IndexOfAny3CharValue(char value0, char value1, char value2) =>
15+
(_e0, _e1, _e2) = (value0, value1, value2);
16+
17+
internal override char[] GetValues() => new[] { _e0, _e1, _e2 };
18+
19+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
20+
internal override bool ContainsCore(char value) =>
21+
value == _e0 || value == _e1 || value == _e2;
22+
23+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
24+
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
25+
TShouldUsePacked.Value
26+
? PackedSpanHelpers.PackedIndexOfAny(ref MemoryMarshal.GetReference(span), _e0, _e1, _e2, span.Length)
27+
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.DontNegate<short>>(
28+
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
29+
Unsafe.As<char, short>(ref _e0),
30+
Unsafe.As<char, short>(ref _e1),
31+
Unsafe.As<char, short>(ref _e2),
32+
span.Length);
33+
34+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
35+
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
36+
TShouldUsePacked.Value
37+
? PackedSpanHelpers.PackedIndexOfAnyExcept(ref MemoryMarshal.GetReference(span), _e0, _e1, _e2, span.Length)
38+
: SpanHelpers.NonPackedIndexOfAnyValueType<short, SpanHelpers.Negate<short>>(
39+
ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(span)),
40+
Unsafe.As<char, short>(ref _e0),
41+
Unsafe.As<char, short>(ref _e1),
42+
Unsafe.As<char, short>(ref _e2),
43+
span.Length);
44+
45+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
46+
internal override int LastIndexOfAny(ReadOnlySpan<char> span) =>
47+
span.LastIndexOfAny(_e0, _e1, _e2);
48+
49+
[MethodImpl(MethodImplOptions.AggressiveInlining)]
50+
internal override int LastIndexOfAnyExcept(ReadOnlySpan<char> span) =>
51+
span.LastIndexOfAnyExcept(_e0, _e1, _e2);
52+
}
53+
}

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyCharValuesInRange.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ internal override bool ContainsCore(char value) =>
3939
[MethodImpl(MethodImplOptions.AggressiveInlining)]
4040
internal override int IndexOfAny(ReadOnlySpan<char> span) =>
4141
TShouldUsePacked.Value
42-
? SpanHelpers.PackedIndexOfAnyInRange(ref MemoryMarshal.GetReference(span), _lowInclusive, _rangeInclusive, span.Length)
42+
? PackedSpanHelpers.PackedIndexOfAnyInRange(ref MemoryMarshal.GetReference(span), _lowInclusive, _rangeInclusive, span.Length)
4343
: SpanHelpers.NonPackedIndexOfAnyInRangeUnsignedNumber<ushort, SpanHelpers.DontNegate<ushort>>(
4444
ref Unsafe.As<char, ushort>(ref MemoryMarshal.GetReference(span)),
4545
Unsafe.As<char, ushort>(ref _lowInclusive),
@@ -49,7 +49,7 @@ ref Unsafe.As<char, ushort>(ref MemoryMarshal.GetReference(span)),
4949
[MethodImpl(MethodImplOptions.AggressiveInlining)]
5050
internal override int IndexOfAnyExcept(ReadOnlySpan<char> span) =>
5151
TShouldUsePacked.Value
52-
? SpanHelpers.PackedIndexOfAnyExceptInRange(ref MemoryMarshal.GetReference(span), _lowInclusive, _rangeInclusive, span.Length)
52+
? PackedSpanHelpers.PackedIndexOfAnyExceptInRange(ref MemoryMarshal.GetReference(span), _lowInclusive, _rangeInclusive, span.Length)
5353
: SpanHelpers.NonPackedIndexOfAnyInRangeUnsignedNumber<ushort, SpanHelpers.Negate<ushort>>(
5454
ref Unsafe.As<char, ushort>(ref MemoryMarshal.GetReference(span)),
5555
Unsafe.As<char, ushort>(ref _lowInclusive),

src/libraries/System.Private.CoreLib/src/System/IndexOfAnyValues/IndexOfAnyValues.cs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static IndexOfAnyValues<byte> Create(ReadOnlySpan<byte> values)
4848
return values.Length switch
4949
{
5050
2 => new IndexOfAny2ByteValues(values),
51-
3 => new IndexOfAny3Values<byte>(values),
51+
3 => new IndexOfAny3ByteValues(values),
5252
4 => new IndexOfAny4Values<byte, byte>(values),
5353
_ => new IndexOfAny5Values<byte, byte>(values),
5454
};
@@ -80,7 +80,7 @@ public static IndexOfAnyValues<char> Create(ReadOnlySpan<char> values)
8080
if (values.Length == 1)
8181
{
8282
char value = values[0];
83-
return SpanHelpers.CanUsePackedIndexOf(value)
83+
return PackedSpanHelpers.CanUsePackedIndexOf(value)
8484
? new IndexOfAny1CharValue<TrueConst>(value)
8585
: new IndexOfAny1CharValue<FalseConst>(value);
8686
}
@@ -95,14 +95,19 @@ public static IndexOfAnyValues<char> Create(ReadOnlySpan<char> values)
9595
{
9696
char value0 = values[0];
9797
char value1 = values[1];
98-
return SpanHelpers.CanUsePackedIndexOf(value0) && SpanHelpers.CanUsePackedIndexOf(value1)
98+
return PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1)
9999
? new IndexOfAny2CharValue<TrueConst>(value0, value1)
100100
: new IndexOfAny2CharValue<FalseConst>(value0, value1);
101101
}
102102

103103
if (values.Length == 3)
104104
{
105-
return new IndexOfAny3Values<char>(values);
105+
char value0 = values[0];
106+
char value1 = values[1];
107+
char value2 = values[2];
108+
return PackedSpanHelpers.CanUsePackedIndexOf(value0) && PackedSpanHelpers.CanUsePackedIndexOf(value1) && PackedSpanHelpers.CanUsePackedIndexOf(value2)
109+
? new IndexOfAny3CharValue<TrueConst>(value0, value1, value2)
110+
: new IndexOfAny3CharValue<FalseConst>(value0, value1, value2);
106111
}
107112

108113
// IndexOfAnyAsciiSearcher for chars is slower than IndexOfAny3Values, but faster than IndexOfAny4Values
@@ -180,7 +185,7 @@ ref Unsafe.As<char, short>(ref MemoryMarshal.GetReference(values)),
180185
}
181186

182187
Debug.Assert(typeof(T) == typeof(char));
183-
return (IndexOfAnyValues<T>)(object)(SpanHelpers.CanUsePackedIndexOf(min) && SpanHelpers.CanUsePackedIndexOf(max)
188+
return (IndexOfAnyValues<T>)(object)(PackedSpanHelpers.CanUsePackedIndexOf(min) && PackedSpanHelpers.CanUsePackedIndexOf(max)
184189
? new IndexOfAnyCharValuesInRange<TrueConst>(*(char*)&min, *(char*)&max)
185190
: new IndexOfAnyCharValuesInRange<FalseConst>(*(char*)&min, *(char*)&max));
186191
}

0 commit comments

Comments
 (0)