From 1cc4ec4d25faa8b8f6b5838c28de1282283b0432 Mon Sep 17 00:00:00 2001 From: Armin Ronacher Date: Sat, 20 Feb 2021 15:51:45 +0100 Subject: [PATCH] Refactor to add a is_empty_range function --- src/algorithms/lcs.rs | 5 +++-- src/algorithms/myers.rs | 9 +++++---- src/utils.rs | 6 ++++++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/algorithms/lcs.rs b/src/algorithms/lcs.rs index 206e115..6c60c1f 100644 --- a/src/algorithms/lcs.rs +++ b/src/algorithms/lcs.rs @@ -7,6 +7,7 @@ use std::ops::{Index, Range}; use std::time::Instant; use crate::algorithms::DiffHook; +use crate::utils::is_empty_range; /// Hunt–McIlroy / Hunt–Szymanski LCS diff algorithm. /// @@ -52,10 +53,10 @@ where D: DiffHook, New::Output: PartialEq, { - if new_range.start >= new_range.end { + if is_empty_range(&new_range) { d.delete(old_range.start, old_range.len(), new_range.start)?; 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())?; return Ok(()); } diff --git a/src/algorithms/myers.rs b/src/algorithms/myers.rs index 7432eee..c3117dd 100644 --- a/src/algorithms/myers.rs +++ b/src/algorithms/myers.rs @@ -23,6 +23,7 @@ use std::ops::{Index, IndexMut, Range}; use std::time::Instant; use crate::algorithms::DiffHook; +use crate::utils::is_empty_range; /// Myers' diff algorithm. /// @@ -171,7 +172,7 @@ where New: Index + ?Sized, New::Output: PartialEq, { - 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; } new_range @@ -352,15 +353,15 @@ where old_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 - } else if new_range.start >= new_range.end { + } else if is_empty_range(&new_range) { d.delete( old_range.start, old_range.end - old_range.start, new_range.start, )?; - } else if old_range.start >= old_range.end { + } else if is_empty_range(&old_range) { d.insert( old_range.start, new_range.start, diff --git a/src/utils.rs b/src/utils.rs index 1f8fdc9..55708d6 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -401,6 +401,12 @@ pub fn diff_lines<'x, T: DiffableStrRef + ?Sized>( .collect() } +/// Utility function to check if a range is empty that works on older rust versions +#[inline(always)] +pub(crate) fn is_empty_range(range: &Range) -> bool { + !(range.start < range.end) +} + #[test] fn test_remapper() { let a = "foo bar baz";