Example #1
0
    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();
        }
    }
Example #2
0
    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_);
            }
        }
    }