summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-05-26 21:01:45 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-05-26 21:02:09 +0100
commitce469398c516420f7ab629006ee02c028e82ebf6 (patch)
tree7cb9f76de05a1aff07f6bf2b026617023cba1e03 /src
parent19a5ed05a65596ec2d9928103c0afe9670d57fb5 (diff)
Revert "Use Modification for region highlighter"
This reverts commit aa64851de622921751741d39092e7cf14fe28649. Conflicts: src/highlighters.cc
Diffstat (limited to 'src')
-rw-r--r--src/highlighters.cc34
1 files changed, 14 insertions, 20 deletions
diff --git a/src/highlighters.cc b/src/highlighters.cc
index f5b4faa2..a51f764e 100644
--- a/src/highlighters.cc
+++ b/src/highlighters.cc
@@ -5,7 +5,7 @@
#include "color_registry.hh"
#include "context.hh"
#include "display_buffer.hh"
-#include "modification.hh"
+#include "line_modification.hh"
#include "option_types.hh"
#include "register_manager.hh"
#include "string.hh"
@@ -721,7 +721,7 @@ private:
}
else
{
- auto modifs = compute_modifications(buffer, cache.timestamp);
+ auto modifs = compute_line_modifications(buffer, cache.timestamp);
update_matches(buffer, modifs, cache.begin_matches, m_begin);
update_matches(buffer, modifs, cache.end_matches, m_end);
}
@@ -762,28 +762,26 @@ private:
}
}
- void update_matches(const Buffer& buffer, memoryview<Modification> modifs, MatchList& matches, const Regex& regex)
+ void update_matches(const Buffer& buffer, memoryview<LineModification> modifs, MatchList& matches, const Regex& regex)
{
const size_t buf_timestamp = buffer.timestamp();
// remove out of date matches and update line for others
auto ins_pos = matches.begin();
for (auto it = ins_pos; it != matches.end(); ++it)
{
- const ByteCoord pos{ it->line, it->begin };
- auto modif_it = std::upper_bound(modifs.begin(), modifs.end(), pos,
- [](const ByteCoord& c, const Modification& m)
- { return c < m.old_coord; });
+ auto modif_it = std::lower_bound(modifs.begin(), modifs.end(), it->line,
+ [](const LineModification& c, const LineCount& l)
+ { return c.old_line < l; });
bool erase = false;
if (modif_it != modifs.begin())
{
auto& prev = *(modif_it-1);
- erase = it->line <= prev.old_coord.line + prev.num_removed.line;
- it->line += prev.new_coord.line - prev.old_coord.line +
- prev.num_added.line - prev.num_removed.line;
+ erase = it->line <= prev.old_line + prev.num_removed;
+ it->line += prev.diff();
}
- if (modif_it != modifs.end() and modif_it->new_coord.line == it->line)
+ if (modif_it != modifs.end() and modif_it->old_line == it->line)
erase = true;
- kak_assert(it->line < buffer.line_count());
+ erase = erase or (it->line >= buffer.line_count());
if (not erase)
{
@@ -802,24 +800,20 @@ private:
size_t pivot = matches.size();
// try to find new matches in each updated lines
- LineCount last_line = -1;
for (auto& modif : modifs)
{
- for (auto line = std::max(last_line + 1, modif.new_coord.line);
- line <= modif.new_coord.line + modif.num_added.line and
- line < buffer.line_count();
- ++line)
+ for (auto line = modif.new_line;
+ line < modif.new_line + modif.num_added+1 and
+ line < buffer.line_count(); ++line)
{
auto& l = buffer[line];
- using RegexIt = boost::regex_iterator<String::const_iterator>;
- for (RegexIt it{l.begin(), l.end(), regex}, end; it != end; ++it)
+ for (boost::regex_iterator<String::const_iterator> it{l.begin(), l.end(), regex}, end{}; it != end; ++it)
{
ByteCount b = (int)((*it)[0].first - l.begin());
ByteCount e = (int)((*it)[0].second - l.begin());
matches.push_back({ buf_timestamp, line, b, e });
}
}
- last_line = modif.new_coord.line + modif.num_added.line;
}
std::inplace_merge(matches.begin(), matches.begin() + pivot, matches.end(),
compare_matches_begin);