summaryrefslogtreecommitdiff
path: root/src/buffer.inl.hh
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-11-07 16:55:48 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-11-07 16:55:48 +0000
commit6bb775241cf44fa2aec40c1fa0294e8b7379cf70 (patch)
tree6d0ee75ef67a3de60bf6cc7ffe46b36ecabee4bd /src/buffer.inl.hh
parent04c8334c984bc71102b5065765a42a0b61932e63 (diff)
Optimize BufferIterator to avoid a lot of pointer chasing
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;
}