Skip to content

Commit 252986c

Browse files
committed
Drop CommandBytes (#3019)
* WIP * this might work * optimize enum parser # Conflicts: # toys/StackExchange.Redis.Server/RedisServer.cs
1 parent 1cfa073 commit 252986c

13 files changed

Lines changed: 174 additions & 351 deletions

File tree

eng/StackExchange.Redis.Build/AsciiHashGenerator.cs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -484,13 +484,30 @@ private void BuildEnumParsers(
484484
alwaysCaseSensitive = true;
485485
}
486486

487+
bool twoPart = method.Members.Max(x => x.ParseText.Length) > AsciiHash.MaxBytesHashed;
487488
if (alwaysCaseSensitive)
488489
{
489-
NewLine().Append("var hashCS = global::RESPite.AsciiHash.HashCS(").Append(method.From.Name).Append(");");
490+
if (twoPart)
491+
{
492+
NewLine().Append("global::RESPite.AsciiHash.HashCS(").Append(method.From.Name).Append(", out var cs0, out var cs1);");
493+
}
494+
else
495+
{
496+
NewLine().Append("var cs0 = global::RESPite.AsciiHash.HashCS(").Append(method.From.Name).Append(");");
497+
}
490498
}
491499
else
492500
{
493-
NewLine().Append("global::RESPite.AsciiHash.Hash(").Append(method.From.Name).Append(", out var hashCS, out var hashUC);");
501+
if (twoPart)
502+
{
503+
NewLine().Append("global::RESPite.AsciiHash.Hash(").Append(method.From.Name)
504+
.Append(", out var cs0, out var uc0, out var cs1, out var uc1);");
505+
}
506+
else
507+
{
508+
NewLine().Append("global::RESPite.AsciiHash.Hash(").Append(method.From.Name)
509+
.Append(", out var cs0, out var uc0);");
510+
}
494511
}
495512

496513
if (string.IsNullOrEmpty(method.CaseSensitive.Name))
@@ -544,31 +561,45 @@ void Write(bool caseSensitive)
544561
.ThenBy(x => x.ParseText))
545562
{
546563
var len = member.ParseText.Length;
547-
AsciiHash.Hash(member.ParseText, out var hashCS, out var hashUC);
564+
AsciiHash.Hash(member.ParseText, out var cs0, out var uc0, out var cs1, out var uc1);
548565

549566
bool valueCaseSensitive = caseSensitive || !HasCaseSensitiveCharacters(member.ParseText);
550567

551-
line = NewLine().Append(len);
568+
line = NewLine().Append(len).Append(" when ");
569+
if (twoPart) line.Append("(");
552570
if (valueCaseSensitive)
553571
{
554-
line.Append(" when hashCS is ").Append(hashCS);
572+
line.Append("cs0 is ").Append(cs0);
555573
}
556574
else
557575
{
558-
line.Append(" when hashUC is ").Append(hashUC);
576+
line.Append("uc0 is ").Append(uc0);
559577
}
578+
560579
if (len > AsciiHash.MaxBytesHashed)
580+
{
581+
if (valueCaseSensitive)
582+
{
583+
line.Append(" & cs1 is ").Append(cs1);
584+
}
585+
else
586+
{
587+
line.Append(" & uc1 is ").Append(uc1);
588+
}
589+
}
590+
if (twoPart) line.Append(")");
591+
if (len > 2 * AsciiHash.MaxBytesHashed)
561592
{
562593
line.Append(" && ");
563594
var csValue = SyntaxFactory
564595
.LiteralExpression(
565596
SyntaxKind.StringLiteralExpression,
566-
SyntaxFactory.Literal(member.ParseText))
597+
SyntaxFactory.Literal(member.ParseText.Substring(2 * AsciiHash.MaxBytesHashed)))
567598
.ToFullString();
568599

569600
line.Append("global::RESPite.AsciiHash.")
570601
.Append(valueCaseSensitive ? nameof(AsciiHash.SequenceEqualsCS) : nameof(AsciiHash.SequenceEqualsCI))
571-
.Append("(").Append(method.From.Name).Append(", ").Append(csValue);
602+
.Append("(").Append(method.From.Name).Append(".Slice(").Append(2 * AsciiHash.MaxBytesHashed).Append("), ").Append(csValue);
572603
if (method.From.IsBytes) line.Append("u8");
573604
line.Append(")");
574605
}

src/RESPite/PublicAPI/PublicAPI.Unshipped.txt

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
[SER004]RESPite.AsciiHash.AsciiHash() -> void
99
[SER004]RESPite.AsciiHash.AsciiHash(byte[]! arr) -> void
1010
[SER004]RESPite.AsciiHash.AsciiHash(byte[]! arr, int index, int length) -> void
11-
[SER004]RESPite.AsciiHash.AsciiHash(string! value) -> void
1211
[SER004]RESPite.AsciiHash.AsciiHash(System.ReadOnlySpan<byte> value) -> void
1312
[SER004]RESPite.AsciiHash.BufferLength.get -> int
1413
[SER004]RESPite.AsciiHash.Equals(in RESPite.AsciiHash other) -> bool
@@ -21,6 +20,8 @@
2120
[SER004]RESPite.AsciiHashAttribute.CaseSensitive.get -> bool
2221
[SER004]RESPite.AsciiHashAttribute.CaseSensitive.set -> void
2322
[SER004]RESPite.AsciiHashAttribute.Token.get -> string!
23+
[SER004]RESPite.AsciiHash.AsciiHash(string? value) -> void
24+
[SER004]RESPite.AsciiHash.IsEmpty.get -> bool
2425
[SER004]RESPite.Buffers.CycleBuffer
2526
[SER004]RESPite.Buffers.CycleBuffer.Commit(int count) -> void
2627
[SER004]RESPite.Buffers.CycleBuffer.CommittedIsEmpty.get -> bool
@@ -58,11 +59,17 @@
5859
[SER004]static RESPite.AsciiHash.EqualsCS(System.ReadOnlySpan<byte> first, System.ReadOnlySpan<byte> second) -> bool
5960
[SER004]static RESPite.AsciiHash.EqualsCS(System.ReadOnlySpan<char> first, System.ReadOnlySpan<char> second) -> bool
6061
[SER004]static RESPite.AsciiHash.Hash(scoped System.ReadOnlySpan<byte> value, out long cs, out long uc) -> void
62+
[SER004]static RESPite.AsciiHash.Hash(scoped System.ReadOnlySpan<byte> value, out long cs0, out long uc0, out long cs1, out long uc1) -> void
6163
[SER004]static RESPite.AsciiHash.Hash(scoped System.ReadOnlySpan<char> value, out long cs, out long uc) -> void
64+
[SER004]static RESPite.AsciiHash.Hash(scoped System.ReadOnlySpan<char> value, out long cs0, out long uc0, out long cs1, out long uc1) -> void
6265
[SER004]static RESPite.AsciiHash.HashCS(scoped System.ReadOnlySpan<byte> value) -> long
66+
[SER004]static RESPite.AsciiHash.HashCS(scoped System.ReadOnlySpan<byte> value, out long cs0, out long cs1) -> void
6367
[SER004]static RESPite.AsciiHash.HashCS(scoped System.ReadOnlySpan<char> value) -> long
68+
[SER004]static RESPite.AsciiHash.HashCS(scoped System.ReadOnlySpan<char> value, out long cs0, out long cs1) -> void
6469
[SER004]static RESPite.AsciiHash.HashUC(scoped System.ReadOnlySpan<byte> value) -> long
70+
[SER004]static RESPite.AsciiHash.HashUC(scoped System.ReadOnlySpan<byte> value, out long cs0, out long cs1) -> void
6571
[SER004]static RESPite.AsciiHash.HashUC(scoped System.ReadOnlySpan<char> value) -> long
72+
[SER004]static RESPite.AsciiHash.HashUC(scoped System.ReadOnlySpan<char> value, out long cs0, out long cs1) -> void
6673
[SER004]static RESPite.AsciiHash.SequenceEqualsCI(System.ReadOnlySpan<byte> first, System.ReadOnlySpan<byte> second) -> bool
6774
[SER004]static RESPite.AsciiHash.SequenceEqualsCI(System.ReadOnlySpan<char> first, System.ReadOnlySpan<char> second) -> bool
6875
[SER004]static RESPite.AsciiHash.SequenceEqualsCS(System.ReadOnlySpan<byte> first, System.ReadOnlySpan<byte> second) -> bool

src/RESPite/Shared/AsciiHash.Instance.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,10 @@ namespace RESPite;
2020
public int BufferLength => (Length + 1 + 7) & ~7; // an extra byte, then round up to word-size
2121

2222
public ReadOnlySpan<byte> Span => new(_arr ?? [], _index, _length);
23+
public bool IsEmpty => Length != 0;
2324

2425
public AsciiHash(ReadOnlySpan<byte> value) : this(value.ToArray(), 0, value.Length) { }
25-
public AsciiHash(string value) : this(Encoding.ASCII.GetBytes(value)) { }
26+
public AsciiHash(string? value) : this(value is null ? [] : Encoding.ASCII.GetBytes(value)) { }
2627

2728
/// <inheritdoc/>
2829
public override int GetHashCode() => _hashCS.GetHashCode();

src/RESPite/Shared/AsciiHash.cs

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
using System.Buffers;
2-
using System.Buffers.Binary;
1+
using System.Buffers.Binary;
32
using System.Diagnostics;
43
using System.Diagnostics.CodeAnalysis;
54
using System.Runtime.CompilerServices;
@@ -241,4 +240,54 @@ public static long HashCS(scoped ReadOnlySpan<char> value)
241240
}
242241
return (long)tally;
243242
}
243+
244+
public static void HashCS(scoped ReadOnlySpan<byte> value, out long cs0, out long cs1)
245+
{
246+
cs0 = HashCS(value);
247+
cs1 = value.Length > MaxBytesHashed ? HashCS(value.Slice(start: MaxBytesHashed)) : 0;
248+
}
249+
250+
public static void HashCS(scoped ReadOnlySpan<char> value, out long cs0, out long cs1)
251+
{
252+
cs0 = HashCS(value);
253+
cs1 = value.Length > MaxBytesHashed ? HashCS(value.Slice(start: MaxBytesHashed)) : 0;
254+
}
255+
256+
public static void HashUC(scoped ReadOnlySpan<byte> value, out long cs0, out long cs1)
257+
{
258+
cs0 = HashUC(value);
259+
cs1 = value.Length > MaxBytesHashed ? HashUC(value.Slice(start: MaxBytesHashed)) : 0;
260+
}
261+
262+
public static void HashUC(scoped ReadOnlySpan<char> value, out long cs0, out long cs1)
263+
{
264+
cs0 = HashUC(value);
265+
cs1 = value.Length > MaxBytesHashed ? HashUC(value.Slice(start: MaxBytesHashed)) : 0;
266+
}
267+
268+
public static void Hash(scoped ReadOnlySpan<byte> value, out long cs0, out long uc0, out long cs1, out long uc1)
269+
{
270+
Hash(value, out cs0, out uc0);
271+
if (value.Length > MaxBytesHashed)
272+
{
273+
Hash(value.Slice(start: MaxBytesHashed), out cs1, out uc1);
274+
}
275+
else
276+
{
277+
cs1 = uc1 = 0;
278+
}
279+
}
280+
281+
public static void Hash(scoped ReadOnlySpan<char> value, out long cs0, out long uc0, out long cs1, out long uc1)
282+
{
283+
Hash(value, out cs0, out uc0);
284+
if (value.Length > MaxBytesHashed)
285+
{
286+
Hash(value.Slice(start: MaxBytesHashed), out cs1, out uc1);
287+
}
288+
else
289+
{
290+
cs1 = uc1 = 0;
291+
}
292+
}
244293
}

0 commit comments

Comments
 (0)