From b7b036c210aba03c5dc1851b9de5fe9b3351dcd8 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sun, 20 Nov 2022 16:59:08 +1100 Subject: [PATCH] Change BufferIterator comparison to assert same buffer Comparing iterators between buffers should never happen, and the only place we did was with default constructed BufferIterator which we replace by casting the iterator to bool. This should improve performance on iterator heavy code. --- src/buffer.hh | 2 ++ src/buffer.inl.hh | 3 ++- src/regex.hh | 2 +- src/selectors.cc | 8 ++++---- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/src/buffer.hh b/src/buffer.hh index ce336e96..71c5cd51 100644 --- a/src/buffer.hh +++ b/src/buffer.hh @@ -75,6 +75,8 @@ public: const char& operator[](size_t n) const noexcept; size_t operator- (const BufferIterator& iterator) const; + explicit operator bool() const { return static_cast(m_buffer); } + BufferIterator operator+ (ByteCount size) const; BufferIterator operator- (ByteCount size) const; diff --git a/src/buffer.inl.hh b/src/buffer.inl.hh index 4f264c0d..4f6866bf 100644 --- a/src/buffer.inl.hh +++ b/src/buffer.inl.hh @@ -104,7 +104,8 @@ inline BufferIterator::BufferIterator(const Buffer& buffer, BufferCoord coord) n inline bool BufferIterator::operator==(const BufferIterator& iterator) const noexcept { - 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 std::strong_ordering BufferIterator::operator<=>(const BufferIterator& iterator) const noexcept diff --git a/src/regex.hh b/src/regex.hh index 5b0ab7fc..07a58959 100644 --- a/src/regex.hh +++ b/src/regex.hh @@ -39,7 +39,7 @@ struct MatchResults { SubMatch() = default; SubMatch(Iterator begin, Iterator end) - : std::pair{begin, end}, matched{begin != Iterator{}} + : std::pair{begin, end}, matched{static_cast(begin)} {} bool matched = false; diff --git a/src/selectors.cc b/src/selectors.cc index b4e57e36..3d9b453d 100644 --- a/src/selectors.cc +++ b/src/selectors.cc @@ -483,7 +483,7 @@ select_sentence(const Context& context, const Selection& selection, BufferIterator first = buffer.iterator_at(selection.cursor()); BufferIterator last; - for (++count; count > 0; --count) + for (int i = 0; i <= count; ++i) { if (not (flags & ObjectFlags::ToEnd) and first != buffer.begin()) { @@ -494,7 +494,7 @@ select_sentence(const Context& context, const Selection& selection, first = prev_non_blank; } - if (last == BufferIterator{}) + if (i == 0) last = first; if (flags & ObjectFlags::ToBegin) @@ -552,7 +552,7 @@ select_paragraph(const Context& context, const Selection& selection, BufferIterator first = buffer.iterator_at(selection.cursor()); BufferIterator last; - for (++count; count > 0; --count) + for (int i = 0; i <= count; ++i) { if (not (flags & ObjectFlags::ToEnd) and first.coord() > BufferCoord{0,1} and is_eol(*(first-1)) and first-1 != buffer.begin() and is_eol(*(first-2))) @@ -561,7 +561,7 @@ select_paragraph(const Context& context, const Selection& selection, first != buffer.begin() and (first+1) != buffer.end() and is_eol(*(first-1)) and is_eol(*first)) ++first; - if (last == BufferIterator{}) + if (i == 0) last = first; if ((flags & ObjectFlags::ToBegin) and first != buffer.begin())