diff options
| author | Maxime Coste <mawww@kakoune.org> | 2022-11-20 16:59:08 +1100 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2022-11-20 16:59:08 +1100 |
| commit | b7b036c210aba03c5dc1851b9de5fe9b3351dcd8 (patch) | |
| tree | dd86ca3e519c1c875868353afc872f0e03da2cdd /src | |
| parent | 91d45a100a39345f06d9789ded9172fe60887c27 (diff) | |
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.
Diffstat (limited to 'src')
| -rw-r--r-- | src/buffer.hh | 2 | ||||
| -rw-r--r-- | src/buffer.inl.hh | 3 | ||||
| -rw-r--r-- | src/regex.hh | 2 | ||||
| -rw-r--r-- | 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<bool>(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<Iterator, Iterator>{begin, end}, matched{begin != Iterator{}} + : std::pair<Iterator, Iterator>{begin, end}, matched{static_cast<bool>(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()) |
