Example #1
0
        protected void UpdateHashAndBounds()
        {
            bounds = new IntInterval(setType.MaxValue, setType.MinValue);
            foreach (var interval in intervals)
            {
                bounds = bounds.Union(interval);
            }

            UpdateHash();
        }
Example #2
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();
            }
        }
        protected void UpdateHashAndBounds()
        {
            bounds = new IntInterval(setType.MaxValue, setType.MinValue);
            foreach (var interval in intervals)
            {
                bounds = bounds.Union(interval);
            }

            UpdateHash();
        }