using System; namespace ARMeilleure.CodeGen.RegisterAllocators { unsafe readonly struct LiveRange : IEquatable { private struct Data { public int Start; public int End; public LiveRange Next; } private readonly Data* _data; public ref int Start => ref _data->Start; public ref int End => ref _data->End; public ref LiveRange Next => ref _data->Next; public LiveRange(int start, int end, LiveRange next = default) { _data = Allocators.LiveRanges.Allocate(); Start = start; End = end; Next = next; } public bool Overlaps(int start, int end) { return Start < end && start < End; } public bool Overlaps(LiveRange range) { return Start < range.End && range.Start < End; } public bool Overlaps(int position) { return position >= Start && position < End; } public bool Equals(LiveRange range) { return range._data == _data; } public override bool Equals(object obj) { return obj is LiveRange range && Equals(range); } public static bool operator ==(LiveRange a, LiveRange b) { return a.Equals(b); } public static bool operator !=(LiveRange a, LiveRange b) { return !a.Equals(b); } public override int GetHashCode() { return HashCode.Combine((IntPtr)_data); } public override string ToString() { return $"[{Start}, {End})"; } } }