/**
         * Ors a set with the inverse of another.
         */
        void mergeOrInv(RegexpSet b)
        {
            for (int i = 0; i < BITSET_CHARS; i++)
            {
                _bitset[i] = _bitset[i] || !b._bitset[i];
            }

            _range.unionNegate(b._range, 0, 0xfffff);
        }
        /**
         * Ors two character sets.
         */
        void mergeOr(RegexpSet b)
        {
            for (int i = 0; i < BITSET_CHARS; i++)
            {
                _bitset[i] = _bitset[i] || b._bitset[i];
            }

            _range.union(b._range);
        }
        /**
         * Calculate the difference of two sets.
         *
         * @return true if disjoint
         */
        void difference(RegexpSet next)
        {
            for (int i = 0; i < BITSET_CHARS; i++)
            {
                _bitset[i] = _bitset[i] & !next._bitset[i];
            }

            _range.difference(next._range);
        }
        /**
         * Calculate the intersection of two sets.
         *
         * @return true if disjoint
         */
        bool mergeOverlap(RegexpSet next)
        {
            bool isDisjoint = true;

            for (int i = 0; i < BITSET_CHARS; i++)
            {
                _bitset[i] = _bitset[i] & next._bitset[i];

                if (_bitset[i])
                {
                    isDisjoint = false;
                }
            }

            if (_range.intersection(next._range))
            {
                isDisjoint = false;
            }

            return(isDisjoint);
        }
        /**
         * Create a new RegexpSet
         */
        RegexpSet(RegexpSet old)
        {
            System.arraycopy(old._bitset, 0, _bitset, 0, _bitset.length);

            _range = (IntSet)old._range.clone();
        }