my fork of dmp
Diffstat (limited to 'src/traits.rs')
-rw-r--r--src/traits.rs64
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)
+ }
+}