summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2024-12-03 21:26:57 +1100
committerMaxime Coste <mawww@kakoune.org>2024-12-03 21:30:48 +1100
commitd29fa04adc6a15c8d62ffcd4390e5fc785d92b62 (patch)
tree9fd25a12f2cb5b18332b8f7767e76cb531782882 /src
parent6f29950e913a05bfad8baf1f515e36cf15dd2bb2 (diff)
Do not store buffer pointer in BufferIterator
This makes BufferIterator smaller and trivially move/copyable
Diffstat (limited to 'src')
-rw-r--r--src/buffer.cc12
-rw-r--r--src/buffer.hh13
-rw-r--r--src/buffer.inl.hh40
3 files changed, 36 insertions, 29 deletions
diff --git a/src/buffer.cc b/src/buffer.cc
index ada61ad8..f0205c54 100644
--- a/src/buffer.cc
+++ b/src/buffer.cc
@@ -570,17 +570,17 @@ void Buffer::notify_saved(FsStatus status)
m_fs_status = status;
}
-BufferCoord Buffer::advance(BufferCoord coord, ByteCount count) const
+BufferCoord Buffer::advance(ArrayView<const StringDataPtr> lines, BufferCoord coord, ByteCount count)
{
if (count > 0)
{
auto line = coord.line;
count += coord.column;
- while (count >= m_lines[line].length())
+ while (count >= lines[(size_t)line]->length)
{
- count -= m_lines[line++].length();
- if (line == line_count())
- return end_coord();
+ count -= lines[(size_t)line++]->length;
+ if ((size_t)line == lines.size())
+ return line;
}
return { line, count };
}
@@ -592,7 +592,7 @@ BufferCoord Buffer::advance(BufferCoord coord, ByteCount count) const
{
if (--line < 0)
return {0, 0};
- count += m_lines[line].length();
+ count += lines[(size_t)line]->length;
}
return { line, count };
}
diff --git a/src/buffer.hh b/src/buffer.hh
index fd748213..2b27f7c3 100644
--- a/src/buffer.hh
+++ b/src/buffer.hh
@@ -64,8 +64,9 @@ public:
// costly, so this is not strictly random access
using iterator_category = std::bidirectional_iterator_tag;
- BufferIterator() noexcept : m_buffer{nullptr}, m_line{} {}
+ BufferIterator() = default;
BufferIterator(const Buffer& buffer, BufferCoord coord) noexcept;
+ BufferIterator(ArrayView<const StringDataPtr> lines, BufferCoord coord) noexcept;
bool operator== (const BufferIterator& iterator) const noexcept;
auto operator<=>(const BufferIterator& iterator) const noexcept;
@@ -75,7 +76,7 @@ public:
const char& operator[](size_t n) const noexcept;
size_t operator- (const BufferIterator& iterator) const;
- explicit operator bool() const { return static_cast<bool>(m_buffer); }
+ explicit operator bool() const { return not m_lines.empty(); }
BufferIterator operator+ (ByteCount size) const;
BufferIterator operator- (ByteCount size) const;
@@ -94,7 +95,6 @@ public:
using Sentinel = BufferCoord;
private:
- SafePtr<const Buffer> m_buffer;
ArrayView<const StringDataPtr> m_lines;
BufferCoord m_coord;
StringView m_line;
@@ -159,9 +159,12 @@ public:
String string(BufferCoord begin, BufferCoord end) const;
StringView substr(BufferCoord begin, BufferCoord end) const;
+ static BufferCoord advance(ArrayView<const StringDataPtr> lines, BufferCoord coord, ByteCount count);
+ static ByteCount distance(ArrayView<const StringDataPtr> lines, BufferCoord begin, BufferCoord end);
+
const char& byte_at(BufferCoord c) const;
- ByteCount distance(BufferCoord begin, BufferCoord end) const;
- BufferCoord advance(BufferCoord coord, ByteCount count) const;
+ ByteCount distance(BufferCoord begin, BufferCoord end) const { return distance(m_lines, begin, end); }
+ BufferCoord advance(BufferCoord coord, ByteCount count) const { return advance(m_lines, coord, count); }
BufferCoord next(BufferCoord coord) const;
BufferCoord prev(BufferCoord coord) const;
diff --git a/src/buffer.inl.hh b/src/buffer.inl.hh
index f3e46378..7465e532 100644
--- a/src/buffer.inl.hh
+++ b/src/buffer.inl.hh
@@ -27,16 +27,16 @@ inline BufferCoord Buffer::prev(BufferCoord coord) const
return { coord.line, coord.column - 1 };
}
-inline ByteCount Buffer::distance(BufferCoord begin, BufferCoord end) const
+inline ByteCount Buffer::distance(ArrayView<const StringDataPtr> lines, BufferCoord begin, BufferCoord end)
{
if (begin > end)
- return -distance(end, begin);
+ return -distance(lines, end, begin);
if (begin.line == end.line)
return end.column - begin.column;
- ByteCount res = m_lines[begin.line].length() - begin.column;
+ ByteCount res = lines[(size_t)begin.line]->length - begin.column;
for (LineCount l = begin.line+1; l < end.line; ++l)
- res += m_lines[l].length();
+ res += lines[(size_t)l]->length;
res += end.column;
return res;
}
@@ -99,18 +99,21 @@ inline BufferCoord Buffer::end_coord() const
}
inline BufferIterator::BufferIterator(const Buffer& buffer, BufferCoord coord) noexcept
- : m_buffer{&buffer}, m_lines{buffer.m_lines}, m_coord{coord},
- m_line{coord.line < buffer.line_count() ? (*m_buffer)[coord.line] : StringView{}} {}
+ : BufferIterator{buffer.m_lines, coord} {}
+
+inline BufferIterator::BufferIterator(ArrayView<const StringDataPtr> lines, BufferCoord coord) noexcept
+ : m_lines{lines}, m_coord{coord},
+ m_line{(size_t)coord.line < m_lines.size() ? m_lines[(size_t)coord.line]->strview() : StringView{}} {}
inline bool BufferIterator::operator==(const BufferIterator& iterator) const noexcept
{
- kak_assert(m_buffer == iterator.m_buffer);
+ kak_assert(m_lines.pointer() == iterator.m_lines.pointer());
return m_coord == iterator.m_coord;
}
inline auto BufferIterator::operator<=>(const BufferIterator& iterator) const noexcept
{
- kak_assert(m_buffer == iterator.m_buffer);
+ kak_assert(m_lines.pointer() == iterator.m_lines.pointer());
return (m_coord <=> iterator.m_coord);
}
@@ -127,37 +130,38 @@ inline const char& BufferIterator::operator*() const noexcept
inline const char& BufferIterator::operator[](size_t n) const noexcept
{
- return m_buffer->byte_at(m_buffer->advance(m_coord, n));
+ auto coord = Buffer::advance(m_lines, m_coord, n);
+ return m_lines[(size_t)coord.line]->strview()[coord.column];
}
inline size_t BufferIterator::operator-(const BufferIterator& iterator) const
{
- kak_assert(m_buffer == iterator.m_buffer);
- return (size_t)m_buffer->distance(iterator.m_coord, m_coord);
+ kak_assert(m_lines.pointer() == iterator.m_lines.pointer());
+ return (size_t)Buffer::distance(m_lines, iterator.m_coord, m_coord);
}
inline BufferIterator BufferIterator::operator+(ByteCount size) const
{
- kak_assert(m_buffer);
- return { *m_buffer, m_buffer->advance(m_coord, size) };
+ kak_assert(*this);
+ return { m_lines, Buffer::advance(m_lines, m_coord, size) };
}
inline BufferIterator BufferIterator::operator-(ByteCount size) const
{
- return { *m_buffer, m_buffer->advance(m_coord, -size) };
+ return { m_lines, Buffer::advance(m_lines, m_coord, -size) };
}
inline BufferIterator& BufferIterator::operator+=(ByteCount size)
{
- m_coord = m_buffer->advance(m_coord, size);
- m_line = (*m_buffer)[m_coord.line];
+ m_coord = Buffer::advance(m_lines, m_coord, size);
+ m_line = m_lines[(size_t)m_coord.line]->strview();
return *this;
}
inline BufferIterator& BufferIterator::operator-=(ByteCount size)
{
- m_coord = m_buffer->advance(m_coord, -size);
- m_line = (*m_buffer)[m_coord.line];
+ m_coord = Buffer::advance(m_lines, m_coord, -size);
+ m_line = m_lines[(size_t)m_coord.line]->strview();
return *this;
}