summaryrefslogtreecommitdiff
path: root/src/buffer.inl.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2025-02-04 19:22:03 +1100
committerMaxime Coste <mawww@kakoune.org>2025-02-04 19:22:03 +1100
commit3ff33830627438de3f9638c18f7e192cdf5b32a5 (patch)
treec64cac49bd3e04772633e2a4d025a73760048136 /src/buffer.inl.hh
parent8eb753adfd914b0deade48c7510e30f7e05df860 (diff)
Revert "WIP linked list shared strings"
This got pushed by accident This reverts commit 2856b99e0914cc7a659977f2b33308cb5b4c9bb7.
Diffstat (limited to 'src/buffer.inl.hh')
-rw-r--r--src/buffer.inl.hh59
1 files changed, 26 insertions, 33 deletions
diff --git a/src/buffer.inl.hh b/src/buffer.inl.hh
index e55cae05..890a5cbd 100644
--- a/src/buffer.inl.hh
+++ b/src/buffer.inl.hh
@@ -60,7 +60,7 @@ inline BufferIterator Buffer::begin() const
inline BufferIterator Buffer::end() const
{
- return {m_sentinel.get(), end_coord()};
+ return {*this, end_coord()};
}
[[gnu::always_inline]]
@@ -99,19 +99,23 @@ inline BufferCoord Buffer::end_coord() const
}
inline BufferIterator::BufferIterator(const Buffer& buffer, BufferCoord coord) noexcept
- : BufferIterator{buffer.line_storage(coord.line).get(), coord} {}
+ : BufferIterator{buffer.m_lines.data(), buffer.line_count(), coord} {}
-inline BufferIterator::BufferIterator(const StringData* line, BufferCoord coord) noexcept
- : m_line{line},
+inline BufferIterator::BufferIterator(const StringDataPtr* lines, LineCount line_count, BufferCoord coord) noexcept
+ : m_lines{lines},
+ m_line{coord.line < line_count ? m_lines[(size_t)coord.line]->strview() : StringView{}},
+ m_line_count{line_count},
m_coord{coord} {}
inline bool BufferIterator::operator==(const BufferIterator& iterator) const noexcept
{
+ kak_assert(m_lines == iterator.m_lines);
return m_coord == iterator.m_coord;
}
inline auto BufferIterator::operator<=>(const BufferIterator& iterator) const noexcept
{
+ kak_assert(m_lines == iterator.m_lines);
return (m_coord <=> iterator.m_coord);
}
@@ -123,62 +127,52 @@ inline bool BufferIterator::operator==(const BufferCoord& coord) const noexcept
[[gnu::always_inline]]
inline const char& BufferIterator::operator*() const noexcept
{
- return m_line->data()[(size_t)(int)m_coord.column];
-}
-
-inline BufferIterator advance(BufferIterator iterator, int n)
-{
- for (; n > 0; --n)
- ++iterator;
- for (; n < 0; ++n)
- --iterator;
- return iterator;
+ return m_line[m_coord.column];
}
inline const char& BufferIterator::operator[](size_t n) const noexcept
{
- return *advance(*this, n);
+ auto coord = Buffer::advance({m_lines, (size_t)(int)m_line_count}, m_coord, n);
+ return m_lines[(size_t)coord.line]->strview()[coord.column];
}
inline size_t BufferIterator::operator-(const BufferIterator& iterator) const
{
- size_t distance = 0;
- auto* line = iterator.m_line;
- while (line != m_line)
- {
- distance += line->length - (line == iterator.m_line ? (int)iterator.m_coord.column : 0);
- }
- distance += (int)(m_coord.column - (line == iterator.m_line ? (int)iterator.m_coord.column : 0));
- return distance;
+ kak_assert(m_lines == iterator.m_lines);
+ return (size_t)Buffer::distance({m_lines, (size_t)(int)m_line_count}, iterator.m_coord, m_coord);
}
inline BufferIterator BufferIterator::operator+(ByteCount size) const
{
kak_assert(*this);
- return advance(*this, (int)size);
+ return { m_lines, m_line_count, Buffer::advance({m_lines, (size_t)(int)m_line_count}, m_coord, size) };
}
inline BufferIterator BufferIterator::operator-(ByteCount size) const
{
- return advance(*this, -(int)size);
+ return { m_lines, m_line_count, Buffer::advance({m_lines, (size_t)(int)m_line_count}, m_coord, -size) };
}
inline BufferIterator& BufferIterator::operator+=(ByteCount size)
{
- return *this = advance(*this, (int)size);
+ m_coord = Buffer::advance({m_lines, (size_t)(int)m_line_count}, m_coord, size);
+ m_line = m_lines[(size_t)m_coord.line]->strview();
+ return *this;
}
inline BufferIterator& BufferIterator::operator-=(ByteCount size)
{
- return *this = advance(*this, -(int)size);
+ m_coord = Buffer::advance({m_lines, (size_t)(int)m_line_count}, m_coord, -size);
+ m_line = m_lines[(size_t)m_coord.line]->strview();
+ return *this;
}
inline BufferIterator& BufferIterator::operator++()
{
- if (++m_coord.column == m_line->length)
+ if (++m_coord.column == m_line.length())
{
- m_line = m_line->next;
- ++m_coord.line;
+ m_line = ((size_t)++m_coord.line < m_line_count) ?
+ m_lines[(size_t)m_coord.line]->strview() : StringView{};
m_coord.column = 0;
}
return *this;
@@ -188,9 +182,8 @@ inline BufferIterator& BufferIterator::operator--()
{
if (m_coord.column == 0)
{
- m_line = m_line->prev;
- --m_coord.line;
- m_coord.column = m_line->length - 1;
+ m_line = m_lines[(size_t)--m_coord.line]->strview();
+ m_coord.column = m_line.length() - 1;
}
else
--m_coord.column;