1mod replace;
15pub use replace::*;
16
17use std::ops::Index;
18
19pub trait DiffAlgorithm {
20 fn diff<S: Index<usize> + ?Sized, T: Index<usize> + ?Sized, D: Diff>(
21 d: &mut D,
22 e: &S,
23 e0: usize,
24 e1: usize,
25 f: &T,
26 f0: usize,
27 f1: usize,
28 ) -> Result<(), D::Error>;
29}
30
31pub mod myers;
33pub mod patience;
35pub mod bin;
37
38#[cfg(test)]
39mod test;
40
41#[allow(unused_variables)]
42pub trait Diff: Sized {
45 type Error;
46 fn equal(&mut self, old: usize, new: usize, len: usize) -> Result<(), Self::Error> {
50 Ok(())
51 }
52 fn delete(&mut self, old: usize, len: usize, new: usize) -> Result<(), Self::Error> {
55 Ok(())
56 }
57 fn insert(&mut self, old: usize, new: usize, new_len: usize) -> Result<(), Self::Error> {
60 Ok(())
61 }
62 fn replace(
67 &mut self,
68 old: usize,
69 old_len: usize,
70 new: usize,
71 new_len: usize,
72 ) -> Result<(), Self::Error> {
73 self.delete(old, old_len, new)?;
74 self.insert(old, new, new_len)
75 }
76 fn finish(&mut self) -> Result<(), Self::Error> {
78 Ok(())
79 }
80}
81
82impl<'a, D: Diff + 'a> Diff for &'a mut D {
83 type Error = D::Error;
84 fn equal(&mut self, old: usize, new: usize, len: usize) -> Result<(), Self::Error> {
85 (*self).equal(old, new, len)
86 }
87 fn delete(&mut self, old: usize, len: usize, new: usize) -> Result<(), Self::Error> {
88 (*self).delete(old, len, new)
89 }
90
91 fn insert(&mut self, old: usize, new: usize, new_len: usize) -> Result<(), Self::Error> {
92 (*self).insert(old, new, new_len)
93 }
94
95 fn replace(
96 &mut self,
97 old: usize,
98 old_len: usize,
99 new: usize,
100 new_len: usize,
101 ) -> Result<(), Self::Error> {
102 (*self).replace(old, old_len, new, new_len)
103 }
104
105 fn finish(&mut self) -> Result<(), Self::Error> {
106 (*self).finish()
107 }
108}