optimize SelectionHighlighters, stop copying Selections

This commit is contained in:
Maxime Coste 2012-01-25 18:51:47 +00:00
parent d1c29d2b78
commit c837336474

View File

@ -193,63 +193,69 @@ public:
void operator()(DisplayBuffer& display_buffer) void operator()(DisplayBuffer& display_buffer)
{ {
SelectionList sorted_selections = m_window.selections(); typedef std::pair<BufferIterator, BufferIterator> BufferRange;
std::sort(sorted_selections.begin(), sorted_selections.end(), std::vector<BufferRange> selections;
[](const Selection& lhs, const Selection& rhs) { return lhs.begin() < rhs.begin(); }); for (auto& sel : m_window.selections())
selections.push_back(BufferRange(sel.begin(), sel.end()));
std::sort(selections.begin(), selections.end(),
[](const BufferRange& lhs, const BufferRange& rhs)
{ return lhs.first < rhs.first; });
auto atom_it = display_buffer.begin(); auto atom_it = display_buffer.begin();
auto sel_it = sorted_selections.begin(); auto sel_it = selections.begin();
while (atom_it != display_buffer.end() while (atom_it != display_buffer.end()
and sel_it != sorted_selections.end()) and sel_it != selections.end())
{ {
Selection& sel = *sel_it; BufferRange& sel = *sel_it;
DisplayAtom& atom = *atom_it; DisplayAtom& atom = *atom_it;
// [###------] // [###------]
if (atom.begin() >= sel.begin() and atom.begin() < sel.end() and atom.end() > sel.end()) if (atom.begin() >= sel.first and atom.begin() < sel.second and
atom.end() > sel.second)
{ {
atom_it = display_buffer.split(atom_it, sel.end()); atom_it = display_buffer.split(atom_it, sel.second);
atom_it->attribute() |= Attributes::Underline; atom_it->attribute() |= Attributes::Underline;
++atom_it; ++atom_it;
++sel_it; ++sel_it;
} }
// [---###---] // [---###---]
else if (atom.begin() < sel.begin() and atom.end() > sel.end()) else if (atom.begin() < sel.first and atom.end() > sel.second)
{ {
atom_it = display_buffer.split(atom_it, sel.begin()); atom_it = display_buffer.split(atom_it, sel.first);
atom_it = display_buffer.split(++atom_it, sel.end()); atom_it = display_buffer.split(++atom_it, sel.second);
atom_it->attribute() |= Attributes::Underline; atom_it->attribute() |= Attributes::Underline;
++atom_it; ++atom_it;
++sel_it; ++sel_it;
} }
// [------###] // [------###]
else if (atom.begin() < sel.begin() and atom.end() > sel.begin()) else if (atom.begin() < sel.first and atom.end() > sel.first)
{ {
atom_it = ++display_buffer.split(atom_it, sel.begin()); atom_it = ++display_buffer.split(atom_it, sel.first);
atom_it->attribute() |= Attributes::Underline; atom_it->attribute() |= Attributes::Underline;
++atom_it; ++atom_it;
} }
// [#########] // [#########]
else if (atom.begin() >= sel.begin() and atom.end() <= sel.end()) else if (atom.begin() >= sel.first and atom.end() <= sel.second)
{ {
atom_it->attribute() |= Attributes::Underline; atom_it->attribute() |= Attributes::Underline;
++atom_it; ++atom_it;
} }
// [---------] // [---------]
else if (atom.begin() >= sel.end()) else if (atom.begin() >= sel.second)
++sel_it; ++sel_it;
// [---------] // [---------]
else if (atom.end() <= sel.begin()) else if (atom.end() <= sel.first)
++atom_it; ++atom_it;
else else
assert(false); assert(false);
} }
boost::regex ex("\n"); boost::regex ex("\n");
for (auto& sel : sorted_selections) for (auto& sel : selections)
colorize_regex_range(display_buffer, sel.begin(), sel.end(), colorize_regex_range(display_buffer, sel.first, sel.second,
ex, Color::Default, Color::Yellow); ex, Color::Default, Color::Yellow);
} }