summaryrefslogtreecommitdiff
path: root/src/changes.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2020-04-06 11:13:24 +1000
committerMaxime Coste <mawww@kakoune.org>2020-04-06 11:23:47 +1000
commitf7a2ecfacb566a219d9deef3a5cfaa2d1c5bd404 (patch)
treeeb044d77d2c31c40b4b99767b22bca9e505f44ba /src/changes.hh
parentc585107ab5e7155f7da648c3752cf360f7156177 (diff)
Support empty ranges in replace-ranges highlighter
Diffstat (limited to 'src/changes.hh')
-rw-r--r--src/changes.hh35
1 files changed, 17 insertions, 18 deletions
diff --git a/src/changes.hh b/src/changes.hh
index 5b64cbec..5ebb3ded 100644
--- a/src/changes.hh
+++ b/src/changes.hh
@@ -28,6 +28,21 @@ struct ForwardChangesTracker
const Buffer::Change* forward_sorted_until(const Buffer::Change* first, const Buffer::Change* last);
const Buffer::Change* backward_sorted_until(const Buffer::Change* first, const Buffer::Change* last);
+template<typename Range, typename AdvanceFunc>
+auto update_range(ForwardChangesTracker& changes_tracker, Range& range, AdvanceFunc&& advance_while_relevant)
+{
+ auto& first = get_first(range);
+ auto& last = get_last(range);
+ advance_while_relevant(first);
+ first = changes_tracker.get_new_coord_tolerant(first);
+
+ if (last < BufferCoord{0,0})
+ return;
+
+ advance_while_relevant(last);
+ last = changes_tracker.get_new_coord_tolerant(last);
+}
+
template<typename RangeContainer>
void update_forward(ConstArrayView<Buffer::Change> changes, RangeContainer& ranges)
{
@@ -39,15 +54,7 @@ void update_forward(ConstArrayView<Buffer::Change> changes, RangeContainer& rang
};
for (auto& range : ranges)
- {
- auto& first = get_first(range);
- auto& last = get_last(range);
- advance_while_relevant(first);
- first = changes_tracker.get_new_coord_tolerant(first);
-
- advance_while_relevant(last);
- last = changes_tracker.get_new_coord_tolerant(last);
- }
+ update_range(changes_tracker, range, advance_while_relevant);
}
template<typename RangeContainer>
@@ -69,15 +76,7 @@ void update_backward(ConstArrayView<Buffer::Change> changes, RangeContainer& ran
};
for (auto& range : ranges)
- {
- auto& first = get_first(range);
- auto& last = get_last(range);
- advance_while_relevant(first);
- first = changes_tracker.get_new_coord_tolerant(first);
-
- advance_while_relevant(last);
- last = changes_tracker.get_new_coord_tolerant(last);
- }
+ update_range(changes_tracker, range, advance_while_relevant);
}
template<typename RangeContainer>