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