zee_edit/
diff.rs

1use ropey::Rope;
2
3#[derive(Clone, Debug, PartialEq)]
4pub struct OpaqueDiff {
5    pub byte_index: usize,
6    pub old_byte_length: usize,
7    pub new_byte_length: usize,
8    pub char_index: usize,
9    pub old_char_length: usize,
10    pub new_char_length: usize,
11}
12
13impl OpaqueDiff {
14    #[inline]
15    pub fn new(
16        byte_index: usize,
17        old_byte_length: usize,
18        new_byte_length: usize,
19        char_index: usize,
20        old_char_length: usize,
21        new_char_length: usize,
22    ) -> Self {
23        Self {
24            byte_index,
25            old_byte_length,
26            new_byte_length,
27            char_index,
28            old_char_length,
29            new_char_length,
30        }
31    }
32
33    #[inline]
34    pub fn empty() -> Self {
35        Self {
36            byte_index: 0,
37            old_byte_length: 0,
38            new_byte_length: 0,
39            char_index: 0,
40            old_char_length: 0,
41            new_char_length: 0,
42        }
43    }
44
45    #[inline]
46    pub fn is_empty(&self) -> bool {
47        *self == OpaqueDiff::empty()
48    }
49
50    #[inline]
51    pub fn reverse(&self) -> Self {
52        Self {
53            byte_index: self.byte_index,
54            old_byte_length: self.new_byte_length,
55            new_byte_length: self.old_byte_length,
56            char_index: self.char_index,
57            old_char_length: self.new_char_length,
58            new_char_length: self.old_char_length,
59        }
60    }
61}
62
63pub struct DeleteOperation {
64    pub diff: OpaqueDiff,
65    pub deleted: Rope,
66}
67
68impl DeleteOperation {
69    pub fn empty() -> Self {
70        Self {
71            diff: OpaqueDiff::empty(),
72            deleted: Rope::new(),
73        }
74    }
75}
76
77#[cfg(test)]
78mod tests {
79    use super::*;
80    use ropey::Rope;
81
82    #[test]
83    fn mem_size_of_diffs() {
84        assert_eq!(std::mem::size_of::<OpaqueDiff>(), 48);
85        assert_eq!(std::mem::size_of::<Rope>(), 8);
86        assert_eq!(std::mem::size_of::<DeleteOperation>(), 56);
87    }
88}