Beispiel #1
0
 private bool Intersects(ValueRange <T> LHS, ValueRange <T> RHS)
 {
     return(LHS.Start < RHS.End && RHS.Start < LHS.End);
 }
Beispiel #2
0
 private bool CompareValues(ValueRange <T> LHS, ValueRange <T> RHS)
 {
     return(LHS.Value?.Equals(RHS.Value) ?? RHS.Value == null);
 }
Beispiel #3
0
        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);
                }
            }
        }