Fix bugs in diff implementation
This commit is contained in:
parent
f224d11ccd
commit
cc97d4ba41
|
@ -14,6 +14,8 @@ struct MirroredArray : public ArrayView<T>
|
||||||
: ArrayView<T>(data), size(size)
|
: ArrayView<T>(data), size(size)
|
||||||
{
|
{
|
||||||
kak_assert(2 * size + 1 <= data.size());
|
kak_assert(2 * size + 1 <= data.size());
|
||||||
|
for (int i = -size; i <= size; ++i)
|
||||||
|
(*this)[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
T& operator[](int n) { return ArrayView<T>::operator[](n + size); }
|
T& operator[](int n) { return ArrayView<T>::operator[](n + size); }
|
||||||
|
@ -118,6 +120,7 @@ void find_diff_rec(Iterator a, int offA, int lenA,
|
||||||
if (lenA > 0 and lenB > 0)
|
if (lenA > 0 and lenB > 0)
|
||||||
{
|
{
|
||||||
auto middle_snake = find_middle_snake(a + offA, lenA, b + offB, lenB, data1, data2, eq);
|
auto middle_snake = find_middle_snake(a + offA, lenA, b + offB, lenB, data1, data2, eq);
|
||||||
|
kak_assert(middle_snake.u <= lenA and middle_snake.v <= lenB);
|
||||||
if (middle_snake.d > 1)
|
if (middle_snake.d > 1)
|
||||||
{
|
{
|
||||||
find_diff_rec(a, offA, middle_snake.x,
|
find_diff_rec(a, offA, middle_snake.x,
|
||||||
|
@ -145,6 +148,8 @@ void find_diff_rec(Iterator a, int offA, int lenA,
|
||||||
else
|
else
|
||||||
diffs.push_back({Diff::Remove, 1, 0});
|
diffs.push_back({Diff::Remove, 1, 0});
|
||||||
}
|
}
|
||||||
|
else if (int len = middle_snake.u - middle_snake.x)
|
||||||
|
diffs.push_back({Diff::Keep, len, 0});
|
||||||
}
|
}
|
||||||
else if (lenB > 0)
|
else if (lenB > 0)
|
||||||
diffs.push_back({Diff::Add, lenB, offB});
|
diffs.push_back({Diff::Add, lenB, offB});
|
||||||
|
|
|
@ -242,10 +242,29 @@ void test_line_modifications()
|
||||||
|
|
||||||
void test_diff()
|
void test_diff()
|
||||||
{
|
{
|
||||||
StringView s1 = "mais que fais la police";
|
auto eq = [](const Diff& lhs, const Diff& rhs) {
|
||||||
StringView s2 = "mais ou va la police";
|
return lhs.mode == rhs.mode and lhs.len == rhs.len and lhs.posB == rhs.posB;
|
||||||
|
};
|
||||||
|
|
||||||
auto diff = find_diff(s1.begin(), (int)s1.length(), s2.begin(), (int)s2.length());
|
{
|
||||||
|
StringView s1 = "mais que fais la police";
|
||||||
|
StringView s2 = "mais ou va la police";
|
||||||
|
|
||||||
|
auto diff = find_diff(s1.begin(), (int)s1.length(), s2.begin(), (int)s2.length());
|
||||||
|
kak_assert(diff.size() == 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
StringView s1 = "a?";
|
||||||
|
StringView s2 = "!";
|
||||||
|
|
||||||
|
auto diff = find_diff(s1.begin(), (int)s1.length(), s2.begin(), (int)s2.length());
|
||||||
|
|
||||||
|
kak_assert(diff.size() == 3 and
|
||||||
|
eq(diff[0], {Diff::Remove, 1, 0}) and
|
||||||
|
eq(diff[1], {Diff::Add, 1, 0}) and
|
||||||
|
eq(diff[2], {Diff::Remove, 1, 0}));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void run_unit_tests()
|
void run_unit_tests()
|
||||||
|
|
Loading…
Reference in New Issue
Block a user