summaryrefslogtreecommitdiff
path: root/src/display_buffer.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2023-06-09 16:38:14 +1000
committerMaxime Coste <mawww@kakoune.org>2023-06-09 16:38:14 +1000
commite0728d3434d5ea335521484521d246473ca06165 (patch)
treecf343c50b25f2fc62bcceeba96ace5ac17fccf80 /src/display_buffer.cc
parent5a31d331b979f865e1ab1a637bcde9451866ff9f (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.cc32
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);
}