MCPcopy Index your code
hub / github.com/encounter/objdiff / diff_data_range

Function diff_data_range

objdiff-core/src/diff/data.rs:80–147  ·  view source on GitHub ↗

Compares the bytes within a certain data range.

(left_data: &[u8], right_data: &[u8])

Source from the content-addressed store, hash-verified

78
79/// Compares the bytes within a certain data range.
80fn diff_data_range(left_data: &[u8], right_data: &[u8]) -> (f32, Vec<DataDiff>, Vec<DataDiff>) {
81 let ops = capture_diff_slices(Algorithm::Patience, left_data, right_data);
82 let bytes_match_ratio = get_diff_ratio(&ops, left_data.len(), right_data.len());
83
84 let mut left_data_diff = Vec::<DataDiff>::new();
85 let mut right_data_diff = Vec::<DataDiff>::new();
86 for op in ops {
87 let (tag, left_range, right_range) = op.as_tag_tuple();
88 let left_len = left_range.len();
89 let right_len = right_range.len();
90 let mut len = left_len.max(right_len);
91 let kind = match tag {
92 similar::DiffTag::Equal => DataDiffKind::None,
93 similar::DiffTag::Delete => DataDiffKind::Delete,
94 similar::DiffTag::Insert => DataDiffKind::Insert,
95 similar::DiffTag::Replace => {
96 // Ensure replacements are equal length
97 len = left_len.min(right_len);
98 DataDiffKind::Replace
99 }
100 };
101 let left_data = &left_data[left_range];
102 let right_data = &right_data[right_range];
103 left_data_diff.push(DataDiff {
104 data: left_data[..len.min(left_data.len())].to_vec(),
105 kind,
106 size: len,
107 });
108 right_data_diff.push(DataDiff {
109 data: right_data[..len.min(right_data.len())].to_vec(),
110 kind,
111 size: len,
112 });
113 if kind == DataDiffKind::Replace {
114 match left_len.cmp(&right_len) {
115 Ordering::Less => {
116 let len = right_len - left_len;
117 left_data_diff.push(DataDiff {
118 data: vec![],
119 kind: DataDiffKind::Insert,
120 size: len,
121 });
122 right_data_diff.push(DataDiff {
123 data: right_data[left_len..right_len].to_vec(),
124 kind: DataDiffKind::Insert,
125 size: len,
126 });
127 }
128 Ordering::Greater => {
129 let len = left_len - right_len;
130 left_data_diff.push(DataDiff {
131 data: left_data[right_len..left_len].to_vec(),
132 kind: DataDiffKind::Delete,
133 size: len,
134 });
135 right_data_diff.push(DataDiff {
136 data: vec![],
137 kind: DataDiffKind::Delete,

Callers 2

diff_data_sectionFunction · 0.85
diff_data_symbolFunction · 0.85

Calls 2

pushMethod · 0.80
cmpMethod · 0.80

Tested by

no test coverage detected