Remove a macro for myers
This commit is contained in:
parent
fa11404bcb
commit
af43d14243
1 changed files with 56 additions and 48 deletions
|
|
@ -76,62 +76,70 @@ where
|
||||||
let mut g = vec![0; z as usize];
|
let mut g = vec![0; z as usize];
|
||||||
let mut p = vec![0; z as usize];
|
let mut p = vec![0; z as usize];
|
||||||
for h in 0..=(l / 2 + l % 2) {
|
for h in 0..=(l / 2 + l % 2) {
|
||||||
macro_rules! search {
|
for &inverse in &[true, false][..] {
|
||||||
($e: expr, $c: expr, $d: expr) => {
|
let (dollar_c, dollar_d) = if inverse {
|
||||||
let (k0, k1) = {
|
(&mut g, &mut p)
|
||||||
let (m, n) = (m as isize, n as isize);
|
} else {
|
||||||
(-(h - 2*max(0, h - m)), h-2*max(0, h-n)+1)
|
(&mut p, &mut g)
|
||||||
|
};
|
||||||
|
let (k0, k1) = {
|
||||||
|
let (m, n) = (m as isize, n as isize);
|
||||||
|
(-(h - 2 * max(0, h - m)), h - 2 * max(0, h - n) + 1)
|
||||||
|
};
|
||||||
|
for k in (k0..k1).step_by(2) {
|
||||||
|
let mut a: usize = if k == -h
|
||||||
|
|| k != h && dollar_c[modulo(k - 1, z)] < dollar_c[modulo(k + 1, z)]
|
||||||
|
{
|
||||||
|
dollar_c[modulo(k + 1, z)]
|
||||||
|
} else {
|
||||||
|
dollar_c[modulo(k - 1, z)] + 1
|
||||||
};
|
};
|
||||||
for k in (k0..k1).step_by(2) {
|
let mut b = (a as isize - k) as usize;
|
||||||
let mut a: usize = if k == -h || k != h && $c[modulo(k-1, z)] < $c[modulo(k+1, z)] {
|
let (s, t) = (a, b);
|
||||||
$c[modulo(k+1, z)]
|
while a < n && b < m && {
|
||||||
|
let (e_i, f_i) = if inverse {
|
||||||
|
(a, b)
|
||||||
} else {
|
} else {
|
||||||
$c[modulo(k-1, z)] + 1
|
(n - a - 1, m - b - 1)
|
||||||
};
|
};
|
||||||
let mut b = (a as isize - k) as usize;
|
new[j + f_i] == old[i + e_i]
|
||||||
let (s, t) = (a, b);
|
} {
|
||||||
while a < n && b < m && {
|
a += 1;
|
||||||
let (e_i, f_i) = if $e { (a, b) } else { (n - a - 1, m - b - 1) };
|
b += 1;
|
||||||
new[j + f_i] == old[i + e_i]
|
}
|
||||||
} {
|
dollar_c[modulo(k, z)] = a;
|
||||||
a += 1;
|
let bound = if inverse { h - 1 } else { h };
|
||||||
b += 1;
|
if (l % 2 == 1) == inverse
|
||||||
}
|
&& w - k >= -bound
|
||||||
$c[modulo(k, z)] = a;
|
&& w - k <= bound
|
||||||
let bound = if $e { h-1 } else { h };
|
&& dollar_c[modulo(k, z)] + dollar_d[modulo(w - k, z)] >= n
|
||||||
if (l%2 == 1) == $e
|
{
|
||||||
&& w-k >= -bound && w-k <= bound
|
let (x, y, u, v) = if inverse {
|
||||||
&& $c[modulo(k, z)]+$d[modulo(w-k, z)] >= n
|
(s, t, a, b)
|
||||||
{
|
} else {
|
||||||
let (x, y, u, v) = if $e {
|
(n - a, m - b, n - s, m - t)
|
||||||
(s, t, a, b)
|
};
|
||||||
} else {
|
if h + bound > 1 || (x != u && y != v) {
|
||||||
(n-a, m-b, n-s, m-t)
|
diff_offsets(diff, old, i, i + x, new, j, j + y)?;
|
||||||
};
|
if x != u {
|
||||||
if h + bound > 1 || (x != u && y != v) {
|
diff.equal(i + x, j + y, u - x)?;
|
||||||
diff_offsets(diff, old, i, i+x, new, j, j+y)?;
|
|
||||||
if x != u {
|
|
||||||
diff.equal(i + x, j + y, u-x)?;
|
|
||||||
}
|
|
||||||
diff_offsets(diff, old, i+u, i_, new, j+v, j_)?;
|
|
||||||
return Ok(())
|
|
||||||
} else if m > n {
|
|
||||||
diff.equal(i, j, n)?;
|
|
||||||
diff.insert(i+n, j+n, m-n)?;
|
|
||||||
return Ok(())
|
|
||||||
} else if m < n {
|
|
||||||
diff.equal(i, j, m)?;
|
|
||||||
diff.delete(i+m, n-m, j+m)?;
|
|
||||||
return Ok(())
|
|
||||||
} else {
|
|
||||||
return Ok(())
|
|
||||||
}
|
}
|
||||||
|
diff_offsets(diff, old, i + u, i_, new, j + v, j_)?;
|
||||||
|
return Ok(());
|
||||||
|
} else if m > n {
|
||||||
|
diff.equal(i, j, n)?;
|
||||||
|
diff.insert(i + n, j + n, m - n)?;
|
||||||
|
return Ok(());
|
||||||
|
} else if m < n {
|
||||||
|
diff.equal(i, j, m)?;
|
||||||
|
diff.delete(i + m, n - m, j + m)?;
|
||||||
|
return Ok(());
|
||||||
|
} else {
|
||||||
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
search!(true, g, p);
|
|
||||||
search!(false, p, g);
|
|
||||||
}
|
}
|
||||||
} else if i_ > i {
|
} else if i_ > i {
|
||||||
diff.delete(i, i_ - i, j)?
|
diff.delete(i, i_ - i, j)?
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue