/// <summary> /// Join this range with another and return a single range that contains them both. The ranges must either touch or interest. /// for example (0,2) amd (3,7) will yield (0,7) /// </summary> /// <param name="range">the other range</param> /// <returns>the merged range</returns> public IntRange JoinWith(IntRange range) { if (this.Intersects(range) || this.Touches(range)) { int new_Upper = System.Math.Max(this.Upper, range.Upper); int new_Lower = System.Math.Min(this.Lower, range.Lower); return(IntRange.FromEndpoints(new_Lower, new_Upper)); } else { throw new System.ArgumentException(); } }
public void Remove(IntRange range) { // if the range doesn't intersect this collection do nothing if (!range.Intersects(IntRange.FromEndpoints(this.Lower, this.Upper))) { return; } var middle = new List <IntRange>(); foreach (var S in this.ranges) { if (!range.Intersects(S)) { middle.Add(S); continue; } if ((range.Lower <= S.Lower) && (range.Upper >= S.Upper)) { // disregard S completely continue; } if (range.Lower > S.Lower) { if (S.Lower <= (range.Lower - 1)) { var X = IntRange.FromEndpoints(S.Lower, range.Lower - 1); middle.Add(X); } } if (range.Upper <= S.Upper) { if ((range.Upper + 1) <= S.Upper) { var X = IntRange.FromEndpoints(range.Upper + 1, S.Upper); middle.Add(X); } } else { throw new System.InvalidOperationException("internal error"); } } this.ranges = middle; }
public void AddInclusive(int lower, int upper) { var rng = IntRange.FromEndpoints(lower, upper); this.Add(rng); }
public void RemoveInclusive(int lower, int upper) { var rng = IntRange.FromEndpoints(lower, upper); this.Remove(rng); }