| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374 |
- using System;
- namespace ARMeilleure.CodeGen.RegisterAllocators
- {
- unsafe readonly struct LiveRange : IEquatable<LiveRange>
- {
- 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<Data>();
- 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})";
- }
- }
- }
|