Example #1
0
        public IntSet Union(IntSet r, bool cloneWhenOneIsEmpty = false)
        {
            // Union of inverted sets is accomplished via intersection code: ~a | ~b => ~(a & b)
            IntSet l = this;

            if (l.IsInverted || r.IsInverted)
            {
                if (!l.IsInverted)
                {
                    l = l.EquivalentInverted();
                }
                if (!r.IsInverted)
                {
                    r = r.EquivalentInverted();
                }
                return(New(l.IsInverted ? r : l, true, IntersectCore(l, r)));
            }
            else
            {
                if (cloneWhenOneIsEmpty)
                {
                    if (l._ranges.Count == 0)
                    {
                        return(r.Clone());
                    }
                    if (r._ranges.Count == 0)
                    {
                        return(l.Clone());
                    }
                }
                return(New(this, false, UnionCore(l, r)));
            }
        }