summaryrefslogtreecommitdiff
path: root/src/modification.hh
diff options
context:
space:
mode:
Diffstat (limited to 'src/modification.hh')
-rw-r--r--src/modification.hh88
1 files changed, 88 insertions, 0 deletions
diff --git a/src/modification.hh b/src/modification.hh
new file mode 100644
index 00000000..103a7520
--- /dev/null
+++ b/src/modification.hh
@@ -0,0 +1,88 @@
+#ifndef modification_hh_INCLUDED
+#define modification_hh_INCLUDED
+
+#include "coord.hh"
+#include "utils.hh"
+#include "buffer.hh"
+
+namespace Kakoune
+{
+
+struct Modification
+{
+ ByteCoord old_coord;
+ ByteCoord new_coord;
+ ByteCoord num_removed;
+ ByteCoord num_added;
+
+ ByteCoord added_end() const
+ {
+ if (num_added.line)
+ return { new_coord.line + num_added.line, num_added.column };
+ else
+ return { new_coord.line, new_coord.column + num_added.column };
+ }
+
+ ByteCoord get_old_coord(ByteCoord coord) const
+ {
+ if (coord.line == new_coord.line)
+ {
+ if (num_added.line == 0)
+ coord.column -= new_coord.column - old_coord.column + num_added.column - num_removed.column;
+ else
+ coord.column -= num_added.column - num_removed.column;
+ }
+ coord.line -= new_coord.line - old_coord.line + num_added.line - num_removed.line;
+ return coord;
+ }
+
+ ByteCoord get_new_coord(ByteCoord coord, bool& deleted) const
+ {
+ deleted = false;
+ if (coord < old_coord)
+ return coord;
+
+ // apply remove
+ if (coord.line < old_coord.line + num_removed.line or
+ (coord.line == old_coord.line + num_removed.line and
+ coord.column < old_coord.column + num_removed.column))
+ {
+ deleted = true;
+ coord = old_coord;
+ }
+ else if (coord.line == old_coord.line + num_removed.line)
+ {
+ coord.line = old_coord.line;
+ coord.column -= num_removed.column;
+ }
+
+ // apply move
+ coord.line += new_coord.line - old_coord.line;
+ coord.column += new_coord.column - old_coord.column;
+
+ // apply add
+ if (coord.line == new_coord.line)
+ {
+ if (num_added.line == 0)
+ coord.column += num_added.column;
+ else
+ coord.column += num_added.column - new_coord.column;
+ }
+ coord.line += num_added.line;
+
+ return coord;
+ }
+
+ ByteCoord get_new_coord(ByteCoord coord) const
+ {
+ bool dummy;
+ return get_new_coord(coord, dummy);
+ }
+};
+
+std::vector<Modification> compute_modifications(const Buffer& buffer, size_t timestamp);
+std::vector<Modification> compute_modifications(memoryview<Buffer::Change> changes);
+
+}
+
+#endif // modification_hh_INCLUDED