void adjust(const range &range_, basic_string_token &token_, typename range_vector::iterator &iter_, typename range_vector::const_iterator &end_) { if (range_.first > iter_->first) { const index_type second_ = iter_->second; iter_->second = range_.first - 1; if (range_.second < second_) { range new_range_(range_.second + 1, second_); iter_ = token_.insert(new_range_); end_ = token_._ranges.end(); } } else if (range_.second < iter_->second) { iter_->first = range_.second + 1; } else { iter_ = token_._ranges.erase(iter_); end_ = token_._ranges.end(); } }
void intersect(basic_string_token &rhs_, basic_string_token &overlap_) { typename range_vector::iterator lhs_iter_ = _ranges.begin(); typename range_vector::const_iterator lhs_end_ = _ranges.end(); typename range_vector::iterator rhs_iter_ = rhs_._ranges.begin(); typename range_vector::const_iterator rhs_end_ = rhs_._ranges.end(); while (lhs_iter_ != lhs_end_ && rhs_iter_ != rhs_end_) { if (rhs_iter_->first > lhs_iter_->second) { ++lhs_iter_; } else if (rhs_iter_->second < lhs_iter_->first) { ++rhs_iter_; } else { range range_; if (rhs_iter_->first > lhs_iter_->first) { range_.first = rhs_iter_->first; } else { range_.first = lhs_iter_->first; } if (rhs_iter_->second < lhs_iter_->second) { range_.second = rhs_iter_->second; } else { range_.second = lhs_iter_->second; } adjust(range_, *this, lhs_iter_, lhs_end_); adjust(range_, rhs_, rhs_iter_, rhs_end_); overlap_.insert(range_); } } }