ReactiveObject.cs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. using System;
  2. using System.Threading;
  3. namespace Ryujinx.Common
  4. {
  5. public class ReactiveObject<T>
  6. {
  7. private ReaderWriterLock _readerWriterLock = new ReaderWriterLock();
  8. private T _value;
  9. public event EventHandler<ReactiveEventArgs<T>> Event;
  10. public T Value
  11. {
  12. get
  13. {
  14. _readerWriterLock.AcquireReaderLock(Timeout.Infinite);
  15. T value = _value;
  16. _readerWriterLock.ReleaseReaderLock();
  17. return value;
  18. }
  19. set
  20. {
  21. _readerWriterLock.AcquireWriterLock(Timeout.Infinite);
  22. T oldValue = _value;
  23. _value = value;
  24. _readerWriterLock.ReleaseWriterLock();
  25. if (oldValue == null || !oldValue.Equals(_value))
  26. {
  27. Event?.Invoke(this, new ReactiveEventArgs<T>(oldValue, value));
  28. }
  29. }
  30. }
  31. public static implicit operator T(ReactiveObject<T> obj)
  32. {
  33. return obj.Value;
  34. }
  35. }
  36. public class ReactiveEventArgs<T>
  37. {
  38. public T OldValue { get; }
  39. public T NewValue { get; }
  40. public ReactiveEventArgs(T oldValue, T newValue)
  41. {
  42. OldValue = oldValue;
  43. NewValue = newValue;
  44. }
  45. }
  46. }