123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195 |
- using System;
- using UnityEngine.Profiling;
-
- namespace UnityEngine.InputSystem.Utilities
- {
- internal static class DelegateHelpers
- {
- // InvokeCallbacksSafe protects both against the callback getting removed while being called
- // and against exceptions being thrown by the callback.
-
- public static void InvokeCallbacksSafe(ref CallbackArray<Action> callbacks, string callbackName, object context = null)
- {
- if (callbacks.length == 0)
- return;
- Profiler.BeginSample(callbackName);
- callbacks.LockForChanges();
- for (var i = 0; i < callbacks.length; ++i)
- {
- try
- {
- callbacks[i]();
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- if (context != null)
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'");
- else
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks");
- }
- }
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- }
-
- public static void InvokeCallbacksSafe<TValue>(ref CallbackArray<Action<TValue>> callbacks, TValue argument, string callbackName, object context = null)
- {
- if (callbacks.length == 0)
- return;
- Profiler.BeginSample(callbackName);
- callbacks.LockForChanges();
- for (var i = 0; i < callbacks.length; ++i)
- {
- try
- {
- callbacks[i](argument);
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- if (context != null)
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'");
- else
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks");
- }
- }
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- }
-
- public static void InvokeCallbacksSafe<TValue1, TValue2>(ref CallbackArray<Action<TValue1, TValue2>> callbacks, TValue1 argument1, TValue2 argument2, string callbackName, object context = null)
- {
- if (callbacks.length == 0)
- return;
- Profiler.BeginSample(callbackName);
- callbacks.LockForChanges();
- for (var i = 0; i < callbacks.length; ++i)
- {
- try
- {
- callbacks[i](argument1, argument2);
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- if (context != null)
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'");
- else
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks");
- }
- }
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- }
-
- public static bool InvokeCallbacksSafe_AnyCallbackReturnsTrue<TValue1, TValue2>(ref CallbackArray<Func<TValue1, TValue2, bool>> callbacks,
- TValue1 argument1, TValue2 argument2, string callbackName, object context = null)
- {
- if (callbacks.length == 0)
- return true;
- Profiler.BeginSample(callbackName);
- callbacks.LockForChanges();
- for (var i = 0; i < callbacks.length; ++i)
- {
- try
- {
- if (callbacks[i](argument1, argument2))
- {
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- return true;
- }
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- if (context != null)
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'");
- else
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks");
- }
- }
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- return false;
- }
-
- /// <summary>
- /// Invokes the given callbacks and also invokes any callback returned from the result of the first.
- /// </summary>
- /// <seealso cref="System.Action"/>
- /// <remarks>
- /// Allows an chaining up an additional, optional block of code to the original callback
- /// and allow the external code make the decision about whether this code should be executed.
- /// </remarks>
- public static void InvokeCallbacksSafe_AndInvokeReturnedActions<TValue>(
- ref CallbackArray<Func<TValue, Action>> callbacks, TValue argument,
- string callbackName, object context = null)
- {
- if (callbacks.length == 0)
- return;
-
- Profiler.BeginSample(callbackName);
- callbacks.LockForChanges();
- for (var i = 0; i < callbacks.length; ++i)
- {
- try
- {
- callbacks[i](argument)?.Invoke();
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- if (context != null)
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'");
- else
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks");
- }
- }
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- }
-
- /// <summary>
- /// Invokes the given callbacks and returns true if any of them returned a non-null result.
- /// </summary>
- /// <remarks>
- /// Returns false if every callback invocation returned null.
- /// </remarks>
- public static bool InvokeCallbacksSafe_AnyCallbackReturnsObject<TValue, TReturn>(
- ref CallbackArray<Func<TValue, TReturn>> callbacks, TValue argument,
- string callbackName, object context = null)
- {
- if (callbacks.length == 0)
- return false;
-
- Profiler.BeginSample(callbackName);
- callbacks.LockForChanges();
- for (var i = 0; i < callbacks.length; ++i)
- {
- try
- {
- var ret = callbacks[i](argument);
- if (ret != null)
- {
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- return true;
- }
- }
- catch (Exception exception)
- {
- Debug.LogException(exception);
- if (context != null)
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks of '{context}'");
- else
- Debug.LogError($"{exception.GetType().Name} while executing '{callbackName}' callbacks");
- }
- }
- callbacks.UnlockForChanges();
- Profiler.EndSample();
- return false;
- }
- }
- }
|