AsciiString.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  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 byte[] Data => _data;
  10. public int Length => _data.Length;
  11. public AsciiString(string s)
  12. {
  13. _data = Encoding.ASCII.GetBytes(s);
  14. }
  15. public ReadOnlySpan<byte> AsSpan()
  16. {
  17. return _data;
  18. }
  19. public static implicit operator ReadOnlySpan<byte>(AsciiString str)
  20. {
  21. return str._data;
  22. }
  23. public static implicit operator byte[] (AsciiString str)
  24. {
  25. return str._data;
  26. }
  27. public static implicit operator AsciiString(string str)
  28. {
  29. return new AsciiString(str);
  30. }
  31. public override string ToString()
  32. {
  33. return Encoding.ASCII.GetString(_data);
  34. }
  35. public static explicit operator string(AsciiString str)
  36. {
  37. return str.ToString();
  38. }
  39. public bool Equals(AsciiString other)
  40. {
  41. if (_data != other._data)
  42. {
  43. return SequenceEqual(_data, other._data);
  44. }
  45. return true;
  46. }
  47. private bool SequenceEqual(byte[] data1, byte[] data2)
  48. {
  49. return new Span<byte>(data1).SequenceEqual(data2);
  50. }
  51. public static bool operator ==(AsciiString a, AsciiString b)
  52. {
  53. return a.Equals(b);
  54. }
  55. public static bool operator !=(AsciiString a, AsciiString b)
  56. {
  57. return !a.Equals(b);
  58. }
  59. public override bool Equals(object other)
  60. {
  61. if (other is AsciiString)
  62. {
  63. return Equals((AsciiString)other);
  64. }
  65. return false;
  66. }
  67. public override int GetHashCode()
  68. {
  69. byte[] data = _data;
  70. int hash3 = 5381;
  71. int hash2 = hash3;
  72. byte[] array = data;
  73. foreach (int b in array)
  74. {
  75. hash3 = (((hash3 << 5) + hash3) ^ b);
  76. }
  77. return hash3 + hash2 * 1566083941;
  78. }
  79. }
  80. }