| namespace UnityEngine.InputSystem.Utilities |
| { |
| |
| |
| internal struct CallbackArray<TDelegate> |
| where TDelegate : System.Delegate |
| { |
| private bool m_CannotMutateCallbacksArray; |
| private InlinedArray<TDelegate> m_Callbacks; |
| private InlinedArray<TDelegate> m_CallbacksToAdd; |
| private InlinedArray<TDelegate> m_CallbacksToRemove; |
|
|
| public int length => m_Callbacks.length; |
|
|
| public TDelegate this[int index] => m_Callbacks[index]; |
|
|
| public void Clear() |
| { |
| m_Callbacks.Clear(); |
| m_CallbacksToAdd.Clear(); |
| m_CallbacksToRemove.Clear(); |
| } |
|
|
| public void AddCallback(TDelegate dlg) |
| { |
| if (m_CannotMutateCallbacksArray) |
| { |
| if (m_CallbacksToAdd.Contains(dlg)) |
| return; |
| var removeIndex = m_CallbacksToRemove.IndexOf(dlg); |
| if (removeIndex != -1) |
| m_CallbacksToRemove.RemoveAtByMovingTailWithCapacity(removeIndex); |
| m_CallbacksToAdd.AppendWithCapacity(dlg); |
| return; |
| } |
|
|
| if (!m_Callbacks.Contains(dlg)) |
| m_Callbacks.AppendWithCapacity(dlg, capacityIncrement: 4); |
| } |
|
|
| public void RemoveCallback(TDelegate dlg) |
| { |
| if (m_CannotMutateCallbacksArray) |
| { |
| if (m_CallbacksToRemove.Contains(dlg)) |
| return; |
| var addIndex = m_CallbacksToAdd.IndexOf(dlg); |
| if (addIndex != -1) |
| m_CallbacksToAdd.RemoveAtByMovingTailWithCapacity(addIndex); |
| m_CallbacksToRemove.AppendWithCapacity(dlg); |
| return; |
| } |
|
|
| var index = m_Callbacks.IndexOf(dlg); |
| if (index >= 0) |
| m_Callbacks.RemoveAtWithCapacity(index); |
| } |
|
|
| public void LockForChanges() |
| { |
| m_CannotMutateCallbacksArray = true; |
| } |
|
|
| public void UnlockForChanges() |
| { |
| m_CannotMutateCallbacksArray = false; |
|
|
| |
| for (var i = 0; i < m_CallbacksToRemove.length; ++i) |
| RemoveCallback(m_CallbacksToRemove[i]); |
| for (var i = 0; i < m_CallbacksToAdd.length; ++i) |
| AddCallback(m_CallbacksToAdd[i]); |
|
|
| m_CallbacksToAdd.Clear(); |
| m_CallbacksToRemove.Clear(); |
| } |
| } |
| } |
|
|