public bool IsProperSupersetOf(UintSet other)
        {
            bool atLeastOneProperSuperset = false;
            int  i = 0;

            for (; i < sets.Length && i < other.sets.Length; i++)
            {
                if (!atLeastOneProperSuperset && sets[i].IsProperSupersetOf(other.sets[i]))
                {
                    atLeastOneProperSuperset = true;
                }
                else if (!sets[i].IsSupersetOf(other.sets[i]))
                {
                    return(false);
                }
            }
            if (atLeastOneProperSuperset)
            {
                return(true);
            }
            for (; i < other.sets.Length; i++)
            {
                if (other.sets[i].Any())
                {
                    return(true);
                }
            }
            return(false);
        }
        public UintSet SymmetricExcept(UintSet other)
        {
            var(self, except) = (this, other);
            IEnumerable <ImmutableSet64> exceptWith()
            {
                int i = 0;

                for (; i < self.sets.Length && i < except.sets.Length; i++)
                {
                    yield return(self.sets[i].SymmetricExcept(except.sets[i]));
                }
                if (self.sets.Length > except.sets.Length)
                {
                    for (; i < self.sets.Length; i++)
                    {
                        yield return(self.sets[i]);
                    }
                }
                else
                {
                    for (; i < except.sets.Length; i++)
                    {
                        yield return(except.sets[i]);
                    }
                }
            }

            return(new UintSet(exceptWith()));
        }
 public bool Overlaps(UintSet other)
 {
     for (int i = 0; i < sets.Length && i < other.sets.Length; i++)
     {
         if (sets[i].Overlaps(other.sets[i]))
         {
             return(true);
         }
     }
     return(false);
 }
 public bool IsSupersetOf(UintSet other)
 {
     var(small, large) = sets.Length < other.sets.Length ? (this, other) : (other, this);
     for (int i = 0; i < small.sets.Length; i++)
     {
         if (!small.sets[i].IsSupersetOf(large.sets[i]))
         {
             return(false);
         }
     }
     return(true);
 }
 public bool SetEquals(UintSet other)
 {
     if (sets.Length != other.sets.Length)
     {
         return(false);
     }
     for (int i = 0; i < sets.Length; i++)
     {
         if (!sets[i].SetEquals(other.sets[i]))
         {
             return(false);
         }
     }
     return(true);
 }
        public UintSet Intersect(UintSet other)
        {
            var(self, intersect) = (this, other);
            IEnumerable <ImmutableSet64> intersectWith()
            {
                int i = 0;

                for (; i < self.sets.Length && i < intersect.sets.Length; i++)
                {
                    yield return(self.sets[i].Intersect(intersect.sets[i]));
                }
            }

            return(new UintSet(intersectWith()));
        }
        private static UintSet shiftDown(UintSet set)
        {
            var s = set;

            IEnumerable <ImmutableSet64> shifted()
            {
                for (int i = 0; i < s.sets.Length - 1; i++)
                {
                    yield return((s.sets[i] << 1).Union(s.sets[i + 1] >> 63));
                }
                if (s.sets.Length > 0)
                {
                    yield return(s.sets[s.sets.Length - 1] << 1);
                }
            }

            return(new UintSet(shifted()));
        }
        public UintSet Union(UintSet other)
        {
            var(small, large) = sets.Length < other.sets.Length ? (this, other) : (other, this);
            IEnumerable <ImmutableSet64> union()
            {
                int i = 0;

                for (; i < small.sets.Length; i++)
                {
                    yield return(small.sets[i].Union(large.sets[i]));
                }
                for (; i < large.sets.Length; i++)
                {
                    yield return(large.sets[i]);
                }
            }

            return(new UintSet(union()));
        }
        private static UintSet shiftUp(UintSet set)
        {
            var s = set;

            IEnumerable <ImmutableSet64> shifted()
            {
                if (s.sets.Length == 0)
                {
                    yield break;
                }
                yield return(s.sets[0] >> 1);

                for (int i = 1; i < s.sets.Length; i++)
                {
                    yield return((s.sets[i] >> 1).Union(s.sets[i - 1] << 63));
                }
            }

            return(new UintSet(shifted()));
        }
 public SomeSet(uint max, UintSet included) => (Included, _max) = (included, max);
 internal UintSet(UintSet copy)
 {
     sets   = copy.sets;
     _count = copy._count;
 }