public List<Range> Subtract(Range range) { List<Range> result = new List<Range>(); if (Includes(range._lower) && Serial.Le(_lower, range._lower - 1)) { result.Add(new Range(_lower, range._lower - 1)); } if (Includes(range._upper) && Serial.Le(range._upper + 1, _upper)) { result.Add(new Range(range._upper + 1, _upper)); } if (result.Count == 0 && !range.Includes(this)) { result.Add(this); } return result; }
public void Processed(Range range) { log.Debug("{0} processed({1})", this, range); bool flush; lock (_processedLock) { _processed.Add(range); Range first = _processed.GetFirst(); int lower = first.Lower; int upper = first.Upper; int old = _maxProcessed; if (Serial.Le(lower, _maxProcessed + 1)) { _maxProcessed = Serial.Max(_maxProcessed, upper); } flush = Serial.Lt(old, _syncPoint) && Serial.Ge(_maxProcessed, _syncPoint); _syncPoint = _maxProcessed; } if (flush) { FlushProcessed(); } }
public Range Span(Range range) { return new Range(Serial.Min(_lower, range._lower), Serial.Max(_upper, range._upper)); }
public bool Touches(Range range) { return (Intersects(range) || Includes(range._upper + 1) || Includes(range._lower - 1) || range.Includes(_upper + 1) || range.Includes(_lower - 1)); }
public bool Intersects(Range range) { return (Includes(range._lower) || Includes(range._upper) || range.Includes(_lower) || range.Includes(_upper)); }
public bool Includes(Range range) { return Includes(range._lower) && Includes(range._upper); }
public Range Intersect(Range range) { int l = Serial.Max(_lower, range._lower); int r = Serial.Min(_upper, range._upper); return Serial.Gt(l, r) ? null : new Range(l, r); }