void intersect_same_types (basic_string_token &rhs_, basic_string_token &overlap_) { if (any ()) { clear (); overlap_._negated = true; rhs_.clear (); } else { 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 (); overlap_._negated = _negated; while (iter_ != end_ && rhs_iter_ != rhs_end_) { if (*iter_ < *rhs_iter_) { ++iter_; } else if (*iter_ > *rhs_iter_) { ++rhs_iter_; } else { overlap_._charset += *iter_; iter_ = _charset.erase (iter_); end_ = _charset.end (); rhs_iter_ = rhs_._charset.erase (rhs_iter_); rhs_end_ = rhs_._charset.end (); } } if (_negated) { // duplicates already merged, so safe to merge // using std lib. // src, dest merge (_charset, overlap_._charset); // duplicates already merged, so safe to merge // using std lib. // src, dest merge (rhs_._charset, overlap_._charset); _negated = false; rhs_._negated = false; std::swap (_charset, rhs_._charset); normalise (); overlap_.normalise (); rhs_.normalise (); } else if (!overlap_._charset.empty ()) { normalise (); overlap_.normalise (); rhs_.normalise (); } } }