Example #1
0
 void intersect (basic_string_token &rhs_, basic_string_token &overlap_)
 {
     if (any () && rhs_.any () || (_negated == rhs_._negated &&
         !any () && !rhs_.any ()))
     {
         intersect_same_types (rhs_, overlap_);
     }
     else
     {
         intersect_diff_types (rhs_, overlap_);
     }
 }
Example #2
0
 void merge (const basic_string_token &rhs_,
     basic_string_token &merged_) const
 {
     if ((any () && rhs_.any ()) || (_negated == rhs_._negated &&
         !any () && !rhs_.any ()))
     {
         merge_same_types (rhs_, merged_);
     }
     else
     {
         merge_diff_types (rhs_, merged_);
     }
 }
Example #3
0
 void intersect_negated (basic_string_token &rhs_,
     basic_string_token &overlap_)
 {
     if (rhs_.any ())
     {
         overlap_._negated = true;
         overlap_._charset = _charset;
         rhs_._negated = false;
         rhs_._charset = _charset;
         clear ();
     }
     else // rhs._negated == false
     {
         rhs_.intersect_charset (*this, overlap_);
     }
 }
Example #4
0
    void intersect_charset (basic_string_token &rhs_,
        basic_string_token &overlap_)
    {
        if (rhs_.any ())
        {
            overlap_._charset = _charset;
            rhs_._negated = true;
            rhs_._charset = _charset;
            clear ();
        }
        else // rhs_._negated == true
        {
            typename string::iterator iter_ = _charset.begin ();
            typename string::iterator end_ = _charset.end ();
            typename string::iterator rhs_iter_ = rhs_._charset.begin ();
            typename string::iterator rhs_end_ = rhs_._charset.end ();

            while (iter_ != end_ && rhs_iter_ != rhs_end_)
            {
                if (*iter_ < *rhs_iter_)
                {
                    overlap_._charset += *iter_;
                    rhs_iter_ = rhs_._charset.insert (rhs_iter_, *iter_);
                    ++rhs_iter_;
                    rhs_end_ = rhs_._charset.end ();
                    iter_ = _charset.erase (iter_);
                    end_ = _charset.end ();
                }
                else if (*iter_ > *rhs_iter_)
                {
                    ++rhs_iter_;
                }
                else
                {
                    ++iter_;
                    ++rhs_iter_;
                }
            }

            if (iter_ != end_)
            {
                // nothing bigger in rhs_ than iter_,
                // so safe to merge using std lib.
                string temp_ (iter_, end_);

                // src, dest
                merge (temp_, overlap_._charset);
                _charset.erase (iter_, end_);
            }

            if (!overlap_._charset.empty ())
            {
                merge (overlap_._charset, rhs_._charset);
                // possible duplicates, so check for any and erase.
                rhs_._charset.erase (std::unique (rhs_._charset.begin (),
                    rhs_._charset.end ()), rhs_._charset.end ());
                normalise ();
                overlap_.normalise ();
                rhs_.normalise ();
            }
        }
    }