Skip to content

Commit cc8bd94

Browse files
committed
Add missing special cases for {Last}IndexOfAny<byte>(ROS, ROS)
1 parent 3ce1ea2 commit cc8bd94

1 file changed

Lines changed: 75 additions & 30 deletions

File tree

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

Lines changed: 75 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,23 +1314,50 @@ public static int IndexOfAny<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> value
13141314
{
13151315
if (Unsafe.SizeOf<T>() == sizeof(byte))
13161316
{
1317+
ref byte spanRef = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span));
13171318
ref byte valueRef = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(values));
1318-
if (values.Length == 2)
1319-
{
1320-
return SpanHelpers.IndexOfAnyValueType(
1321-
ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)),
1322-
valueRef,
1323-
Unsafe.Add(ref valueRef, 1),
1324-
span.Length);
1325-
}
1326-
else if (values.Length == 3)
1319+
switch (values.Length)
13271320
{
1328-
return SpanHelpers.IndexOfAnyValueType(
1329-
ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)),
1330-
valueRef,
1331-
Unsafe.Add(ref valueRef, 1),
1332-
Unsafe.Add(ref valueRef, 2),
1333-
span.Length);
1321+
case 0:
1322+
return -1;
1323+
1324+
case 1:
1325+
return SpanHelpers.IndexOfValueType(ref spanRef, valueRef, span.Length);
1326+
1327+
case 2:
1328+
return SpanHelpers.IndexOfAnyValueType(
1329+
ref spanRef,
1330+
valueRef,
1331+
Unsafe.Add(ref valueRef, 1),
1332+
span.Length);
1333+
1334+
case 3:
1335+
return SpanHelpers.IndexOfAnyValueType(
1336+
ref spanRef,
1337+
valueRef,
1338+
Unsafe.Add(ref valueRef, 1),
1339+
Unsafe.Add(ref valueRef, 2),
1340+
span.Length);
1341+
1342+
#if !MONO // We don't have a mono overload for 4 values
1343+
case 4:
1344+
return SpanHelpers.IndexOfAnyValueType(
1345+
ref spanRef,
1346+
valueRef,
1347+
Unsafe.Add(ref valueRef, 1),
1348+
Unsafe.Add(ref valueRef, 2),
1349+
Unsafe.Add(ref valueRef, 3),
1350+
span.Length);
1351+
#endif
1352+
case 5:
1353+
return SpanHelpers.IndexOfAnyValueType(
1354+
ref spanRef,
1355+
valueRef,
1356+
Unsafe.Add(ref valueRef, 1),
1357+
Unsafe.Add(ref valueRef, 2),
1358+
Unsafe.Add(ref valueRef, 3),
1359+
Unsafe.Add(ref valueRef, 4),
1360+
span.Length);
13341361
}
13351362
}
13361363

@@ -1573,23 +1600,41 @@ public static int LastIndexOfAny<T>(this ReadOnlySpan<T> span, ReadOnlySpan<T> v
15731600
{
15741601
if (Unsafe.SizeOf<T>() == sizeof(byte))
15751602
{
1603+
ref byte spanRef = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span));
15761604
ref byte valueRef = ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(values));
1577-
if (values.Length == 2)
1578-
{
1579-
return SpanHelpers.LastIndexOfAnyValueType(
1580-
ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)),
1581-
valueRef,
1582-
Unsafe.Add(ref valueRef, 1),
1583-
span.Length);
1584-
}
1585-
else if (values.Length == 3)
1605+
switch (values.Length)
15861606
{
1587-
return SpanHelpers.LastIndexOfAnyValueType(
1588-
ref Unsafe.As<T, byte>(ref MemoryMarshal.GetReference(span)),
1589-
valueRef,
1590-
Unsafe.Add(ref valueRef, 1),
1591-
Unsafe.Add(ref valueRef, 2),
1592-
span.Length);
1607+
case 0:
1608+
return -1;
1609+
1610+
case 1:
1611+
return SpanHelpers.LastIndexOfValueType(ref spanRef, valueRef, span.Length);
1612+
1613+
case 2:
1614+
return SpanHelpers.LastIndexOfAnyValueType(
1615+
ref spanRef,
1616+
valueRef,
1617+
Unsafe.Add(ref valueRef, 1),
1618+
span.Length);
1619+
1620+
case 3:
1621+
return SpanHelpers.LastIndexOfAnyValueType(
1622+
ref spanRef,
1623+
valueRef,
1624+
Unsafe.Add(ref valueRef, 1),
1625+
Unsafe.Add(ref valueRef, 2),
1626+
span.Length);
1627+
1628+
#if !MONO // We don't have a mono overload for 4 values
1629+
case 4:
1630+
return SpanHelpers.LastIndexOfAnyValueType(
1631+
ref spanRef,
1632+
valueRef,
1633+
Unsafe.Add(ref valueRef, 1),
1634+
Unsafe.Add(ref valueRef, 2),
1635+
Unsafe.Add(ref valueRef, 3),
1636+
span.Length);
1637+
#endif
15931638
}
15941639
}
15951640

0 commit comments

Comments
 (0)