From 976505222683234b11505191394f9e046c7cfbdd Mon Sep 17 00:00:00 2001 From: Tobias Warneke Date: Thu, 8 Jul 2021 22:42:53 +0200 Subject: [PATCH] first implementation of meyers diff with linear space --- .../com/github/difflib/algorithm/Change.java | 8 ++++++++ .../myers/MeyersDiffWithLinearSpace.java | 17 ++++++++++++++--- .../WithMeyersDiffWithLinearSpacePatchTest.java | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/java-diff-utils/src/main/java/com/github/difflib/algorithm/Change.java b/java-diff-utils/src/main/java/com/github/difflib/algorithm/Change.java index 57fbb78..9b6f1df 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/algorithm/Change.java +++ b/java-diff-utils/src/main/java/com/github/difflib/algorithm/Change.java @@ -36,4 +36,12 @@ public class Change { this.startRevised = startRevised; this.endRevised = endRevised; } + + public Change withEndOriginal(int endOriginal) { + return new Change(deltaType, startOriginal, endOriginal, startRevised, endRevised); + } + + public Change withEndRevised(int endRevised) { + return new Change(deltaType, startOriginal, endOriginal, startRevised, endRevised); + } } diff --git a/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MeyersDiffWithLinearSpace.java b/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MeyersDiffWithLinearSpace.java index 1dcae64..98a49dc 100644 --- a/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MeyersDiffWithLinearSpace.java +++ b/java-diff-utils/src/main/java/com/github/difflib/algorithm/myers/MeyersDiffWithLinearSpace.java @@ -65,11 +65,22 @@ public class MeyersDiffWithLinearSpace implements DiffAlgorithmI { //TODO: compress these commands. if (end1 - start1 > end2 - start2) { //script.append(new DeleteCommand<>(left.charAt(i))); - data.script.add(new Change(DeltaType.DELETE, i, i + 1, j, j)); + if (data.script.isEmpty() + || data.script.get(data.script.size() - 1).endOriginal != i + || data.script.get(data.script.size() - 1).deltaType != DeltaType.DELETE) { + data.script.add(new Change(DeltaType.DELETE, i, i + 1, j, j)); + } else { + data.script.set(data.script.size() - 1, data.script.get(data.script.size() - 1).withEndOriginal(i + 1)); + } ++i; } else { - //script.append(new InsertCommand<>(right.charAt(j))); - data.script.add(new Change(DeltaType.INSERT, i, i, j, j + 1)); + if (data.script.isEmpty() + || data.script.get(data.script.size() - 1).endRevised != j + || data.script.get(data.script.size() - 1).deltaType != DeltaType.INSERT) { + data.script.add(new Change(DeltaType.INSERT, i, i, j, j + 1)); + } else { + data.script.set(data.script.size() - 1, data.script.get(data.script.size() - 1).withEndRevised(j + 1)); + } ++j; } } diff --git a/java-diff-utils/src/test/java/com/github/difflib/algorithm/myers/WithMeyersDiffWithLinearSpacePatchTest.java b/java-diff-utils/src/test/java/com/github/difflib/algorithm/myers/WithMeyersDiffWithLinearSpacePatchTest.java index 2b06001..d2a02ca 100644 --- a/java-diff-utils/src/test/java/com/github/difflib/algorithm/myers/WithMeyersDiffWithLinearSpacePatchTest.java +++ b/java-diff-utils/src/test/java/com/github/difflib/algorithm/myers/WithMeyersDiffWithLinearSpacePatchTest.java @@ -93,7 +93,7 @@ public class WithMeyersDiffWithLinearSpacePatchTest { try { List data = DiffUtils.patch(changeTest_from, patch); - assertEquals(9, data.size()); + assertEquals(11, data.size()); assertEquals(Arrays.asList("aaa", "<<<<<< HEAD", "bbb", "CDC", "======", "bbb", "ccc", ">>>>>>> PATCH", "ddd"), data);