Esempio n. 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)));
            }
        }
Esempio n. 2
0
        public void RandomTests()
        {
            int seed = Environment.TickCount;

            for (int test = 0; test < 100; test++)
            {
                var    r = new Random(seed + test);
                IntSet a = RandomIntSet(r), b = RandomIntSet(r);
                IsFalse(a.IsEmptySet);
                IsFalse(b.IsEmptySet);
                var union = a.Union(b);
                var intsc = a.Intersection(b);
                var dif   = a.Subtract(b);
                AreEqual(union.Equals(intsc), a.Equals(b));

                for (int i = -10; i < 20; i++)
                {
                    bool ina = a.Contains(i), inb = b.Contains(i);
                    AreEqual(ina || inb, union.Contains(i));
                    AreEqual(ina && inb, intsc.Contains(i));
                    AreEqual(ina && !inb, dif.Contains(i));
                }

                var eInv = a.EquivalentInverted();
                IsTrue(a.Equals(eInv, IntSet.S_Equivalent));
                IsFalse(a.Equals(eInv, IntSet.S_Identical));
                IsFalse(a.Equals(eInv, IntSet.S_SameRangeList));

                var inv = eInv.Clone();
                inv = inv.Inverted();
                IsFalse(inv.Equals(eInv));
                IsTrue(inv.Equals(eInv, IntSet.S_SameRangeList));

                IntSet all = a.Union(inv), none = a.Intersection(inv);
                IsFalse(all.IsEmptySet);
                IsTrue(none.IsEmptySet);
                IsFalse(all.Equals(none));
                AreEqual(all.IsInverted ? 0 : 1, all.Count);
                AreEqual(none.IsInverted ? 1 : 0, none.Count);
                AreEqual(all, all.Union(none));
                AreEqual(all, all.Union(a));
                AreEqual(none, all.Intersection(none));
                AreEqual(a, all.Intersection(a));
                AreEqual(a, a.Subtract(none));

                all = all.Inverted();
                IsTrue(all.Equals(none));
            }
        }
Esempio n. 3
0
        public bool Equals(IntSet other, Symbol mode)
        {
            if (IsInverted == other.IsInverted)
            {
                return(_ranges.AllEqual(other._ranges));
            }

            if (mode == S_Equivalent)
            {
                int dif = _ranges.Count - other._ranges.Count;
                return(dif >= -1 && dif <= 1 && _ranges.AllEqual(other.EquivalentInverted()._ranges));
            }
            else
            {
                return(mode == S_SameRangeList && _ranges.AllEqual(other._ranges));
            }
        }
Esempio n. 4
0
        public IntSet Intersection(IntSet r, bool subtract = false, bool subtractThis = false)
        {
            IntSet l = this, oldr = r;
            bool   lInv = l.IsInverted ^ subtractThis, rInv = r.IsInverted ^ subtract;

            if (lInv && rInv)
            {
                IntSet cl = null;
                if (l._ranges.Count == 0)
                {
                    cl = r;
                }
                if (r._ranges.Count == 0)
                {
                    cl = l;
                }
                if (cl != null)
                {
                    if (!cl.IsInverted)
                    {
                        cl = cl.Inverted();
                    }
                    return(cl);
                }
                else
                {
                    return(New(this, true, UnionCore(l, r)));
                }
            }
            else
            {
                if (lInv)
                {
                    l = l.EquivalentInverted();
                }
                if (rInv)
                {
                    r = r.EquivalentInverted();
                }
                return(New(lInv ? r : l, false, IntersectCore(l, r)));
            }
        }