OrderedSet.cs 1.2 KB

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