summaryrefslogtreecommitdiff
path: root/src/buffer.inl.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/buffer.inl.hh')
-rw-r--r--src/buffer.inl.hh35
1 files changed, 29 insertions, 6 deletions
diff --git a/src/buffer.inl.hh b/src/buffer.inl.hh
index c5771de4..65474f7d 100644
--- a/src/buffer.inl.hh
+++ b/src/buffer.inl.hh
@@ -108,19 +108,23 @@ inline ByteCoord Buffer::end_coord() const
}
inline BufferIterator::BufferIterator(const Buffer& buffer, ByteCoord coord)
- : m_buffer(&buffer), m_coord(coord)
+ : m_buffer(&buffer), m_coord(coord),
+ m_line_length((*m_buffer)[m_coord.line].length()),
+ m_line_count(buffer.line_count())
{
kak_assert(m_buffer and m_buffer->is_valid(m_coord));
}
inline bool BufferIterator::operator==(const BufferIterator& iterator) const
{
- return (m_buffer == iterator.m_buffer and m_coord == iterator.m_coord);
+ kak_assert(m_buffer == iterator.m_buffer);
+ return m_coord == iterator.m_coord;
}
inline bool BufferIterator::operator!=(const BufferIterator& iterator) const
{
- return (m_buffer != iterator.m_buffer or m_coord != iterator.m_coord);
+ kak_assert(m_buffer == iterator.m_buffer);
+ return m_coord != iterator.m_coord;
}
inline bool BufferIterator::operator<(const BufferIterator& iterator) const
@@ -178,25 +182,44 @@ inline BufferIterator BufferIterator::operator-(ByteCount size) const
inline BufferIterator& BufferIterator::operator+=(ByteCount size)
{
m_coord = m_buffer->advance(m_coord, size);
+ m_line_length = m_buffer->line_storage(m_coord.line)->length;
return *this;
}
inline BufferIterator& BufferIterator::operator-=(ByteCount size)
{
m_coord = m_buffer->advance(m_coord, -size);
+ m_line_length = m_buffer->line_storage(m_coord.line)->length;
return *this;
}
-[[gnu::always_inline]]
inline BufferIterator& BufferIterator::operator++()
{
- m_coord = m_buffer->next(m_coord);
+ if (m_coord.column < m_line_length - 1)
+ ++m_coord.column;
+ else if (m_coord.line == m_line_count - 1)
+ m_coord.column = m_line_length;
+ else
+ {
+ ++m_coord.line;
+ m_coord.column = 0;
+ m_line_length = m_buffer->line_storage(m_coord.line)->length;
+ }
return *this;
}
inline BufferIterator& BufferIterator::operator--()
{
- m_coord = m_buffer->prev(m_coord);
+ if (m_coord.column == 0)
+ {
+ if (m_coord.line > 0)
+ {
+ m_line_length = m_buffer->line_storage(--m_coord.line)->length;
+ m_coord.column = m_line_length - 1;
+ }
+ }
+ else
+ --m_coord.column;
return *this;
}