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))); } }