summaryrefslogtreecommitdiff
path: root/src/buffer_iterator.inl.hh
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-04-04 13:56:19 +0000
committerMaxime Coste <frrrwww@gmail.com>2012-04-04 13:56:19 +0000
commite4b872abd26405a7c26ffbd14dff91c816750601 (patch)
tree97832ec7afbbcf90280d1e68d67c3a057e5a11de /src/buffer_iterator.inl.hh
parent6cedff8fb26dfd3fe099e71c3d96f8c62f48c73a (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.hh74
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);