OrderedSet.cs 1.1 KB

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