| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 | // Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //using System;using System.Runtime.CompilerServices;using UnityEngine;namespace Animancer.TransitionLibraries{    /// <summary>[<see cref="SerializableAttribute"/>] A <see cref="StringAsset"/> and <see cref="int"/> pair.</summary>    /// <remarks>    /// <strong>Documentation:</strong>    /// <see href="https://kybernetik.com.au/animancer/docs/manual/transitions/libraries">    /// Transition Libraries</see>    /// </remarks>    /// https://kybernetik.com.au/animancer/api/Animancer.TransitionLibraries/NamedIndex    [Serializable]    public struct NamedIndex :        IComparable<NamedIndex>,        IEquatable<NamedIndex>    {        /************************************************************************************************************************/        [SerializeField]        private StringAsset _Name;        /// <summary>The name.</summary>        public readonly StringAsset Name            => _Name;        /************************************************************************************************************************/        [SerializeField]        private int _Index;        /// <summary>The index.</summary>        public readonly int Index            => _Index;        /************************************************************************************************************************/        /// <summary>Creates a new <see cref="NamedIndex"/>.</summary>        public NamedIndex(StringAsset name, int index)        {            _Name = name;            _Index = index;        }        /************************************************************************************************************************/        /// <summary>Creates a new <see cref="NamedIndex"/>.</summary>        public readonly NamedIndex With(StringAsset name)            => new(name, _Index);        /// <summary>Creates a new <see cref="NamedIndex"/>.</summary>        public readonly NamedIndex With(int index)            => new(_Name, index);        /************************************************************************************************************************/        /// <summary>Describes this value.</summary>        public override readonly string ToString()            => $"[{_Index}]{_Name}";        /************************************************************************************************************************/        #region Equality        /************************************************************************************************************************/        /// <summary>Compares the <see cref="Index"/> then <see cref="Name"/>.</summary>        [MethodImpl(MethodImplOptions.AggressiveInlining)]        public readonly int CompareTo(NamedIndex other)        {            var result = _Index.CompareTo(other._Index);            if (result != 0)                return result;            else                return StringAsset.Compare(_Name, other._Name);        }        /************************************************************************************************************************/        /// <summary>Are all fields in this object equal to the equivalent in `obj`?</summary>        [MethodImpl(MethodImplOptions.AggressiveInlining)]        public override readonly bool Equals(object obj)            => obj is NamedIndex value            && Equals(value);        /// <summary>Are all fields in this object equal to the equivalent fields in `other`?</summary>        [MethodImpl(MethodImplOptions.AggressiveInlining)]        public readonly bool Equals(NamedIndex other)            => _Index == other._Index            && _Name == other._Name;        /// <summary>Are all fields in `a` equal to the equivalent fields in `b`?</summary>        [MethodImpl(MethodImplOptions.AggressiveInlining)]        public static bool operator ==(NamedIndex a, NamedIndex b)            => a.Equals(b);        /// <summary>Are any fields in `a` not equal to the equivalent fields in `b`?</summary>        [MethodImpl(MethodImplOptions.AggressiveInlining)]        public static bool operator !=(NamedIndex a, NamedIndex b)            => !(a == b);        /************************************************************************************************************************/        /// <summary>Returns a hash code based on the values of this object's fields.</summary>        [MethodImpl(MethodImplOptions.AggressiveInlining)]        public override readonly int GetHashCode()            => AnimancerUtilities.Hash(-871379578,                _Index.SafeGetHashCode(),                _Name.SafeGetHashCode());        /************************************************************************************************************************/        #endregion        /************************************************************************************************************************/    }}
 |