public IntIntervalRelation RelationTo(IntInterval other) { if (this < other) { return(IntIntervalRelation.Less); } else if (other < this) { return(IntIntervalRelation.Greater); } else if (this == other) { return(IntIntervalRelation.Equal); } else if (this.Contains(other)) { return(IntIntervalRelation.Contains); } else if (other.Contains(this)) { return(IntIntervalRelation.Contained); } else if (this.Contains(other.First)) { return(IntIntervalRelation.OverlapFirst); } else if (other.Contains(this.First)) { return(IntIntervalRelation.OverlapLast); } else { throw new InvalidOperationException("Internal error"); } }
public override bool Contains(Int actual) { if (bounds.Contains(actual)) { foreach (var interval in intervals) { if (actual >= interval.First && actual <= interval.Last) { return(true); } } } return(false); }
public IEnumerable <IntArrow <TAttr> > Enumerate(IntInterval bounds) { if (arrows.Count == 0 || bounds.IsEmpty) { yield break; } int i = 0; int count = arrows.Count; while (i != count && bounds.First > arrows[i].Key.Last) { ++i; } while (i != count && bounds.Contains(arrows[i].Key)) { yield return(arrows[i]); ++i; } if (i != count) { var intersection = arrows[i].Key * bounds; if (!intersection.IsEmpty) { yield return(new IntArrow <TAttr>(intersection, arrows[i].Value)); } } }
public IntIntervalRelation RelationTo(IntInterval other) { if (this < other) { return IntIntervalRelation.Less; } else if (other < this) { return IntIntervalRelation.Greater; } else if (this == other) { return IntIntervalRelation.Equal; } else if (this.Contains(other)) { return IntIntervalRelation.Contains; } else if (other.Contains(this)) { return IntIntervalRelation.Contained; } else if (this.Contains(other.First)) { return IntIntervalRelation.OverlapFirst; } else if (other.Contains(this.First)) { return IntIntervalRelation.OverlapLast; } else { throw new InvalidOperationException("Internal error"); } }
public override void Add(IntInterval newInterval) { if (newInterval.First > newInterval.Last) { return; } bool changed = false; var oldBounds = bounds; bounds = bounds.Union(newInterval); if (oldBounds.IsNextTo(newInterval)) { bool done = false; for (int i = 0; i != intervals.Count; ++i) { IntInterval interval = intervals[i]; if (interval == newInterval) { // already in set done = true; break; } if (interval.IsNextTo(newInterval)) { changed = !interval.Contains(newInterval); var bigger = interval.Union(newInterval); intervals[i] = bigger; for (int j = i + 1; j != intervals.Count;) { interval = intervals[j]; if (bigger.IsNextTo(interval)) { bigger = bigger.Union(interval); intervals[i] = bigger; intervals.RemoveAt(j); } else { ++j; } } done = true; break; } if (newInterval < interval) { intervals.Insert(i, newInterval); done = true; changed = true; break; } } if (!done) { intervals.Insert(0, newInterval); changed = true; } } else if (newInterval < oldBounds) { intervals.Insert(0, newInterval); changed = true; } else { intervals.Add(newInterval); changed = true; } if (changed) { UpdateHash(); } }