DragonECS/src/Primitives/mem.cs

57 lines
2.0 KiB
C#
Raw Normal View History

2023-02-08 17:07:39 +08:00
using System;
using System.Runtime.CompilerServices;
using DCFApixels.DragonECS.Reflection;
namespace DCFApixels.DragonECS
{
public readonly struct mem<T> : IEquatable<mem<T>>, IEquatable<int>
2023-02-09 02:26:43 +08:00
where T : struct
2023-02-08 17:07:39 +08:00
{
2023-02-09 02:26:43 +08:00
public static readonly mem<T> NULL = default;
2023-02-08 17:07:39 +08:00
2023-02-09 02:26:43 +08:00
internal readonly int uniqueID;
2023-02-08 17:07:39 +08:00
#region Properties
public bool HasValue
{
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-09 02:26:43 +08:00
get => uniqueID != 0;
2023-02-08 17:07:39 +08:00
}
#endregion
#region Constructors
2023-02-09 02:26:43 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private mem(int uniqueID) => this.uniqueID = uniqueID;
2023-02-08 17:07:39 +08:00
#endregion
#region Equals
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-09 02:26:43 +08:00
public override bool Equals(object obj) => obj is mem<T> key && uniqueID == key.uniqueID;
2023-02-08 17:07:39 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-09 02:26:43 +08:00
public bool Equals(mem<T> other) => uniqueID == other.uniqueID;
2023-02-08 17:07:39 +08:00
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-09 02:26:43 +08:00
public bool Equals(int other) => uniqueID == other;
2023-02-08 17:07:39 +08:00
#endregion
#region GetHashCode/ToString
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-09 02:26:43 +08:00
public override int GetHashCode() => uniqueID;
2023-02-08 17:07:39 +08:00
[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<T> left, in mem<T> right) => left.Equals(right);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static bool operator !=(in mem<T> left, in mem<T> right) => !left.Equals(right);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
2023-02-08 17:57:06 +08:00
public static implicit operator mem<T>(string name) => new mem<T>(MemberDeclarator.GetOrDeclareMember<T>(name).UniqueID);
2023-02-08 17:07:39 +08:00
#endregion
}
}