FastComparer.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. // Animancer // https://kybernetik.com.au/animancer // Copyright 2022 Kybernetik //
  2. using System.Collections.Generic;
  3. namespace Animancer
  4. {
  5. /// <summary>
  6. /// An <see cref="IEqualityComparer{T}"/> which ignores overloaded equality operators so it is faster than
  7. /// <see cref="EqualityComparer{T}.Default"/> for types derived from <see cref="UnityEngine.Object"/>.
  8. /// </summary>
  9. /// <remarks>
  10. /// This class is used in <see cref="AnimancerPlayable.StateDictionary.EqualityComparer"/> by default.
  11. /// <para></para>
  12. /// Documentation: <see href="https://kybernetik.com.au/animancer/docs/manual/playing/states#performance">Performance</see>
  13. /// </remarks>
  14. /// https://kybernetik.com.au/animancer/api/Animancer/FastComparer
  15. ///
  16. public sealed class FastComparer : IEqualityComparer<object>
  17. {
  18. /************************************************************************************************************************/
  19. /// <summary>Singleton instance.</summary>
  20. public static readonly FastComparer Instance = new FastComparer();
  21. /// <summary>Calls <see cref="object.Equals(object, object)"/>.</summary>
  22. bool IEqualityComparer<object>.Equals(object x, object y) => Equals(x, y);
  23. /// <summary>Calls <see cref="object.GetHashCode"/>.</summary>
  24. int IEqualityComparer<object>.GetHashCode(object obj) => obj.GetHashCode();
  25. /************************************************************************************************************************/
  26. }
  27. /// <summary>
  28. /// An <see cref="IEqualityComparer{T}"/> which uses <see cref="object.ReferenceEquals"/> to be even faster than
  29. /// <see cref="FastComparer"/>. Unfortunately this means it will not work for boxed value types (such as enums).
  30. /// </summary>
  31. /// <remarks>
  32. /// This class can be used in <see cref="AnimancerPlayable.StateDictionary.EqualityComparer"/>.
  33. /// <para></para>
  34. /// Documentation: <see href="https://kybernetik.com.au/animancer/docs/manual/playing/states#performance">Performance</see>
  35. /// </remarks>
  36. /// https://kybernetik.com.au/animancer/api/Animancer/FastReferenceComparer
  37. ///
  38. public sealed class FastReferenceComparer : IEqualityComparer<object>
  39. {
  40. /************************************************************************************************************************/
  41. /// <summary>Singleton instance.</summary>
  42. public static readonly FastReferenceComparer Instance = new FastReferenceComparer();
  43. /// <summary>Calls <see cref="object.ReferenceEquals"/>.</summary>
  44. bool IEqualityComparer<object>.Equals(object x, object y) => ReferenceEquals(x, y);
  45. /// <summary>Calls <see cref="object.GetHashCode"/>.</summary>
  46. int IEqualityComparer<object>.GetHashCode(object obj) => obj.GetHashCode();
  47. /************************************************************************************************************************/
  48. }
  49. }