SearchValues.cs 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. #if !NET8_0_OR_GREATER
  2. using System.Runtime.CompilerServices;
  3. namespace System.Buffers;
  4. internal static class SearchValues
  5. {
  6. internal static SearchValues<char> Create(string input) => new(input.AsSpan());
  7. internal static SearchValues<char> Create(ReadOnlySpan<char> input) => new(input);
  8. }
  9. internal sealed class SearchValues<T>
  10. {
  11. private readonly bool[] _data;
  12. private readonly char _min;
  13. private readonly char _max;
  14. internal SearchValues(ReadOnlySpan<char> input)
  15. {
  16. _min = char.MaxValue;
  17. _max = char.MinValue;
  18. foreach (var c in input)
  19. {
  20. _min = (char) Math.Min(_min, c);
  21. _max = (char) Math.Max(_max, c);
  22. }
  23. _data = new bool[_max - _min + 1];
  24. foreach (var c in input)
  25. {
  26. _data[c - _min] = true;
  27. }
  28. }
  29. [MethodImpl(MethodImplOptions.AggressiveInlining)]
  30. public bool Contains(char c)
  31. {
  32. var i = (uint) (c - _min);
  33. var temp = _data;
  34. return i < temp.Length && temp[i];
  35. }
  36. }
  37. #endif