public void Add(Range rangeToAdd) { if (rangeToAdd.IsEmpty) { return; } for (LinkedListNode <Range> i = ranges.First; i != null; i = i.Next) { IntersectStruct r = Range.Intersect(rangeToAdd, i.Value); if (r.RelativePosition < 0) { ranges.AddBefore(i, rangeToAdd); rangeToAdd = new Range(); break; } else if (r.RelativePosition > 0) { } else { if (!r.Leftover1Left.IsEmpty) { ranges.AddBefore(i, r.Leftover1Left); } if (!r.Leftover2Left.IsEmpty) { ranges.AddBefore(i, r.Leftover2Left); } if (!r.Common.IsEmpty) { i.Value = r.Common; } if (!r.Leftover2Right.IsEmpty) { i = ranges.AddAfter(i, r.Leftover2Right); } if (!r.Leftover1Right.IsEmpty) { rangeToAdd = r.Leftover1Right; } else { rangeToAdd = new Range(); break; } } } if (!rangeToAdd.IsEmpty) { ranges.AddLast(rangeToAdd); } MergeDown(); }
public void Remove(Range rangeToRemove) { for (LinkedListNode <Range> i = ranges.First; i != null;) { LinkedListNode <Range> next = i.Next; IntersectStruct r = Range.Intersect(rangeToRemove, i.Value); if (r.RelativePosition == 0) { rangeToRemove = r.Leftover1Right; if (!r.Leftover2Left.IsEmpty) { ranges.AddBefore(i, r.Leftover2Left); } if (!r.Leftover2Right.IsEmpty) { ranges.AddBefore(i, r.Leftover2Right); } ranges.Remove(i); } i = next; } MergeDown(); }