@@ -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