Optimization and code cleanup in the region highlighter.

This commit is contained in:
Maxime Coste 2014-01-13 20:11:05 +00:00
parent 219f4c9c19
commit 86eaa64982

View File

@ -550,6 +550,18 @@ private:
}; };
using MatchList = std::vector<Match>; using MatchList = std::vector<Match>;
static bool compare_matches_end(const Match& lhs, const Match& rhs)
{
return (lhs.line != rhs.line) ? lhs.line < rhs.line
: lhs.end < rhs.end;
}
static bool compare_matches_begin(const Match& lhs, const Match& rhs)
{
return (lhs.line != rhs.line) ? lhs.line < rhs.line
: lhs.begin < rhs.begin;
}
struct LineChange struct LineChange
{ {
LineCount pos; LineCount pos;
@ -587,43 +599,31 @@ private:
if (cache.timestamp == buf_timestamp) if (cache.timestamp == buf_timestamp)
return cache.regions; return cache.regions;
{ std::sort(cache.changes.begin(), cache.changes.end(),
std::sort(cache.changes.begin(), cache.changes.end(), [](const LineChange& lhs, const LineChange& rhs)
[](const LineChange& lhs, const LineChange& rhs) { { return lhs.pos < rhs.pos; });
return lhs.pos < rhs.pos; for (size_t i = 1; i < cache.changes.size(); ++i)
}); cache.changes[i].num += cache.changes[i-1].num;
for (size_t i = 1; i < cache.changes.size(); ++i) update_matches(buffer, cache, cache.begin_matches, m_begin);
cache.changes[i].num += cache.changes[i-1].num; update_matches(buffer, cache, cache.end_matches, m_end);
cache.changes.clear();
update_matches(buffer, cache, cache.begin_matches, m_begin);
update_matches(buffer, cache, cache.end_matches, m_end);
cache.changes.clear();
}
cache.regions.clear(); cache.regions.clear();
for (auto beg_it = cache.begin_matches.begin(), end_it = cache.end_matches.begin(); for (auto beg_it = cache.begin_matches.begin(), end_it = cache.end_matches.begin();
beg_it != cache.begin_matches.end(); ) beg_it != cache.begin_matches.end(); )
{ {
auto compare_matches = [&](const Match& lhs, const Match& rhs) {
if (lhs.line != rhs.line)
return lhs.line < rhs.line;
return lhs.end < rhs.end;
};
end_it = std::upper_bound(end_it, cache.end_matches.end(), end_it = std::upper_bound(end_it, cache.end_matches.end(),
*beg_it, compare_matches); *beg_it, compare_matches_end);
if (end_it == cache.end_matches.end()) if (end_it == cache.end_matches.end())
{ {
cache.regions.push_back({{beg_it->line, beg_it->begin}, buffer.end_coord()}); cache.regions.push_back({ {beg_it->line, beg_it->begin},
buffer.end_coord() });
break; break;
} }
else cache.regions.push_back({ {beg_it->line, beg_it->begin},
{ {end_it->line, end_it->end} });
cache.regions.push_back({{beg_it->line, beg_it->begin}, beg_it = std::upper_bound(beg_it, cache.begin_matches.end(),
{end_it->line, end_it->end}}); *end_it, compare_matches_end);
beg_it = std::upper_bound(beg_it, cache.begin_matches.end(),
*end_it, compare_matches);
}
} }
cache.timestamp = buffer.timestamp(); cache.timestamp = buffer.timestamp();
return cache.regions; return cache.regions;
@ -636,20 +636,24 @@ private:
for (auto it = matches.begin(); it != matches.end();) for (auto it = matches.begin(); it != matches.end();)
{ {
auto change_it = std::lower_bound(cache.changes.begin(), cache.changes.end(), it->line, auto change_it = std::lower_bound(cache.changes.begin(), cache.changes.end(), it->line,
[](const LineChange& c, const LineCount& l) { [](const LineChange& c, const LineCount& l)
return c.pos < l; }); { return c.pos < l; });
if (change_it != cache.changes.begin()) if (change_it != cache.changes.begin())
{ {
it->line += (change_it-1)->num; it->line += (change_it-1)->num;
if (it->line <= (change_it-1)->pos) if (it->line <= (change_it-1)->pos)
{ {
it = matches.erase(it); std::swap(*it, matches.back());
matches.pop_back();
continue; continue;
} }
} }
if (it->line >= buffer.line_count() or if (it->line >= buffer.line_count() or
it->timestamp < buffer.line_timestamp(it->line)) it->timestamp < buffer.line_timestamp(it->line))
it = matches.erase(it); {
std::swap(*it, matches.back());
matches.pop_back();
}
else else
{ {
it->timestamp = buf_timestamp; it->timestamp = buf_timestamp;
@ -659,7 +663,7 @@ private:
} }
} }
// try to find new matches in each updated lines // try to find new matches in each updated lines
for (auto line = 0_line; line < buffer.line_count(); ++line) for (auto line = 0_line, end = buffer.line_count(); line < end; ++line)
{ {
if (buffer.line_timestamp(line) > cache.timestamp) if (buffer.line_timestamp(line) > cache.timestamp)
{ {
@ -672,12 +676,7 @@ private:
} }
} }
} }
std::sort(matches.begin(), matches.end(), std::sort(matches.begin(), matches.end(), compare_matches_begin);
[](const Match& lhs, const Match& rhs) {
if (lhs.line != rhs.line)
return lhs.line < rhs.line;
return lhs.begin < rhs.begin;
});
} }
}; };