AsciiString.cs 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. namespace PlatformBenchmarks
  5. {
  6. public readonly struct AsciiString : IEquatable<AsciiString>
  7. {
  8. private readonly byte[] _data;
  9. public AsciiString(string s) => _data = Encoding.ASCII.GetBytes(s);
  10. private AsciiString(byte[] b) => _data = b;
  11. public int Length => _data.Length;
  12. public byte[] Data => _data;
  13. public ReadOnlySpan<byte> AsSpan() => _data;
  14. public static implicit operator ReadOnlySpan<byte>(AsciiString str) => str._data;
  15. public static implicit operator byte[](AsciiString str) => str._data;
  16. public static implicit operator AsciiString(string str) => new AsciiString(str);
  17. public override string ToString() => Encoding.ASCII.GetString(_data);
  18. public static explicit operator string(AsciiString str) => str.ToString();
  19. public bool Equals(AsciiString other) => ReferenceEquals(_data, other._data) || SequenceEqual(_data, other._data);
  20. private bool SequenceEqual(byte[] data1, byte[] data2) => new Span<byte>(data1).SequenceEqual(data2);
  21. public static bool operator ==(AsciiString a, AsciiString b) => a.Equals(b);
  22. public static bool operator !=(AsciiString a, AsciiString b) => !a.Equals(b);
  23. public override bool Equals(object other) => (other is AsciiString) && Equals((AsciiString)other);
  24. public static AsciiString operator +(AsciiString a, AsciiString b)
  25. {
  26. var result = new byte[a.Length + b.Length];
  27. a._data.CopyTo(result, 0);
  28. b._data.CopyTo(result, a.Length);
  29. return new AsciiString(result);
  30. }
  31. public override int GetHashCode()
  32. {
  33. // Copied from x64 version of string.GetLegacyNonRandomizedHashCode()
  34. // https://github.com/dotnet/coreclr/blob/master/src/mscorlib/src/System/String.Comparison.cs
  35. var data = _data;
  36. int hash1 = 5381;
  37. int hash2 = hash1;
  38. foreach (int b in data)
  39. {
  40. hash1 = ((hash1 << 5) + hash1) ^ b;
  41. }
  42. return hash1 + (hash2 * 1566083941);
  43. }
  44. }
  45. }