Skip to content

Commit 37c8237

Browse files
author
Aaron Dandy
committed
Remove span ordinal compare abstractions
1 parent 441e38a commit 37c8237

13 files changed

+28
-38
lines changed

WeCantSpell.Hunspell/AffixReader.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -854,7 +854,7 @@ private bool TryParseAffixIntoList<TAffixEntry>(ReadOnlySpan<char> parameterText
854854
}
855855

856856
var group3 = affixParser.ParseNextArgument();
857-
if (group3.IsEmpty && group2.EqualsOrdinal("."))
857+
if (group3.IsEmpty && group2.EqualsOrdinal('.'))
858858
{
859859
// In some special cases it seems as if the group 2 is blank but groups 1 and 3 have values in them.
860860
// I think this is a way to make a blank affix value.

WeCantSpell.Hunspell/CandidateStack.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ public readonly bool Contains(ReadOnlySpan<char> value)
7171
_s0 is not null
7272
&&
7373
(
74-
StringEx.EqualsOrdinal(_s0, value)
74+
_s0.AsSpan().SequenceEqual(value)
7575
||
7676
(_rest is not null && _rest.Contains(value))
7777
);

WeCantSpell.Hunspell/EncodingEx.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ internal static class EncodingEx
1313

1414
private static Encoding? GetUtf8EncodingOrDefault(ReadOnlySpan<char> encodingName)
1515
{
16-
if (encodingName.EqualsOrdinal("UTF8") || encodingName.EqualsOrdinal("UTF-8"))
16+
if (encodingName.Equals("UTF8", StringComparison.OrdinalIgnoreCase) || encodingName.Equals("UTF-8", StringComparison.OrdinalIgnoreCase))
1717
{
1818
return Encoding.UTF8;
1919
}

WeCantSpell.Hunspell/StringEx.cs

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ internal static partial class StringEx
1616

1717
public static bool StartsWith(this ReadOnlySpan<char> @this, string value, StringComparison comparison) => @this.StartsWith(value.AsSpan(), comparison);
1818

19+
public static bool StartsWithOrdinal(this ReadOnlySpan<char> @this, string value) => @this.StartsWith(value.AsSpan());
20+
1921
public static bool StartsWith(this ReadOnlySpan<char> @this, char value) => @this.Length > 0 && @this[0] == value;
2022

2123
public static bool EndsWith(this string @this, char character) => @this.Length > 0 && @this[@this.Length - 1] == character;
@@ -26,16 +28,10 @@ internal static partial class StringEx
2628

2729
public static bool Equals(this ReadOnlySpan<char> @this, string value, StringComparison comparison) => @this.Equals(value.AsSpan(), comparison);
2830

29-
public static bool EqualsOrdinal(this ReadOnlySpan<char> @this, string value) => @this.Equals(value, StringComparison.Ordinal);
30-
3131
public static bool EqualsOrdinal(this ReadOnlySpan<char> @this, char value) => @this.Length == 1 && @this[0] == value;
3232

33-
public static bool EqualsOrdinal(this string @this, ReadOnlySpan<char> value) => value.Equals(@this, StringComparison.Ordinal);
34-
3533
public static bool EqualsOrdinal(this string @this, char value) => @this.Length == 1 && @this[0] == value;
3634

37-
public static bool EqualsOrdinal(this ReadOnlySpan<char> @this, ReadOnlySpan<char> value) => @this.Equals(value, StringComparison.Ordinal);
38-
3935
public static bool IsTabOrSpace(this char c) => c is '\t' or ' ';
4036

4137
#if HAS_SEARCHVALUES
@@ -44,12 +40,6 @@ internal static partial class StringEx
4440
public static int IndexOfTabOrSpace(this ReadOnlySpan<char> span) => span.IndexOfAny('\t', ' ');
4541
#endif
4642

47-
public static int IndexOf(this ReadOnlySpan<char> @this, ReadOnlySpan<char> value, int startIndex, StringComparison comparisonType)
48-
{
49-
var result = @this.Slice(startIndex).IndexOf(value, comparisonType);
50-
return result < 0 ? result : result + startIndex;
51-
}
52-
5343
#if NO_STRING_CONTAINS
5444

5545
public static bool Contains(this string @this, char value) => @this.IndexOf(value) >= 0;

WeCantSpell.Hunspell/WordList.Query.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2002,7 +2002,7 @@ private bool CompoundCheckExplicitlyForbidden(ReadOnlySpan<char> word, int len,
20022002
return false;
20032003

20042004
static bool equalsOrdinalLimited(ReadOnlySpan<char> a, ReadOnlySpan<char> b, int limit) =>
2005-
a.Limit(limit).EqualsOrdinal(b.Limit(limit));
2005+
a.Limit(limit).SequenceEqual(b.Limit(limit));
20062006
}
20072007

20082008
private WordEntry? CheckWordPrefix(PrefixEntry affix, ReadOnlySpan<char> word, CompoundOptions inCompound, FlagValue needFlag)

WeCantSpell.Hunspell/WordList.QueryCheck.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ public SpellCheckResult CheckDetails(ReadOnlySpan<char> word)
9191
return SpellCheckResult.DefaultWrong;
9292
}
9393

94-
if (word.StartsWith(Query.DefaultXmlTokenCheckPrefix, StringComparison.Ordinal))
94+
if (word.StartsWith(Query.DefaultXmlTokenCheckPrefix.AsSpan()))
9595
{
9696
// Hunspell supports XML input of the simplified API (see manual)
9797
return SpellCheckResult.DefaultCorrect;
@@ -273,7 +273,7 @@ private readonly bool CheckDetailsInternalBreakPoints_BoundaryCheck(string scw,
273273
var pLastIndex = breakEntry.Length - 1;
274274
if (
275275
breakEntry[0] == '^'
276-
&& scw.AsSpan(0, pLastIndex).EqualsOrdinal(breakEntry.AsSpan(1))
276+
&& scw.AsSpan(0, pLastIndex).SequenceEqual(breakEntry.AsSpan(1))
277277
&& CheckNested(scw.AsSpan(pLastIndex))
278278
)
279279
{
@@ -282,7 +282,7 @@ private readonly bool CheckDetailsInternalBreakPoints_BoundaryCheck(string scw,
282282

283283
if (
284284
breakEntry[pLastIndex] == '$'
285-
&& scw.AsSpan(scw.Length - pLastIndex).EqualsOrdinal(breakEntry.AsSpan(0, pLastIndex))
285+
&& scw.AsSpan(scw.Length - pLastIndex).SequenceEqual(breakEntry.AsSpan(0, pLastIndex))
286286
&& CheckNested(scw.AsSpan(0, scw.Length - pLastIndex))
287287
)
288288
{

WeCantSpell.Hunspell/WordList.QuerySuggest.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public List<string> Suggest(ReadOnlySpan<char> word)
118118
}
119119

120120
// process XML input of the simplified API (see manual)
121-
if (word.StartsWith(Query.DefaultXmlTokenCheckPrefix, StringComparison.Ordinal))
121+
if (word.StartsWithOrdinal(Query.DefaultXmlTokenCheckPrefix))
122122
{
123123
goto fail; // TODO: complete support for XML input
124124
}
@@ -307,7 +307,7 @@ private List<string> SuggestInternal(ReadOnlySpan<char> word, string scw, Capita
307307
var slen = toRemove.Length - spaceIndex - 1;
308308

309309
// different case after space (need capitalisation)
310-
if (slen < scw.Length && !scw.AsSpan(scw.Length - slen).EqualsOrdinal(toRemove.AsSpan(spaceIndex + 1)))
310+
if (slen < scw.Length && !scw.AsSpan(scw.Length - slen).SequenceEqual(toRemove.AsSpan(spaceIndex + 1)))
311311
{
312312
// set as first suggestion
313313
removeFromIndexThenInsertAtFront(
@@ -460,7 +460,7 @@ static void removeFromIndexThenInsertAtFront(List<string> list, int removeIndex,
460460
}
461461

462462
var chunk = scw.AsSpan(prevPos, dashPos - prevPos);
463-
if (!chunk.EqualsOrdinal(word) && !Check(chunk))
463+
if (!chunk.SequenceEqual(word) && !Check(chunk))
464464
{
465465
var nlst = SuggestNested(chunk);
466466

@@ -1193,7 +1193,7 @@ private void MapRelated(string word, ref string candidate, int wn, ref SuggestSt
11931193
{
11941194
foreach (var mapEntryValue in mapEntry.RawArray)
11951195
{
1196-
if (word.AsSpan(wn).StartsWith(mapEntryValue, StringComparison.Ordinal))
1196+
if (word.AsSpan(wn).StartsWithOrdinal(mapEntryValue))
11971197
{
11981198
inMap = true;
11991199
var candidatePrefix = candidate;
@@ -2477,7 +2477,7 @@ private readonly string ConcatWithSuffix(string word, SuffixEntry entry)
24772477
return string.Concat(word, entry.Append);
24782478
}
24792479

2480-
if (word.AsSpan(word.Length - entry.Strip.Length).EqualsOrdinal(entry.Strip))
2480+
if (word.AsSpan(word.Length - entry.Strip.Length).SequenceEqual(entry.Strip.AsSpan()))
24812481
{
24822482
// we have a match so add suffix
24832483
return word.AsSpanRemoveFromEnd(entry.Strip.Length).ConcatString(entry.Append);

artifacts/bench/results/WeCantSpell.Hunspell.Benchmarks.Suites.CheckEnUsSuite-report-github.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ Job=Check en-US Runtime=.NET 9.0
1111
```
1212
| Method | set | words | Mean | Error | StdDev | Min | Median | Ratio |
1313
|-------------- |-------- |------------- |-----------:|---------:|---------:|-----------:|-----------:|------:|
14-
| **&#39;Check words&#39;** | **Correct** | **String[3000]** | **474.7 μs** | **2.48 μs** | **2.32 μs** | **470.3 μs** | **475.0 μs** | **1.00** |
14+
| **&#39;Check words&#39;** | **Correct** | **String[3000]** | **469.2 μs** | **2.43 μs** | **2.15 μs** | **465.2 μs** | **469.3 μs** | **1.00** |
1515
| | | | | | | | | |
16-
| **&#39;Check words&#39;** | **Mix** | **String[7000]** | **5,622.4 μs** | **15.44 μs** | **14.44 μs** | **5,601.9 μs** | **5,623.2 μs** | **1.00** |
16+
| **&#39;Check words&#39;** | **Mix** | **String[7000]** | **5,632.9 μs** | **46.27 μs** | **43.28 μs** | **5,578.2 μs** | **5,631.4 μs** | **1.00** |
1717
| | | | | | | | | |
18-
| **&#39;Check words&#39;** | **Wrong** | **String[4000]** | **5,065.1 μs** | **23.90 μs** | **22.36 μs** | **5,001.1 μs** | **5,063.7 μs** | **1.00** |
18+
| **&#39;Check words&#39;** | **Wrong** | **String[4000]** | **4,953.4 μs** | **25.87 μs** | **24.20 μs** | **4,909.2 μs** | **4,959.7 μs** | **1.00** |
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
Method,Job,AnalyzeLaunchVariance,EvaluateOverhead,MaxAbsoluteError,MaxRelativeError,MinInvokeCount,MinIterationTime,OutlierMode,Affinity,EnvironmentVariables,Jit,LargeAddressAware,Platform,PowerPlanMode,Runtime,AllowVeryLargeObjects,Concurrent,CpuGroups,Force,HeapAffinitizeMask,HeapCount,NoAffinitize,RetainVm,Server,Arguments,BuildConfiguration,Clock,EngineFactory,NuGetReferences,Toolchain,IsMutator,InvocationCount,IterationCount,IterationTime,LaunchCount,MaxIterationCount,MaxWarmupIterationCount,MemoryRandomization,MinIterationCount,MinWarmupIterationCount,RunStrategy,UnrollFactor,WarmupCount,set,words,Mean,Error,StdDev,Min,Median,Ratio
2-
'Check words',Check en-US,False,Default,Default,Default,Default,Default,Default,1111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,Correct,String[3000],474.7 μs,2.48 μs,2.32 μs,470.3 μs,475.0 μs,1.00
3-
'Check words',Check en-US,False,Default,Default,Default,Default,Default,Default,1111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,Mix,String[7000],"5,622.4 μs",15.44 μs,14.44 μs,"5,601.9 μs","5,623.2 μs",1.00
4-
'Check words',Check en-US,False,Default,Default,Default,Default,Default,Default,1111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,Wrong,String[4000],"5,065.1 μs",23.90 μs,22.36 μs,"5,001.1 μs","5,063.7 μs",1.00
2+
'Check words',Check en-US,False,Default,Default,Default,Default,Default,Default,1111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,Correct,String[3000],469.2 μs,2.43 μs,2.15 μs,465.2 μs,469.3 μs,1.00
3+
'Check words',Check en-US,False,Default,Default,Default,Default,Default,Default,1111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,Mix,String[7000],"5,632.9 μs",46.27 μs,43.28 μs,"5,578.2 μs","5,631.4 μs",1.00
4+
'Check words',Check en-US,False,Default,Default,Default,Default,Default,Default,1111111111111111,Empty,RyuJit,Default,X64,8c5e7fda-e8bf-4a96-9a85-a6e23a8c635c,.NET 9.0,False,True,False,True,Default,Default,False,False,False,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,Default,16,Default,Wrong,String[4000],"4,953.4 μs",25.87 μs,24.20 μs,"4,909.2 μs","4,959.7 μs",1.00

artifacts/bench/results/WeCantSpell.Hunspell.Benchmarks.Suites.CheckEnUsSuite-report.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html lang='en'>
33
<head>
44
<meta charset='utf-8' />
5-
<title>WeCantSpell.Hunspell.Benchmarks.Suites.CheckEnUsSuite-20250910-214312</title>
5+
<title>WeCantSpell.Hunspell.Benchmarks.Suites.CheckEnUsSuite-20250911-221726</title>
66

77
<style type="text/css">
88
table { border-collapse: collapse; display: block; width: 100%; overflow: auto; }
@@ -25,9 +25,9 @@
2525
<table>
2626
<thead><tr><th>Method </th><th>set</th><th>words </th><th>Mean</th><th>Error</th><th>StdDev</th><th>Min </th><th>Median</th><th>Ratio</th>
2727
</tr>
28-
</thead><tbody><tr><td>&#39;Check words&#39;</td><td>Correct</td><td>String[3000]</td><td>474.7 &mu;s</td><td>2.48 &mu;s</td><td>2.32 &mu;s</td><td>470.3 &mu;s</td><td>475.0 &mu;s</td><td>1.00</td>
29-
</tr><tr><td>&#39;Check words&#39;</td><td>Mix</td><td>String[7000]</td><td>5,622.4 &mu;s</td><td>15.44 &mu;s</td><td>14.44 &mu;s</td><td>5,601.9 &mu;s</td><td>5,623.2 &mu;s</td><td>1.00</td>
30-
</tr><tr><td>&#39;Check words&#39;</td><td>Wrong</td><td>String[4000]</td><td>5,065.1 &mu;s</td><td>23.90 &mu;s</td><td>22.36 &mu;s</td><td>5,001.1 &mu;s</td><td>5,063.7 &mu;s</td><td>1.00</td>
28+
</thead><tbody><tr><td>&#39;Check words&#39;</td><td>Correct</td><td>String[3000]</td><td>469.2 &mu;s</td><td>2.43 &mu;s</td><td>2.15 &mu;s</td><td>465.2 &mu;s</td><td>469.3 &mu;s</td><td>1.00</td>
29+
</tr><tr><td>&#39;Check words&#39;</td><td>Mix</td><td>String[7000]</td><td>5,632.9 &mu;s</td><td>46.27 &mu;s</td><td>43.28 &mu;s</td><td>5,578.2 &mu;s</td><td>5,631.4 &mu;s</td><td>1.00</td>
30+
</tr><tr><td>&#39;Check words&#39;</td><td>Wrong</td><td>String[4000]</td><td>4,953.4 &mu;s</td><td>25.87 &mu;s</td><td>24.20 &mu;s</td><td>4,909.2 &mu;s</td><td>4,959.7 &mu;s</td><td>1.00</td>
3131
</tr></tbody></table>
3232
</body>
3333
</html>

0 commit comments

Comments
 (0)