ExpressionTrackedValues.cs 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using Avalonia.Rendering.Composition.Server;
  4. // Special license applies <see href="https://raw.githubusercontent.com/AvaloniaUI/Avalonia/master/src/Avalonia.Base/Rendering/Composition/License.md">License.md</see>
  5. namespace Avalonia.Rendering.Composition.Expressions;
  6. internal class ExpressionTrackedObjects : IEnumerable<IExpressionObject>
  7. {
  8. private List<IExpressionObject> _list = new();
  9. private HashSet<IExpressionObject> _hashSet = new();
  10. public void Add(IExpressionObject obj, string member)
  11. {
  12. if (_hashSet.Add(obj))
  13. _list.Add(obj);
  14. }
  15. public void Clear()
  16. {
  17. _list.Clear();
  18. _hashSet.Clear();
  19. }
  20. IEnumerator<IExpressionObject> IEnumerable<IExpressionObject>.GetEnumerator()
  21. {
  22. return _list.GetEnumerator();
  23. }
  24. IEnumerator IEnumerable.GetEnumerator()
  25. {
  26. return ((IEnumerable)_list).GetEnumerator();
  27. }
  28. public List<IExpressionObject>.Enumerator GetEnumerator() => _list.GetEnumerator();
  29. public struct Pool
  30. {
  31. private Stack<ExpressionTrackedObjects> _stack = new();
  32. public Pool()
  33. {
  34. }
  35. public ExpressionTrackedObjects Get()
  36. {
  37. if (_stack.Count > 0)
  38. return _stack.Pop();
  39. return new ExpressionTrackedObjects();
  40. }
  41. public void Return(ExpressionTrackedObjects obj)
  42. {
  43. _stack.Clear();
  44. _stack.Push(obj);
  45. }
  46. }
  47. }