use super::EqualRun;
use super::myers::LineView;
use super::scan::line_bytes;
pub(super) fn slide_equal_run(
old: LineView<'_>,
new: LineView<'_>,
run: EqualRun,
new_cursor: &mut usize,
) -> (EqualRun, Option<EqualRun>) {
let original_new_start = run.new_start;
let insert_len = original_new_start.saturating_sub(*new_cursor);
let mut slide = 0usize;
let max_slide = insert_len.min(run.len);
while slide < max_slide
&& line_bytes(old.bytes, old.offs[run.old_start + slide])
== line_bytes(new.bytes, new.offs[*new_cursor + slide])
{
slide += 1;
}
let slid = if slide == 0 {
(run, None)
} else if slide == run.len {
(
EqualRun {
old_start: run.old_start,
new_start: *new_cursor,
len: slide,
},
None,
)
} else {
(
EqualRun {
old_start: run.old_start,
new_start: *new_cursor,
len: slide,
},
Some(EqualRun {
old_start: run.old_start + slide,
new_start: original_new_start + slide,
len: run.len - slide,
}),
)
};
*new_cursor = original_new_start + run.len;
slid
}
pub(super) fn slide_equal_run_right(
old: LineView<'_>,
new: LineView<'_>,
run: EqualRun,
gap_start: usize,
gap_end: usize,
left_justified: bool,
) -> (Option<EqualRun>, EqualRun) {
if left_justified || run.len == 0 || gap_end <= gap_start {
return (None, run);
}
if gap_start + run.len <= gap_end
&& run_matches_at(old, new, run, gap_start)
&& run_matches_at(old, new, run, gap_end - run.len)
{
(
None,
EqualRun {
old_start: run.old_start,
new_start: gap_start,
len: run.len,
},
)
} else {
(None, run)
}
}
pub(super) fn compact_keeps_right_shift(
old: LineView<'_>,
new: LineView<'_>,
run: EqualRun,
original_end: usize,
left_justified: bool,
) -> bool {
if left_justified || run.len == 0 || original_end + run.len > new.offs.len() {
return false;
}
run_matches_at(old, new, run, original_end)
&& run_matches_at(old, new, run, new.offs.len() - run.len)
}
fn run_matches_at(old: LineView<'_>, new: LineView<'_>, run: EqualRun, new_start: usize) -> bool {
(0..run.len).all(|offset| {
line_bytes(old.bytes, old.offs[run.old_start + offset])
== line_bytes(new.bytes, new.offs[new_start + offset])
})
}