OrderedSet.cs 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System.Collections;
  2. namespace Jint.Runtime;
  3. internal sealed class OrderedSet<T> : IEnumerable<T>
  4. {
  5. internal List<T> _list;
  6. internal HashSet<T> _set;
  7. public OrderedSet(HashSet<T> values)
  8. {
  9. _list = new List<T>(values);
  10. _set = new HashSet<T>(values);
  11. }
  12. public OrderedSet(IEqualityComparer<T> comparer)
  13. {
  14. _list = [];
  15. _set = new HashSet<T>(comparer);
  16. }
  17. public T this[int index]
  18. {
  19. get => _list[index];
  20. set
  21. {
  22. if (_set.Add(value))
  23. {
  24. _list[index] = value;
  25. }
  26. }
  27. }
  28. public OrderedSet<T> Clone()
  29. {
  30. return new OrderedSet<T>(EqualityComparer<T>.Default)
  31. {
  32. _set = new HashSet<T>(this._set, this._set.Comparer),
  33. _list = [.. this._list]
  34. };
  35. }
  36. public void Add(T item)
  37. {
  38. if (_set.Add(item))
  39. {
  40. _list.Add(item);
  41. }
  42. }
  43. public void Clear()
  44. {
  45. _list.Clear();
  46. _set.Clear();
  47. }
  48. public bool Contains(T item) => _set.Contains(item);
  49. public int Count => _list.Count;
  50. public bool Remove(T item)
  51. {
  52. _set.Remove(item);
  53. return _list.Remove(item);
  54. }
  55. public IEnumerator<T> GetEnumerator() => _list.GetEnumerator();
  56. IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
  57. }