Refactor to add a is_empty_range function

This commit is contained in:
Armin Ronacher 2021-02-20 15:51:45 +01:00
parent c0e37a9c67
commit 1cc4ec4d25
3 changed files with 14 additions and 6 deletions

View file

@ -7,6 +7,7 @@ use std::ops::{Index, Range};
use std::time::Instant; use std::time::Instant;
use crate::algorithms::DiffHook; use crate::algorithms::DiffHook;
use crate::utils::is_empty_range;
/// HuntMcIlroy / HuntSzymanski LCS diff algorithm. /// HuntMcIlroy / HuntSzymanski LCS diff algorithm.
/// ///
@ -52,10 +53,10 @@ where
D: DiffHook, D: DiffHook,
New::Output: PartialEq<Old::Output>, New::Output: PartialEq<Old::Output>,
{ {
if new_range.start >= new_range.end { if is_empty_range(&new_range) {
d.delete(old_range.start, old_range.len(), new_range.start)?; d.delete(old_range.start, old_range.len(), new_range.start)?;
return Ok(()); return Ok(());
} else if old_range.start >= old_range.end { } else if is_empty_range(&old_range) {
d.insert(old_range.start, new_range.start, new_range.len())?; d.insert(old_range.start, new_range.start, new_range.len())?;
return Ok(()); return Ok(());
} }

View file

@ -23,6 +23,7 @@ use std::ops::{Index, IndexMut, Range};
use std::time::Instant; use std::time::Instant;
use crate::algorithms::DiffHook; use crate::algorithms::DiffHook;
use crate::utils::is_empty_range;
/// Myers' diff algorithm. /// Myers' diff algorithm.
/// ///
@ -171,7 +172,7 @@ where
New: Index<usize> + ?Sized, New: Index<usize> + ?Sized,
New::Output: PartialEq<Old::Output>, New::Output: PartialEq<Old::Output>,
{ {
if old_range.start >= old_range.end || new_range.start >= new_range.end { if is_empty_range(&old_range) || is_empty_range(&new_range) {
return 0; return 0;
} }
new_range new_range
@ -352,15 +353,15 @@ where
old_range.end -= common_suffix_len; old_range.end -= common_suffix_len;
new_range.end -= common_suffix_len; new_range.end -= common_suffix_len;
if old_range.start >= old_range.end && new_range.start >= new_range.end { if is_empty_range(&old_range) && is_empty_range(&new_range) {
// Do nothing // Do nothing
} else if new_range.start >= new_range.end { } else if is_empty_range(&new_range) {
d.delete( d.delete(
old_range.start, old_range.start,
old_range.end - old_range.start, old_range.end - old_range.start,
new_range.start, new_range.start,
)?; )?;
} else if old_range.start >= old_range.end { } else if is_empty_range(&old_range) {
d.insert( d.insert(
old_range.start, old_range.start,
new_range.start, new_range.start,

View file

@ -401,6 +401,12 @@ pub fn diff_lines<'x, T: DiffableStrRef + ?Sized>(
.collect() .collect()
} }
/// Utility function to check if a range is empty that works on older rust versions
#[inline(always)]
pub(crate) fn is_empty_range<T: PartialOrd>(range: &Range<T>) -> bool {
!(range.start < range.end)
}
#[test] #[test]
fn test_remapper() { fn test_remapper() {
let a = "foo bar baz"; let a = "foo bar baz";