1use std::marker::PhantomData;
20
21use crate::AsView;
22use crate::{node::child_bit as node_child_bit, prefix::mask_from_prefix_len, Prefix};
23
24use super::iter::ViewIter;
25use super::TrieView;
26
27#[derive(Clone)]
36pub struct DifferenceView<'a, L, R> {
37 left: L,
38 right: Option<R>,
39 _phantom: PhantomData<&'a ()>,
40}
41
42impl<'a, L, R> DifferenceView<'a, L, R>
43where
44 L: TrieView<'a>,
45 R: TrieView<'a, P = L::P>,
46{
47 pub(crate) fn new(left: L, right: R) -> Self {
55 let right = align_right(&left, right);
56 Self {
57 left,
58 right,
59 _phantom: PhantomData,
60 }
61 }
62}
63
64fn align_right<'a, L, R>(left: &L, right: R) -> Option<R>
68where
69 L: TrieView<'a>,
70 R: TrieView<'a, P = L::P>,
71{
72 let min_prefix_len = left.prefix_len().min(right.prefix_len());
74 let mask = mask_from_prefix_len(min_prefix_len as u8);
75 if left.key() & mask != right.key() & mask {
76 return None; }
78
79 match right.depth().cmp(&left.depth()) {
80 std::cmp::Ordering::Less => {
81 right.navigate_to(left.key(), left.prefix_len())
83 }
84 std::cmp::Ordering::Equal => {
85 Some(right)
87 }
88 std::cmp::Ordering::Greater => {
89 Some(right)
91 }
92 }
93}
94
95impl<'a, L, R> TrieView<'a> for DifferenceView<'a, L, R>
96where
97 L: TrieView<'a>,
98 R: TrieView<'a, P = L::P>,
99{
100 type P = L::P;
101 type T = L::T;
102
103 #[inline]
104 fn depth(&self) -> u32 {
105 self.left.depth()
106 }
107
108 #[inline]
109 fn key(&self) -> <L::P as Prefix>::R {
110 self.left.key()
111 }
112
113 #[inline]
114 fn prefix_len(&self) -> u32 {
115 self.left.prefix_len()
116 }
117
118 #[inline]
119 fn data_bitmap(&self) -> u32 {
120 match &self.right {
121 None => self.left.data_bitmap(),
122 Some(r) => {
123 if r.depth() == self.left.depth() {
124 self.left.data_bitmap() & !r.data_bitmap()
126 } else {
127 self.left.data_bitmap()
129 }
130 }
131 }
132 }
133
134 #[inline]
135 fn child_bitmap(&self) -> u32 {
136 self.left.child_bitmap()
139 }
140
141 #[inline]
142 unsafe fn get_data(&mut self, data_bit: u32) -> L::T {
143 self.left.get_data(data_bit)
144 }
145
146 unsafe fn get_child(&mut self, child_bit: u32) -> Self {
147 let l_child = self.left.get_child(child_bit);
148 let r_child = match &mut self.right {
149 None => None,
150 Some(r) => {
151 if r.depth() == self.left.depth() {
152 if (r.child_bitmap() >> child_bit) & 1 == 1 {
154 Some(r.get_child(child_bit))
155 } else {
156 None }
158 } else {
159 let toward_r = node_child_bit(self.left.depth(), r.key());
162 if child_bit == toward_r {
163 Some(self.right.take().unwrap())
164 } else {
165 None
166 }
167 }
168 }
169 };
170 DifferenceView {
171 left: l_child,
172 right: r_child,
173 _phantom: PhantomData,
174 }
175 }
176
177 unsafe fn reposition(&mut self, key: <L::P as Prefix>::R, prefix_len: u32) {
178 self.left.reposition(key, prefix_len);
179 }
181}
182
183impl<'a, L, R> IntoIterator for DifferenceView<'a, L, R>
184where
185 L: TrieView<'a>,
186 R: TrieView<'a, P = L::P>,
187{
188 type Item = (L::P, L::T);
189 type IntoIter = ViewIter<'a, DifferenceView<'a, L, R>>;
190
191 fn into_iter(self) -> Self::IntoIter {
192 self.iter()
193 }
194}
195
196impl<'a, L, R> AsView<'a> for DifferenceView<'a, L, R>
197where
198 L: TrieView<'a>,
199 R: TrieView<'a, P = L::P>,
200{
201 type P = L::P;
202 type View = Self;
203
204 fn view(self) -> Self {
205 self
206 }
207}
208
209#[cfg(test)]
210mod tests {
211 use crate::{
212 Prefix,
213 {
214 trieview::{AsView, TrieView},
215 PrefixMap,
216 },
217 };
218
219 type P = (u32, u8);
220
221 fn p(repr: u32, len: u8) -> P {
222 P::from_repr_len(repr, len)
223 }
224
225 fn map_from(entries: &[(u32, u8, i32)]) -> PrefixMap<P, i32> {
226 let mut m = PrefixMap::new();
227 for &(repr, len, val) in entries {
228 m.insert(p(repr, len), val);
229 }
230 m
231 }
232
233 fn collect_diff<'a>(iter: impl Iterator<Item = (P, &'a i32)>) -> Vec<(P, i32)> {
234 iter.map(|(p, v)| (p, *v)).collect()
235 }
236
237 #[test]
240 fn diff_basic() {
241 let a = map_from(&[
243 (0x0a000000, 8, 1),
244 (0x0a010000, 16, 2),
245 (0x0a020000, 16, 3),
246 (0x0b000000, 8, 4),
247 ]);
248 let b = map_from(&[
249 (0x0a000000, 8, 10), (0x0a020000, 16, 30), (0x0c000000, 8, 99), ]);
253 let got = collect_diff(a.view().difference(b.view()).into_iter());
254 assert_eq!(
255 got,
256 vec![
257 (p(0x0a010000, 16), 2), (p(0x0b000000, 8), 4), ]
260 );
261 }
262
263 #[test]
264 fn diff_no_overlap() {
265 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
267 let b = map_from(&[(0x0b000000, 8, 10), (0x0c000000, 8, 20)]);
268 let got = collect_diff(a.view().difference(b.view()).into_iter());
269 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a010000, 16), 2),]);
270 }
271
272 #[test]
273 fn diff_b_superset() {
274 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
276 let b = map_from(&[
277 (0x0a000000, 8, 10),
278 (0x0a010000, 16, 20),
279 (0x0b000000, 8, 99),
280 ]);
281 let got = collect_diff(a.view().difference(b.view()).into_iter());
282 assert!(got.is_empty());
283 }
284
285 #[test]
286 fn diff_b_empty() {
287 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
289 let b: PrefixMap<P, i32> = PrefixMap::new();
290 let got = collect_diff(a.view().difference(b.view()).into_iter());
291 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a010000, 16), 2),]);
292 }
293
294 #[test]
295 fn diff_a_empty() {
296 let a: PrefixMap<P, i32> = PrefixMap::new();
297 let b = map_from(&[(0x0a000000, 8, 10)]);
298 assert!(a.view().difference(b.view()).into_iter().next().is_none());
299 }
300
301 #[test]
303 fn diff_large_same_depth() {
304 let a = map_from(&[
305 (0x01000000, 8, 1),
306 (0x0a000000, 8, 10),
307 (0x0a010000, 16, 11),
308 (0x0a010100, 24, 12),
309 (0x0a020000, 16, 13),
310 (0x0b000000, 8, 20),
311 (0x0b010000, 16, 21),
312 (0x64000000, 8, 100),
313 (0xc0a80000, 16, 200),
314 ]);
315 let b = map_from(&[
316 (0x0a000000, 8, 99), (0x0a010100, 24, 99), (0x0b000000, 8, 99), (0x64000000, 8, 99), (0xc0a80100, 24, 99), ]);
322 let got = collect_diff(a.view().difference(b.view()).into_iter());
323 assert_eq!(
324 got,
325 vec![
326 (p(0x01000000, 8), 1), (p(0x0a010000, 16), 11), (p(0x0a020000, 16), 13), (p(0x0b010000, 16), 21), (p(0xc0a80000, 16), 200), ]
332 );
333 }
334
335 #[test]
338 fn diff_find_then_iter() {
339 let a = map_from(&[
340 (0x0a000000, 8, 1),
341 (0x0a010000, 16, 2),
342 (0x0a010100, 24, 3),
343 (0x0b000000, 8, 4),
344 ]);
345 let b = map_from(&[
346 (0x0a000000, 8, 10),
347 (0x0a010000, 16, 20), ]);
349 let got = collect_diff(
351 a.view()
352 .difference(b.view())
353 .find(&p(0x0a010000, 16))
354 .unwrap()
355 .into_iter(),
356 );
357 assert_eq!(got, vec![(p(0x0a010100, 24), 3)]);
358 }
359
360 #[test]
361 fn diff_mut_find_lpm_value_does_not_require_clone() {
362 let mut a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2), (0x0a010100, 24, 3)]);
363 let b = map_from(&[(0x0a010100, 24, 30)]);
364
365 let got = (&mut a)
366 .view()
367 .difference(b.view())
368 .find_lpm_value(&p(0x0a010180, 25))
369 .map(|(prefix, value)| {
370 *value += 10;
371 (prefix, *value)
372 });
373
374 assert_eq!(got, Some((p(0x0a010000, 16), 12)));
375 assert_eq!(a.get(&p(0x0a010000, 16)), Some(&12));
376 }
377
378 #[test]
386 fn diff_right_shallower_navigated_to_left() {
387 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2), (0x0a020000, 16, 3)]);
392 let b = map_from(&[
393 (0x0a000000, 8, 10),
394 (0x0a010000, 16, 20),
395 (0x0b000000, 8, 30), ]);
397 let a_sub = a.view_at(&p(0x0a000000, 8)).unwrap(); let b_root = b.view(); let got = collect_diff(a_sub.difference(b_root).into_iter());
401 assert_eq!(got, vec![(p(0x0a020000, 16), 3)]);
402 }
403
404 #[test]
407 fn diff_right_shallower_diverges() {
408 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
411 let b = map_from(&[
412 (0x0b000000, 8, 10), (0x0c000000, 8, 20),
414 ]);
415 let a_sub = a.view_at(&p(0x0a000000, 8)).unwrap(); let b_root = b.view(); let got = collect_diff(a_sub.difference(b_root).into_iter());
419 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a010000, 16), 2),]);
421 }
422
423 #[test]
427 fn diff_left_shallower_right_deeper() {
428 let a = map_from(&[
438 (0x09000000, 8, 1),
439 (0x0a000000, 8, 2),
440 (0x0a010000, 16, 3),
441 (0x0b000000, 8, 4),
442 ]);
443 let b = map_from(&[
444 (0x0a000000, 8, 10),
445 (0x0a010000, 16, 20),
446 (0x0a020000, 16, 30),
447 ]);
448 let a_root = a.view();
449 let b_sub = b.view_at(&p(0x0a000000, 8)).unwrap(); let got = collect_diff(a_root.difference(b_sub).into_iter());
452 assert_eq!(
453 got,
454 vec![
455 (p(0x09000000, 8), 1), (p(0x0b000000, 8), 4), ]
458 );
459 }
460
461 #[test]
464 fn diff_left_multiple_subtries_right_covers_one() {
465 let a = map_from(&[
466 (0x0a000000, 8, 1),
467 (0x0a010000, 16, 2),
468 (0x0b000000, 8, 3),
469 (0x0b010000, 16, 4),
470 (0x0c000000, 8, 5),
471 ]);
472 let b = map_from(&[
473 (0x0a000000, 8, 10), (0x0a010000, 16, 20), ]);
476 let a_root = a.view();
477 let b_sub = b.view_at(&p(0x0a000000, 8)).unwrap(); let got = collect_diff(a_root.difference(b_sub).into_iter());
480 assert_eq!(
481 got,
482 vec![
483 (p(0x0b000000, 8), 3), (p(0x0b010000, 16), 4),
486 (p(0x0c000000, 8), 5),
487 ]
488 );
489 }
490
491 #[test]
494 fn diff_composed_with_intersection() {
495 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2), (0x0b000000, 8, 3)]);
497 let b = map_from(&[(0x0a000000, 8, 99)]); let c = map_from(&[(0x0a010000, 16, 100), (0x0b000000, 8, 200)]);
499 let got: Vec<_> = a
501 .view()
502 .difference(b.view())
503 .intersection(c.view())
504 .unwrap()
505 .into_iter()
506 .map(|(p, (l, r))| (p, *l, *r))
507 .collect();
508 assert_eq!(
509 got,
510 vec![(p(0x0a010000, 16), 2, 100), (p(0x0b000000, 8), 3, 200),]
511 );
512 }
513
514 #[test]
515 fn diff_composed_difference_of_differences() {
516 let a = map_from(&[
518 (0x0a000000, 8, 1),
519 (0x0a010000, 16, 2),
520 (0x0b000000, 8, 3),
521 (0x0c000000, 8, 4),
522 ]);
523 let b = map_from(&[(0x0a000000, 8, 99)]); let c = map_from(&[(0x0b000000, 8, 99)]); let got = collect_diff(
528 a.view()
529 .difference(b.view())
530 .difference(c.view())
531 .into_iter(),
532 );
533 assert_eq!(got, vec![(p(0x0a010000, 16), 2), (p(0x0c000000, 8), 4),]);
534 }
535
536 #[test]
537 fn view_into_right_child() {
538 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 1, 1), (0x00000000, 2, 2)]);
539 let b = map_from(&[(0x00000000, 0, 0), (0x00000000, 2, 2)]);
540 let b_view = b.view_at(&p(0x00000000, 1)).unwrap();
541 let got = a.view().difference(b_view).iter().collect::<Vec<_>>();
542 let want = vec![(p(0x00000000, 0), &0), (p(0x00000000, 1), &1)];
543 assert_eq!(got, want);
544 }
545
546 #[test]
547 fn view_into_left_child() {
548 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 1, 1), (0x00000000, 2, 2)]);
549 let b = map_from(&[(0x00000000, 0, 0), (0x00000000, 2, 2)]);
550 let a_view = a.view_at(&p(0x00000000, 1)).unwrap();
551 let got = a_view.difference(b.view()).iter().collect::<Vec<_>>();
552 let want = vec![(p(0x00000000, 1), &1)];
553 assert_eq!(got, want);
554 }
555
556 #[test]
557 fn view_into_right_child_deep() {
558 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 5, 5), (0x00000000, 6, 6)]);
559 let b = map_from(&[(0x00000000, 0, 0), (0x00000000, 6, 6)]);
560 let b_view = b.view_at(&p(0x00000000, 5)).unwrap();
561 let got = a.view().difference(b_view).iter().collect::<Vec<_>>();
562 let want = vec![(p(0x00000000, 0), &0), (p(0x00000000, 5), &5)];
563 assert_eq!(got, want);
564 }
565
566 #[test]
567 fn view_into_left_child_deep() {
568 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 5, 5), (0x00000000, 6, 6)]);
569 let b = map_from(&[(0x00000000, 0, 0), (0x00000000, 6, 6)]);
570 let a_view = a.view_at(&p(0x00000000, 5)).unwrap();
571 let got = a_view.difference(b.view()).iter().collect::<Vec<_>>();
572 let want = vec![(p(0x00000000, 5), &5)];
573 assert_eq!(got, want);
574 }
575
576 #[test]
579 fn diff_iter_from_inclusive() {
580 let a = map_from(&[
581 (0x0a000000, 8, 1),
582 (0x0a010000, 16, 2),
583 (0x0a020000, 16, 3),
584 (0x0a030000, 16, 4),
585 ]);
586 let b = map_from(&[(0x0a010000, 16, 20)]);
587
588 let from = collect_diff(
590 a.view()
591 .difference(b.view())
592 .iter_from(&p(0x0a020000, 16), true),
593 );
594 assert_eq!(from, vec![(p(0x0a020000, 16), 3), (p(0x0a030000, 16), 4)]);
595 }
596
597 #[test]
598 fn diff_iter_from_exclusive() {
599 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2), (0x0a020000, 16, 3)]);
600 let b = map_from(&[(0x0a010000, 16, 20)]);
601
602 let from = collect_diff(
604 a.view()
605 .difference(b.view())
606 .iter_from(&p(0x0a000000, 8), false),
607 );
608 assert_eq!(from, vec![(p(0x0a020000, 16), 3)]);
609 }
610
611 #[test]
612 fn diff_iter_from_subview() {
613 let a = map_from(&[
614 (0x0a000000, 8, 1), (0x0a020000, 16, 2),
616 (0x0a030000, 16, 3),
617 (0x0b000000, 8, 4), ]);
619 let b = map_from(&[(0x0a020000, 16, 20)]);
620
621 let diff = a.view_at(&p(0x0a020000, 15)).unwrap().difference(b.view());
625 let all = collect_diff(diff.clone().iter());
626 assert_eq!(all, vec![(p(0x0a030000, 16), 3)]);
627
628 let from = collect_diff(diff.iter_from(&p(0x0a030000, 16), true));
630 assert_eq!(from, vec![(p(0x0a030000, 16), 3)]);
631 }
632}