Example #1
0
 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");
     }
 }
Example #2
0
        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);
        }
Example #3
0
        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));
                }
            }
        }
Example #4
0
 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");
     }
 }
Example #5
0
        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();
            }
        }