using System; using System.Runtime.InteropServices; namespace UnityEngine.Timeline { #if !UNITY_6000_2_OR_NEWER [Serializable] struct EntityId : IComparable { public int m_Value; public static implicit operator int(EntityId entityId) => entityId.m_Value; public static implicit operator EntityId(int instanceId) => new EntityId { m_Value = instanceId }; public static readonly EntityId None = new EntityId { m_Value = -1 }; internal static EntityId AllocateNextLowestEntityId() => 1; public int CompareTo(EntityId other) { return m_Value.CompareTo(other.m_Value); } } #endif [Serializable] [StructLayout(LayoutKind.Explicit)] struct ObjectId : IEquatable, IComparable { [SerializeField] [FieldOffset(0)] private EntityId m_Data; [FieldOffset(0)] private int m_IntData; public static readonly ObjectId InvalidId = new ObjectId(EntityId.None); internal ObjectId(EntityId data) { m_IntData = 0; // unused, overwritten by m_Data m_Data = data; } public static implicit operator ObjectId(EntityId entityId) { return new ObjectId() { m_Data = entityId }; } public static implicit operator EntityId(ObjectId objectId) => objectId.m_Data; #if !UNITY_6000_4_OR_NEWER public static implicit operator int(ObjectId objectId) => objectId.m_IntData; public static implicit operator ObjectId(int instanceId) => new ObjectId { m_Data = EntityId.None, m_IntData = instanceId }; #endif public override bool Equals(object obj) => obj is ObjectId other && Equals(other); public bool Equals(ObjectId other) => m_Data == other.m_Data; public int CompareTo(ObjectId other) => this.m_Data.CompareTo(other.m_Data); public static bool operator ==(ObjectId left, ObjectId right) => left.Equals(right); public static bool operator !=(ObjectId left, ObjectId right) => !left.Equals(right); public static bool operator <(ObjectId left, ObjectId right) => left.m_Data < right.m_Data; public static bool operator >(ObjectId left, ObjectId right) => left.m_Data > right.m_Data; public static bool operator <=(ObjectId left, ObjectId right) => left.m_Data <= right.m_Data; public static bool operator >=(ObjectId left, ObjectId right) => left.m_Data >= right.m_Data; public override int GetHashCode() => m_Data.GetHashCode(); } }