my fork of dmp
Diffstat (limited to 'src/traits.rs')
| -rw-r--r-- | src/traits.rs | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/traits.rs b/src/traits.rs new file mode 100644 index 0000000..594063d --- /dev/null +++ b/src/traits.rs @@ -0,0 +1,64 @@ +use std::time::Instant; + +use crate::dmp::{Diff, DiffMatchPatch}; + +pub(crate) trait BisectSplit: Copy + Ord + Eq { + fn bisect_split( + dmp: &DiffMatchPatch, + old: &[Self], + new: &[Self], + x: usize, + y: usize, + deadline: Instant, + ) -> Result<Vec<Diff<Self>>, crate::errors::Error>; +} + +impl BisectSplit for u8 { + fn bisect_split( + dmp: &DiffMatchPatch, + old: &[u8], + new: &[u8], + x: usize, + y: usize, + deadline: Instant, + ) -> Result<Vec<Diff<u8>>, crate::errors::Error> { + let old_a = &old[..x]; + let new_a = &new[..y]; + + let old_b = &old[x..]; + let new_b = &new[y..]; + + // Compute both diffs serially. + let mut diffs_a = dmp.diff_internal(old_a, new_a, false, deadline)?; + let mut diffs_b = dmp.diff_internal(old_b, new_b, false, deadline)?; + + diffs_a.append(&mut diffs_b); + + Ok(diffs_a) + } +} + +impl BisectSplit for usize { + fn bisect_split( + dmp: &DiffMatchPatch, + old: &[usize], + new: &[usize], + x: usize, + y: usize, + deadline: Instant, + ) -> Result<Vec<Diff<usize>>, crate::errors::Error> { + let old_a = &old[..x]; + let new_a = &new[..y]; + + let old_b = &old[x..]; + let new_b = &new[y..]; + + // Compute both diffs serially. + let mut diffs_a = dmp.diff_lines(old_a, new_a, deadline)?; + let mut diffs_b = dmp.diff_lines(old_b, new_b, deadline)?; + + diffs_a.append(&mut diffs_b); + + Ok(diffs_a) + } +} |