Optimization and code cleanup in the region highlighter.
This commit is contained in:
parent
219f4c9c19
commit
86eaa64982
|
@ -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)
|
for (size_t i = 1; i < cache.changes.size(); ++i)
|
||||||
cache.changes[i].num += cache.changes[i-1].num;
|
cache.changes[i].num += cache.changes[i-1].num;
|
||||||
|
|
||||||
update_matches(buffer, cache, cache.begin_matches, m_begin);
|
update_matches(buffer, cache, cache.begin_matches, m_begin);
|
||||||
update_matches(buffer, cache, cache.end_matches, m_end);
|
update_matches(buffer, cache, cache.end_matches, m_end);
|
||||||
|
|
||||||
cache.changes.clear();
|
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},
|
|
||||||
{end_it->line, end_it->end}});
|
|
||||||
beg_it = std::upper_bound(beg_it, cache.begin_matches.end(),
|
beg_it = std::upper_bound(beg_it, cache.begin_matches.end(),
|
||||||
*end_it, compare_matches);
|
*end_it, compare_matches_end);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
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;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user