using System; using System.Runtime.CompilerServices; using DCFApixels.DragonECS.Reflection; namespace DCFApixels.DragonECS { public readonly struct mem : IEquatable>, IEquatable { public static readonly mem NULL = new mem(-1); internal readonly int offsetedUniqueID; #region Properties public int UniqueID { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => offsetedUniqueID - 1; } public bool HasValue { [MethodImpl(MethodImplOptions.AggressiveInlining)] get => offsetedUniqueID != 0; } #endregion #region Constructors private mem(int uniqueID) { offsetedUniqueID = uniqueID + 1; } #endregion #region Equals [MethodImpl(MethodImplOptions.AggressiveInlining)] public override bool Equals(object obj) => obj is mem key && offsetedUniqueID == key.offsetedUniqueID; [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(mem other) => offsetedUniqueID == other.offsetedUniqueID; [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(int other) => offsetedUniqueID == (other + 1); #endregion #region GetHashCode/ToString [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() => offsetedUniqueID - 1; [MethodImpl(MethodImplOptions.AggressiveInlining)] public override string ToString() => HasValue ? MemberDeclarator.GetMemberInfo(this).ToString() : "NULL"; #endregion #region operators [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool operator ==(in mem left, in mem right) => left.Equals(right); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static bool operator !=(in mem left, in mem right) => !left.Equals(right); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator mem(string name) => new mem(MemberDeclarator.Declare(name).UniqueID); #endregion } }