diff options
| author | Maxime Coste <mawww@kakoune.org> | 2023-06-09 16:38:14 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2023-06-09 16:38:14 +1000 |
| commit | e0728d3434d5ea335521484521d246473ca06165 (patch) | |
| tree | cf343c50b25f2fc62bcceeba96ace5ac17fccf80 /src/display_buffer.cc | |
| parent | 5a31d331b979f865e1ab1a637bcde9451866ff9f (diff) | |
Speed up regions highlighting on files with big lines
Range atoms should always appear in order, so we can iterate a single
time through the display lines and display atoms while applying
hightlighters to regions
Diffstat (limited to 'src/display_buffer.cc')
| -rw-r--r-- | src/display_buffer.cc | 32 |
1 files changed, 22 insertions, 10 deletions
diff --git a/src/display_buffer.cc b/src/display_buffer.cc index d88d02fe..92837c6a 100644 --- a/src/display_buffer.cc +++ b/src/display_buffer.cc @@ -165,9 +165,7 @@ DisplayLine::iterator DisplayLine::insert(iterator it, DisplayAtom atom) m_range.begin = std::min(m_range.begin, atom.begin()); m_range.end = std::max(m_range.end, atom.end()); } - auto res = m_atoms.insert(it, std::move(atom)); - compute_range(); - return res; + return m_atoms.insert(it, std::move(atom)); } DisplayAtom& DisplayLine::push_back(DisplayAtom atom) @@ -181,6 +179,19 @@ DisplayAtom& DisplayLine::push_back(DisplayAtom atom) return m_atoms.back(); } +DisplayLine DisplayLine::extract(iterator beg, iterator end) +{ + if (beg == this->begin() and end == this->end()) + return DisplayLine{std::move(*this)}; + + DisplayLine extracted{AtomList(std::move_iterator(beg), std::move_iterator(end))}; + m_atoms.erase(beg, end); + if (extracted.m_range.begin == m_range.begin or + extracted.m_range.end == m_range.end) + compute_range(); + return extracted; +} + DisplayLine::iterator DisplayLine::erase(iterator beg, iterator end) { auto res = m_atoms.erase(beg, end); @@ -281,15 +292,16 @@ const BufferRange init_range{ {INT_MAX, INT_MAX}, {INT_MIN, INT_MIN} }; void DisplayLine::compute_range() { m_range = init_range; - for (auto& atom : m_atoms) + auto first = find_if(m_atoms, std::mem_fn(&DisplayAtom::has_buffer_range)); + if (first == m_atoms.end()) + m_range = { { 0, 0 }, { 0, 0 } }; + else { - if (not atom.has_buffer_range()) - continue; - m_range.begin = std::min(m_range.begin, atom.begin()); - m_range.end = std::max(m_range.end, atom.end()); + auto last = std::find_if(m_atoms.rbegin(), std::reverse_iterator(first+1), std::mem_fn(&DisplayAtom::has_buffer_range)); + m_range.begin = first->begin(); + m_range.end = last->end(); } - if (m_range == init_range) - m_range = { { 0, 0 }, { 0, 0 } }; + kak_assert(m_range.begin <= m_range.end); } |
