diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2012-04-04 13:56:19 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2012-04-04 13:56:19 +0000 |
| commit | e4b872abd26405a7c26ffbd14dff91c816750601 (patch) | |
| tree | 97832ec7afbbcf90280d1e68d67c3a057e5a11de /src/buffer_iterator.inl.hh | |
| parent | 6cedff8fb26dfd3fe099e71c3d96f8c62f48c73a (diff) | |
remove ModificationListener and use a list of iterators to update instead
This permits to fix a bug in BufferIterator::upgrade, replaced by
BufferIterator::on_insert and BufferIterator::on_erase. ModificationListener
was only used to updating iterators anyway.
Diffstat (limited to 'src/buffer_iterator.inl.hh')
| -rw-r--r-- | src/buffer_iterator.inl.hh | 74 |
1 files changed, 26 insertions, 48 deletions
diff --git a/src/buffer_iterator.inl.hh b/src/buffer_iterator.inl.hh index 2a8e3dc4..5260d3ed 100644 --- a/src/buffer_iterator.inl.hh +++ b/src/buffer_iterator.inl.hh @@ -71,67 +71,45 @@ inline bool BufferIterator::operator>=(const BufferIterator& iterator) const return (m_coord >= iterator.m_coord); } -inline BufferCoord measure_string(const String& string) +inline void BufferIterator::on_insert(const BufferCoord& begin, + const BufferCoord& end) { - BufferCoord res; - for (auto c : string) - { - if (c == '\n') - { - ++res.line; - res.column = 0; - } - else - ++res.column; - } - return res; -} + if (m_coord < begin) + return; -inline BufferCoord advance(const BufferCoord& base, const BufferCoord& offset) -{ - if (offset.line == 0) - return BufferCoord{base.line, base.column + offset.column}; - else - return BufferCoord{base.line + offset.line, offset.column}; + if (begin.line == line()) + m_coord.column = end.column + m_coord.column - begin.column; + m_coord.line += end.line - begin.line; + + assert(is_valid()); } -inline void BufferIterator::update(const Modification& modification) +inline void BufferIterator::on_erase(const BufferCoord& begin, + const BufferCoord& end) { - const BufferIterator& pos = modification.position; - if (*this < pos) + if (m_coord < begin) return; - BufferCoord measure = measure_string(modification.content); - if (modification.type == Modification::Erase) - { - BufferCoord end = advance(pos.m_coord, measure); - if (m_coord <= end) - m_coord = pos.m_coord; - else - { - m_coord.line -= measure.line; - if (measure.line > 0 and pos.line() == m_coord.line) - m_coord.column += pos.column(); - if (end.line == m_coord.line) - m_coord.column -= measure.column; - } - - if (is_end()) - operator--(); - } + BufferCoord measure; + measure.line = end.line - begin.line; + measure.column = end.column - (measure.line == 0 ? begin.column : 0); + if (m_coord <= end) + m_coord = begin; else { - assert(modification.type == Modification::Insert); - if (pos.line() == line()) - { - BufferCoord end = advance(pos.m_coord, measure); - m_coord.column = end.column + column() - pos.column(); - } - m_coord.line += measure.line; + m_coord.line -= measure.line; + if (measure.line > 0 and begin.line == m_coord.line) + m_coord.column += begin.column; + if (end.line == m_coord.line) + m_coord.column -= measure.column; } + + if (is_end()) + operator--(); assert(is_valid()); } + inline BufferChar BufferIterator::operator*() const { assert(m_buffer); |
