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}