summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2015-02-01 22:33:59 +0000
committerMaxime Coste <frrrwww@gmail.com>2015-02-01 22:33:59 +0000
commitd3bccfeb941fb5e8a26034b5599edd8f5814ab47 (patch)
treeb269f16354e54737c1998085b4b1afbe8d7bf49b /src
parent0b4ecef2d2cbef9f22d5fac5f50bbab96b9f9256 (diff)
Fixes in line_modification change, along with style tweak
Diffstat (limited to 'src')
-rw-r--r--src/line_modification.cc45
1 files changed, 26 insertions, 19 deletions
diff --git a/src/line_modification.cc b/src/line_modification.cc
index 1943350f..4e24e9c8 100644
--- a/src/line_modification.cc
+++ b/src/line_modification.cc
@@ -7,31 +7,29 @@ namespace Kakoune
static LineModification make_line_modif(const Buffer::Change& change)
{
- LineModification res = {};
- res.old_line = change.begin.line;
- res.new_line = change.begin.line;
+ LineCount num_added = 0, num_removed = 0;
if (change.type == Buffer::Change::Insert)
{
- res.num_added = change.end.line - change.begin.line;
+ num_added = change.end.line - change.begin.line;
// inserted a new line at buffer end but end coord is on same line
if (change.at_end and change.end.column != 0)
- ++res.num_added;
+ ++num_added;
}
else
{
- res.num_removed = change.end.line - change.begin.line;
+ num_removed = change.end.line - change.begin.line;
// removed last line, but end coord is on same line
if (change.at_end and change.end.column != 0)
- ++res.num_removed;
+ ++num_removed;
}
// modified a line
if (not change.at_end and
(change.begin.column != 0 or change.end.column != 0))
{
- ++res.num_removed;
- ++res.num_added;
+ ++num_removed;
+ ++num_added;
}
- return res;
+ return { change.begin.line, change.begin.line, num_removed, num_added };
}
Vector<LineModification> compute_line_modifications(const Buffer& buffer, size_t timestamp)
@@ -51,7 +49,10 @@ Vector<LineModification> compute_line_modifications(const Buffer& buffer, size_t
if (change.new_line <= prev.new_line + prev.num_added)
{
--pos;
- LineCount removed_from_previously_added_by_pos = clamp(pos->new_line + pos->num_added - change.new_line, 0_line, std::min(pos->num_added, change.num_removed));
+ const LineCount removed_from_previously_added_by_pos =
+ clamp(pos->new_line + pos->num_added - change.new_line,
+ 0_line, std::min(pos->num_added, change.num_removed));
+
pos->num_removed += change.num_removed - removed_from_previously_added_by_pos;
pos->num_added += change.num_added - removed_from_previously_added_by_pos;
}
@@ -64,8 +65,8 @@ Vector<LineModification> compute_line_modifications(const Buffer& buffer, size_t
else
pos = res.insert(pos, change);
- auto& modif = *pos;
auto next = pos + 1;
+ auto diff = buf_change.end.line - buf_change.begin.line;
if (buf_change.type == Buffer::Change::Erase)
{
auto delend = std::upper_bound(next, res.end(), change.new_line + change.num_removed,
@@ -74,16 +75,22 @@ Vector<LineModification> compute_line_modifications(const Buffer& buffer, size_t
for (auto it = next; it != delend; ++it)
{
- LineCount removed_from_previously_added_by_it = std::min(it->num_added, change.new_line + change.num_removed - it->new_line);
- modif.num_removed += it->num_removed - removed_from_previously_added_by_it;
- modif.num_added += it->num_added - removed_from_previously_added_by_it;
+ const LineCount removed_from_previously_added_by_it =
+ std::min(it->num_added, change.new_line + change.num_removed - it->new_line);
+
+ pos->num_removed += it->num_removed - removed_from_previously_added_by_it;
+ pos->num_added += it->num_added - removed_from_previously_added_by_it;
}
next = res.erase(next, delend);
- }
- auto diff = buf_change.end.line - buf_change.begin.line;
- for (auto it = next; it != res.end(); ++it)
- it->new_line += diff;
+ for (auto it = next; it != res.end(); ++it)
+ it->new_line -= diff;
+ }
+ else
+ {
+ for (auto it = next; it != res.end(); ++it)
+ it->new_line += diff;
+ }
}
return res;
}