private bool Intersects(ValueRange <T> LHS, ValueRange <T> RHS) { return(LHS.Start < RHS.End && RHS.Start < LHS.End); }
private bool CompareValues(ValueRange <T> LHS, ValueRange <T> RHS) { return(LHS.Value?.Equals(RHS.Value) ?? RHS.Value == null); }
public void Add(ValueRange <T> Range) { if (Range.End <= Range.Start) { //Empty or invalid range, do nothing. return; } int First = BinarySearchFirstIntersection(Range); if (First == -1) { //No intersections case. //Find first greater than range (after the current one). //If found, add before, otherwise add to the end of the list. int GtIndex = BinarySearchGt(Range); if (GtIndex != -1) { Ranges.Insert(GtIndex, Range); } else { Ranges.Add(Range); } return; } (int Start, int End) = GetAllIntersectionRanges(Range, First); ValueRange <T> Prev = Ranges[Start]; ValueRange <T> Next = Ranges[End]; Ranges.RemoveRange(Start, (End - Start) + 1); InsertNextNeighbour(Start, Range, Next); int NewIndex = Start; Ranges.Insert(Start, Range); InsertPrevNeighbour(Start, Range, Prev); //Try merging neighbours if the value is equal. if (NewIndex > 0) { Prev = Ranges[NewIndex - 1]; if (Prev.End == Range.Start && CompareValues(Prev, Range)) { Ranges.RemoveAt(--NewIndex); Ranges[NewIndex] = new ValueRange <T>(Prev.Start, Range.End, Range.Value); } } if (NewIndex < Ranges.Count - 1) { Next = Ranges[NewIndex + 1]; if (Next.Start == Range.End && CompareValues(Next, Range)) { Ranges.RemoveAt(NewIndex + 1); Ranges[NewIndex] = new ValueRange <T>(Ranges[NewIndex].Start, Next.End, Range.Value); } } }