my fork of dmp
Diffstat (limited to 'src/dmp.rs')
-rw-r--r--src/dmp.rs65
1 files changed, 41 insertions, 24 deletions
diff --git a/src/dmp.rs b/src/dmp.rs
index e1905ec..fef0ebb 100644
--- a/src/dmp.rs
+++ b/src/dmp.rs
@@ -679,8 +679,13 @@ impl DiffMatchPatch {
{
let v_trg = v_offset as usize + 1;
- v1[v_trg] = 0;
- v2[v_trg] = 0;
+ if v_trg < v1.len() {
+ v1[v_trg] = 0;
+ }
+
+ if v_trg < v2.len() {
+ v2[v_trg] = 0;
+ }
}
let delta = old_len - new_len;
@@ -714,15 +719,21 @@ impl DiffMatchPatch {
let (x1, y1) = {
let k1_offset = v_offset + k1;
- let v1_prev = if (1..v1.len() as isize).contains(&k1_offset) {
- v1[k1_offset as usize - 1]
- } else {
- -1
+ let v1_prev = {
+ let prev_idx = (k1_offset - 1) as usize;
+ if prev_idx < v1.len() {
+ v1[prev_idx]
+ } else {
+ -1
+ }
};
- let v1_next = if (0..v1.len() as isize).contains(&(k1_offset + 1)) {
- v1[k1_offset as usize + 1]
- } else {
- -1
+ let v1_next = {
+ let next_idx = (k1_offset + 1) as usize;
+ if next_idx < v1.len() {
+ v1[next_idx]
+ } else {
+ -1
+ }
};
let mut x1 = if k1 == -edit_dist || (k1 != edit_dist && v1_prev < v1_next) {
@@ -751,10 +762,13 @@ impl DiffMatchPatch {
// Ran off the bottom of the graph.
k1start += 2;
} else if front {
- let k2_offset = v_offset + delta - k1;
- if (0..v_len).contains(&k2_offset) && v2[k2_offset as usize] != -1 {
+ let k2_offset = (v_offset + delta - k1) as usize;
+ if (0..v_len as usize).contains(&k2_offset)
+ && k2_offset < v2.len()
+ && v2[k2_offset] != -1
+ {
// Mirror x2 onto top-left coordinate system.
- let x2 = old_len - v2[k2_offset as usize];
+ let x2 = old_len - v2[k2_offset];
if x1 >= x2 {
// Overlap detected.
return T::bisect_split(
@@ -775,15 +789,17 @@ impl DiffMatchPatch {
let mut k2 = k2start - edit_dist;
while k2 < edit_dist + 1 - k2end {
let (mut x2, y2) = {
- let k2_offset = v_offset + k2;
+ let k2_offset = (v_offset + k2) as usize;
+ let prev_idx = k2_offset - 1;
+ let next_idx = k2_offset + 1;
- let v2_prev = if (0..v2.len() as isize).contains(&(k2_offset - 1)) {
- v2[k2_offset as usize - 1]
+ let v2_prev = if prev_idx < v2.len() {
+ v2[prev_idx]
} else {
-1
};
- let v2_next = if (0..v2.len() as isize).contains(&(k2_offset + 1)) {
- v2[k2_offset as usize + 1]
+ let v2_next = if next_idx < v2.len() {
+ v2[next_idx]
} else {
-1
};
@@ -799,8 +815,8 @@ impl DiffMatchPatch {
y2 = yi as isize;
x2 = xi as isize;
- if (0..v2.len() as isize).contains(&k2_offset) {
- v2[k2_offset as usize] = x2;
+ if k2_offset < v2.len() {
+ v2[k2_offset] = x2;
}
(x2, y2)
@@ -813,10 +829,11 @@ impl DiffMatchPatch {
// Ran off the top of the graph.
k2start += 2;
} else if !front {
- let k1_offset = v_offset + delta - k2;
- if (0..v_len).contains(&k1_offset) && v1[k1_offset as usize] != -1 {
- let x1 = v1[k1_offset as usize];
- let y1 = v_offset + x1 - k1_offset;
+ let k1_offset = (v_offset + delta - k2) as usize;
+ if k1_offset < v_len as usize && k1_offset < v1.len() && v1[k1_offset] != -1 {
+ // if (0..v_len).contains(&k1_offset) && k1_offset < v1.len() as isize && v1[k1_offset as usize] != -1 {
+ let x1 = v1[k1_offset];
+ let y1 = v_offset + x1 - k1_offset as isize;
// Mirror x2 onto top-left coordinate system.
x2 = old_len - x2;
if x1 >= x2 {