Range
Represent a range has start and end indexes.
using System.Diagnostics.CodeAnalysis;
using System.Runtime.CompilerServices;
namespace System
{
[ExcludeFromCodeCoverage]
internal readonly struct Range : IEquatable<System.Range>
{
private static class HashHelpers
{
public static int Combine(int h1, int h2)
{
uint num = (uint)((h1 << 5) | (int)((uint)h1 >> 27));
return ((int)num + h1) ^ h2;
}
}
private static class ThrowHelper
{
[System.Diagnostics.CodeAnalysis.DoesNotReturn]
public static void ThrowArgumentOutOfRangeException()
{
throw new ArgumentOutOfRangeException("length");
}
}
public System.Index Start { get; }
public System.Index End { get; }
public static System.Range All => new System.Range(System.Index.Start, System.Index.End);
public Range(System.Index start, System.Index end)
{
Start = start;
End = end;
}
[System.Runtime.CompilerServices.NullableContext(2)]
public override bool Equals([System.Diagnostics.CodeAnalysis.NotNullWhen(true)] object value)
{
if (value is System.Range) {
System.Range range = (System.Range)value;
System.Index index = range.Start;
if (index.Equals(Start)) {
index = range.End;
return index.Equals(End);
}
}
return false;
}
public bool Equals(System.Range other)
{
System.Index index = other.Start;
if (index.Equals(Start)) {
index = other.End;
return index.Equals(End);
}
return false;
}
public override int GetHashCode()
{
System.Index index = Start;
int hashCode = index.GetHashCode();
index = End;
return HashHelpers.Combine(hashCode, index.GetHashCode());
}
[System.Runtime.CompilerServices.NullableContext(1)]
public override string ToString()
{
System.Index index = Start;
string str = index.ToString();
index = End;
return str + ".." + index.ToString();
}
public static System.Range StartAt(System.Index start)
{
return new System.Range(start, System.Index.End);
}
public static System.Range EndAt(System.Index end)
{
return new System.Range(System.Index.Start, end);
}
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public (int Offset, int Length) GetOffsetAndLength(int length)
{
System.Index start = Start;
int num = (!start.IsFromEnd) ? start.Value : (length - start.Value);
System.Index end = End;
int num2 = (!end.IsFromEnd) ? end.Value : (length - end.Value);
if ((uint)num2 > (uint)length || (uint)num > (uint)num2)
ThrowHelper.ThrowArgumentOutOfRangeException();
return (num, num2 - num);
}
}
}