ReactiveObject.cs
1 using System; 2 using System.Threading; 3 4 namespace Ryujinx.Common 5 { 6 public class ReactiveObject<T> 7 { 8 private readonly ReaderWriterLockSlim _readerWriterLock = new(); 9 private bool _isInitialized; 10 private T _value; 11 12 public event EventHandler<ReactiveEventArgs<T>> Event; 13 14 public T Value 15 { 16 get 17 { 18 _readerWriterLock.EnterReadLock(); 19 T value = _value; 20 _readerWriterLock.ExitReadLock(); 21 22 return value; 23 } 24 set 25 { 26 _readerWriterLock.EnterWriteLock(); 27 28 T oldValue = _value; 29 30 bool oldIsInitialized = _isInitialized; 31 32 _isInitialized = true; 33 _value = value; 34 35 _readerWriterLock.ExitWriteLock(); 36 37 if (!oldIsInitialized || oldValue == null || !oldValue.Equals(_value)) 38 { 39 Event?.Invoke(this, new ReactiveEventArgs<T>(oldValue, value)); 40 } 41 } 42 } 43 44 public static implicit operator T(ReactiveObject<T> obj) 45 { 46 return obj.Value; 47 } 48 } 49 50 public class ReactiveEventArgs<T> 51 { 52 public T OldValue { get; } 53 public T NewValue { get; } 54 55 public ReactiveEventArgs(T oldValue, T newValue) 56 { 57 OldValue = oldValue; 58 NewValue = newValue; 59 } 60 } 61 }