summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-01-13 20:11:05 +0000
committerMaxime Coste <frrrwww@gmail.com>2014-01-13 21:40:02 +0000
commit86eaa64982a5aa450e703964773bde32b1d0d596 (patch)
treeac014fff5f5cf81c8b2967b4285d0d7024796ee0 /src
parent219f4c9c19319848868bb152b4e336946dbee052 (diff)
Optimization and code cleanup in the region highlighter.
Diffstat (limited to 'src')
-rw-r--r--src/highlighters.cc75
1 files changed, 37 insertions, 38 deletions
diff --git a/src/highlighters.cc b/src/highlighters.cc
index 57d2bfc0..e7d67db4 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -550,6 +550,18 @@ private:
};
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
{
LineCount pos;
@@ -587,43 +599,31 @@ private:
if (cache.timestamp == buf_timestamp)
return cache.regions;
- {
- std::sort(cache.changes.begin(), cache.changes.end(),
- [](const LineChange& lhs, const LineChange& rhs) {
- return lhs.pos < rhs.pos;
- });
- for (size_t i = 1; i < cache.changes.size(); ++i)
- cache.changes[i].num += cache.changes[i-1].num;
-
- update_matches(buffer, cache, cache.begin_matches, m_begin);
- update_matches(buffer, cache, cache.end_matches, m_end);
-
- cache.changes.clear();
- }
+ std::sort(cache.changes.begin(), cache.changes.end(),
+ [](const LineChange& lhs, const LineChange& rhs)
+ { return lhs.pos < rhs.pos; });
+ for (size_t i = 1; i < cache.changes.size(); ++i)
+ cache.changes[i].num += cache.changes[i-1].num;
+ update_matches(buffer, cache, cache.begin_matches, m_begin);
+ update_matches(buffer, cache, cache.end_matches, m_end);
+ cache.changes.clear();
cache.regions.clear();
for (auto beg_it = cache.begin_matches.begin(), end_it = cache.end_matches.begin();
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(),
- *beg_it, compare_matches);
+ *beg_it, compare_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;
}
- else
- {
- 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(),
- *end_it, compare_matches);
- }
+ 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(),
+ *end_it, compare_matches_end);
}
cache.timestamp = buffer.timestamp();
return cache.regions;
@@ -636,20 +636,24 @@ private:
for (auto it = matches.begin(); it != matches.end();)
{
auto change_it = std::lower_bound(cache.changes.begin(), cache.changes.end(), it->line,
- [](const LineChange& c, const LineCount& l) {
- return c.pos < l; });
+ [](const LineChange& c, const LineCount& l)
+ { return c.pos < l; });
if (change_it != cache.changes.begin())
{
it->line += (change_it-1)->num;
if (it->line <= (change_it-1)->pos)
{
- it = matches.erase(it);
+ std::swap(*it, matches.back());
+ matches.pop_back();
continue;
}
}
if (it->line >= buffer.line_count() or
it->timestamp < buffer.line_timestamp(it->line))
- it = matches.erase(it);
+ {
+ std::swap(*it, matches.back());
+ matches.pop_back();
+ }
else
{
it->timestamp = buf_timestamp;
@@ -659,7 +663,7 @@ private:
}
}
// 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)
{
@@ -672,12 +676,7 @@ private:
}
}
}
- std::sort(matches.begin(), matches.end(),
- [](const Match& lhs, const Match& rhs) {
- if (lhs.line != rhs.line)
- return lhs.line < rhs.line;
- return lhs.begin < rhs.begin;
- });
+ std::sort(matches.begin(), matches.end(), compare_matches_begin);
}
};