diff options
| author | Maxime Coste <mawww@kakoune.org> | 2024-12-03 21:26:57 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2024-12-03 21:30:48 +1100 |
| commit | d29fa04adc6a15c8d62ffcd4390e5fc785d92b62 (patch) | |
| tree | 9fd25a12f2cb5b18332b8f7767e76cb531782882 /src | |
| parent | 6f29950e913a05bfad8baf1f515e36cf15dd2bb2 (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.cc | 12 | ||||
| -rw-r--r-- | src/buffer.hh | 13 | ||||
| -rw-r--r-- | src/buffer.inl.hh | 40 |
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; } |
