A game about forced loneliness, made by TACStudios
1using System; 2 3namespace UnityEngine.InputSystem.Utilities 4{ 5 /// <summary> 6 /// Provides type erasure and an abstraction of a saved state that 7 /// will (must) be restored at a later point. 8 /// </summary> 9 internal interface ISavedState 10 { 11 /// <summary> 12 /// Dispose current state, should be invoked before RestoreSavedState() 13 /// to dispose the current state before restoring a saved state. 14 /// </summary> 15 void StaticDisposeCurrentState(); 16 17 /// <summary> 18 /// Restore previous state, should be invoked after StaticDisposeCurrentState(). 19 /// </summary> 20 void RestoreSavedState(); 21 } 22 23 /// <summary> 24 /// Provides functionality to store and support later restoration of a saved 25 /// state. The state is expected to be a value-type. If the state is not restored 26 /// it must be disposed to not leak resources. 27 /// </summary> 28 /// <typeparam name="T">The value-type representing the state to be stored.</typeparam> 29 internal sealed class SavedStructState<T> : ISavedState where T : struct 30 { 31 public delegate void TypedRestore(ref T state); 32 33 /// <summary> 34 /// Constructs a SavedStructState. 35 /// </summary> 36 /// <param name="state">The value-type state to be saved.</param> 37 /// <param name="restoreAction">The action to be carried out to restore state.</param> 38 /// <param name="staticDisposeCurrentState">The action to be carried out to dispose current state. May be null.</param> 39 internal SavedStructState(ref T state, TypedRestore restoreAction, Action staticDisposeCurrentState = null) 40 { 41 Debug.Assert(restoreAction != null, "Restore action is required"); 42 43 m_State = state; // copy 44 m_RestoreAction = restoreAction; 45 m_StaticDisposeCurrentState = staticDisposeCurrentState; 46 } 47 48 public void StaticDisposeCurrentState() 49 { 50 if (m_StaticDisposeCurrentState != null) 51 { 52 m_StaticDisposeCurrentState(); 53 m_StaticDisposeCurrentState = null; 54 } 55 } 56 57 public void RestoreSavedState() 58 { 59 Debug.Assert(m_StaticDisposeCurrentState == null, 60 $"Should have been disposed via {nameof(StaticDisposeCurrentState)} before invoking {nameof(RestoreSavedState)}"); 61 Debug.Assert(m_RestoreAction != null, $"Only invoke {nameof(RestoreSavedState)} once "); 62 m_RestoreAction(ref m_State); 63 m_RestoreAction = null; 64 } 65 66 private T m_State; 67 private TypedRestore m_RestoreAction; 68 private Action m_StaticDisposeCurrentState; 69 } 70}