summaryrefslogtreecommitdiff
path: root/src/diff.hh
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-07-17 18:32:38 +0900
committerMaxime Coste <mawww@kakoune.org>2017-07-17 19:28:52 +0900
commit388ada81423a786e017293a9b0e21733a0e52196 (patch)
treeda8511f5fd1994a8b0885d30ce3beebd736b55bd /src/diff.hh
parentda9794e272edbceda7dcc268f1a9c44ce97f73b1 (diff)
Remove MirroredArray for diff implementation
We can index native arrays negatively, so just setup V1 and V2 to point in the middle of the work arrays and remove the need for creating MirroredArray.
Diffstat (limited to 'src/diff.hh')
-rw-r--r--src/diff.hh38
1 files changed, 9 insertions, 29 deletions
diff --git a/src/diff.hh b/src/diff.hh
index c8063b1d..3535dadc 100644
--- a/src/diff.hh
+++ b/src/diff.hh
@@ -14,29 +14,11 @@
namespace Kakoune
{
-template<typename T>
-struct MirroredArray : public ArrayView<T>
-{
- MirroredArray(ArrayView<T> data, int size)
- : ArrayView<T>(data), size(size)
- {
- kak_assert(2 * size + 1 <= data.size());
- (*this)[1] = 0;
- }
-
- [[gnu::always_inline]]
- T& operator[](int n) { return ArrayView<T>::operator[](n + size); }
- [[gnu::always_inline]]
- const T& operator[](int n) const { return ArrayView<T>::operator[](n + size); }
-private:
- int size;
-};
-
struct Snake{ int x, y, u, v; bool add; };
template<typename Iterator, typename Equal>
Snake find_end_snake_of_further_reaching_dpath(Iterator a, int N, Iterator b, int M,
- const MirroredArray<int>& V,
+ const int* V,
const int D, const int k, Equal eq)
{
const bool add = k == -D or (k != D and V[k-1] < V[k+1]);
@@ -64,12 +46,11 @@ struct SnakeLen : Snake
template<typename Iterator, typename Equal>
SnakeLen find_middle_snake(Iterator a, int N, Iterator b, int M,
- ArrayView<int> data1, ArrayView<int> data2,
- Equal eq)
+ int* V1, int* V2, Equal eq)
{
const int delta = N - M;
- MirroredArray<int> V1{data1, N + M};
- MirroredArray<int> V2{data2, N + M};
+ V1[1] = 0;
+ V2[1] = 0;
std::reverse_iterator<Iterator> ra{a + N}, rb{b + M};
@@ -126,25 +107,24 @@ inline void append_diff(Vector<Diff>& diffs, Diff diff)
template<typename Iterator, typename Equal>
void find_diff_rec(Iterator a, int offA, int lenA,
Iterator b, int offB, int lenB,
- ArrayView<int> data1, ArrayView<int> data2,
- Equal eq, Vector<Diff>& diffs)
+ int* V1, int* V2, Equal eq, Vector<Diff>& diffs)
{
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, V1, V2, eq);
kak_assert(middle_snake.u <= lenA and middle_snake.v <= lenB);
if (middle_snake.d > 1)
{
find_diff_rec(a, offA, middle_snake.x,
b, offB, middle_snake.y,
- data1, data2, eq, diffs);
+ V1, V2, eq, diffs);
if (int len = middle_snake.u - middle_snake.x)
append_diff(diffs, {Diff::Keep, len, 0});
find_diff_rec(a, offA + middle_snake.u, lenA - middle_snake.u,
b, offB + middle_snake.v, lenB - middle_snake.v,
- data1, data2, eq, diffs);
+ V1, V2, eq, diffs);
}
else
{
@@ -176,7 +156,7 @@ Vector<Diff> find_diff(Iterator a, int N, Iterator b, int M, Equal eq = Equal{})
Vector<int> data(2*max);
Vector<Diff> diffs;
find_diff_rec(a, 0, N, b, 0, M,
- {data.data(), (size_t)max}, {data.data() + max, (size_t)max},
+ data.data() + (N+M), data.data() + max + (N+M),
eq, diffs);
return diffs;