1use std::marker::PhantomData;
24
25use crate::{
26 prefix::mask_from_prefix_len,
27 Prefix,
28 {
29 node::{
30 child_bit as node_child_bit, child_cover_mask_for_bit, data_cover_mask_for_bit,
31 data_lpm_mask,
32 },
33 AsView,
34 },
35};
36
37use super::{iter::ViewIter, TrieView};
38
39#[derive(Clone)]
51pub struct CoveringDifferenceView<'a, L, R> {
52 left: L,
53 right: Option<R>,
54 cov_data: u32,
58 cov_child: u32,
61 _phantom: PhantomData<&'a ()>,
62}
63
64impl<'a, L, R> CoveringDifferenceView<'a, L, R>
65where
66 L: TrieView<'a>,
67 R: TrieView<'a, P = L::P>,
68{
69 pub(crate) fn new(left: L, right: R) -> Self {
70 let (right, covered) = align_right(&left, right);
71 let (cov_data, cov_child) = r_coverage_masks(&left, right.as_ref(), covered);
72 Self {
73 left,
74 right,
75 cov_data,
76 cov_child,
77 _phantom: PhantomData,
78 }
79 }
80}
81
82fn align_right<'a, L, R>(left: &L, mut right: R) -> (Option<R>, bool)
88where
89 L: TrieView<'a>,
90 R: TrieView<'a, P = L::P>,
91{
92 let min_prefix_len = left.prefix_len().min(right.prefix_len());
93 let mask = mask_from_prefix_len(min_prefix_len as u8);
94 if left.key() & mask != right.key() & mask {
95 return (None, false); }
97
98 match right.depth().cmp(&left.depth()) {
99 std::cmp::Ordering::Greater => (Some(right), false),
100 std::cmp::Ordering::Equal => (Some(right), false),
101 std::cmp::Ordering::Less => {
102 loop {
105 let lpm = data_lpm_mask(right.depth(), left.key(), left.depth());
108 if right.data_bitmap() & lpm != 0 {
109 return (None, true);
110 }
111 if right.depth() == left.depth() {
112 return (Some(right), false);
113 }
114 let cb = node_child_bit(right.depth(), left.key());
115 if (right.child_bitmap() >> cb) & 1 == 0 {
116 return (None, false);
117 }
118 right = unsafe { right.get_child(cb) };
121 }
122 }
123 }
124}
125
126fn r_coverage_masks<'a, L, R>(left: &L, right: Option<&R>, covered: bool) -> (u32, u32)
139where
140 L: TrieView<'a>,
141 R: TrieView<'a, P = L::P>,
142{
143 if covered {
144 return (0x7FFF_FFFF, 0xFFFF_FFFF);
145 }
146 let Some(r) = right else { return (0, 0) };
147 if r.depth() != left.depth() {
148 return (0, 0);
149 }
150 let mut cov_data = 0u32;
151 let mut cov_child = 0u32;
152 let mut bits = r.data_bitmap();
153 while bits != 0 {
154 let r_b = bits.trailing_zeros();
155 bits &= bits - 1;
156 cov_data |= data_cover_mask_for_bit(r_b);
157 cov_child |= child_cover_mask_for_bit(r_b);
158 }
159 (cov_data, cov_child)
160}
161
162impl<'a, L, R> TrieView<'a> for CoveringDifferenceView<'a, L, R>
163where
164 L: TrieView<'a>,
165 R: TrieView<'a, P = L::P>,
166{
167 type P = L::P;
168 type T = L::T;
169
170 #[inline]
171 fn depth(&self) -> u32 {
172 self.left.depth()
173 }
174
175 #[inline]
176 fn key(&self) -> <L::P as Prefix>::R {
177 self.left.key()
178 }
179
180 #[inline]
181 fn prefix_len(&self) -> u32 {
182 self.left.prefix_len()
183 }
184
185 #[inline]
190 fn data_bitmap(&self) -> u32 {
191 self.left.data_bitmap() & !self.cov_data
192 }
193
194 #[inline]
198 fn child_bitmap(&self) -> u32 {
199 self.left.child_bitmap() & !self.cov_child
200 }
201
202 #[inline]
203 unsafe fn get_data(&mut self, data_bit: u32) -> L::T {
204 self.left.get_data(data_bit)
205 }
206
207 unsafe fn get_child(&mut self, child_bit: u32) -> Self {
208 let l_child = self.left.get_child(child_bit);
209 let r_child = match &mut self.right {
210 None => None,
211 Some(r) => {
212 if r.depth() == self.left.depth() {
213 if (r.child_bitmap() >> child_bit) & 1 == 1 {
214 Some(r.get_child(child_bit))
215 } else {
216 None
217 }
218 } else {
219 let toward_r = node_child_bit(self.left.depth(), r.key());
221 if child_bit == toward_r {
222 Some(self.right.take().unwrap())
223 } else {
224 None
225 }
226 }
227 }
228 };
229 let (cov_data, cov_child) = r_coverage_masks(&l_child, r_child.as_ref(), false);
230 CoveringDifferenceView {
231 left: l_child,
232 right: r_child,
233 cov_data,
234 cov_child,
235 _phantom: PhantomData,
236 }
237 }
238
239 unsafe fn reposition(&mut self, key: <L::P as Prefix>::R, prefix_len: u32) {
240 let left_depth = self.left.depth();
241 unsafe {
242 self.left.reposition(key, prefix_len);
243 if let Some(r) = self.right.as_mut() {
244 if r.depth() == left_depth {
245 r.reposition(key, prefix_len)
246 }
247 }
248 }
249 }
250}
251
252impl<'a, L, R> IntoIterator for CoveringDifferenceView<'a, L, R>
253where
254 L: TrieView<'a>,
255 R: TrieView<'a, P = L::P>,
256{
257 type Item = (L::P, L::T);
258 type IntoIter = ViewIter<'a, CoveringDifferenceView<'a, L, R>>;
259
260 fn into_iter(self) -> Self::IntoIter {
261 self.iter()
262 }
263}
264
265impl<'a, L, R> AsView<'a> for CoveringDifferenceView<'a, L, R>
266where
267 L: TrieView<'a>,
268 R: TrieView<'a, P = L::P>,
269{
270 type P = L::P;
271 type View = Self;
272
273 fn view(self) -> Self {
274 self
275 }
276}
277
278#[cfg(test)]
279mod tests {
280 use crate::{
281 Prefix,
282 {
283 trieview::{AsView, TrieView},
284 PrefixMap,
285 },
286 };
287
288 type P = (u32, u8);
289
290 fn p(repr: u32, len: u8) -> P {
291 P::from_repr_len(repr, len)
292 }
293
294 fn map_from(entries: &[(u32, u8, i32)]) -> PrefixMap<P, i32> {
295 let mut m = PrefixMap::new();
296 for &(repr, len, val) in entries {
297 m.insert(p(repr, len), val);
298 }
299 m
300 }
301
302 fn collect<'a>(iter: impl Iterator<Item = (P, &'a i32)>) -> Vec<(P, i32)> {
303 iter.map(|(p, v)| (p, *v)).collect()
304 }
305
306 #[test]
315 fn covering_diff_basic() {
316 let a = map_from(&[
317 (0x0a000000, 22, 1), (0x0a000000, 24, 2), (0x0a000200, 23, 3), ]);
321 let b = map_from(&[(0x0a000000, 23, 99)]); let got = collect(a.view().covering_difference(b.view()).into_iter());
323 assert_eq!(got, vec![(p(0x0a000000, 22), 1), (p(0x0a000200, 23), 3),]);
324 }
325
326 #[test]
328 fn covering_diff_no_overlap() {
329 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
330 let b = map_from(&[(0x0b000000, 8, 99)]);
331 let got = collect(a.view().covering_difference(b.view()).into_iter());
332 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a010000, 16), 2),]);
333 }
334
335 #[test]
337 fn covering_diff_exact_match_excluded() {
338 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2), (0x0a020000, 16, 3)]);
339 let b = map_from(&[(0x0a010000, 16, 99)]);
340 let got = collect(a.view().covering_difference(b.view()).into_iter());
341 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a020000, 16), 3),]);
342 }
343
344 #[test]
346 fn covering_diff_r_covers_everything() {
347 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
348 let b = map_from(&[(0x0a000000, 8, 99)]);
349 assert!(a
350 .view()
351 .covering_difference(b.view())
352 .into_iter()
353 .next()
354 .is_none());
355 }
356
357 #[test]
359 fn covering_diff_r_empty() {
360 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
361 let b: PrefixMap<P, i32> = PrefixMap::new();
362 let got = collect(a.view().covering_difference(b.view()).into_iter());
363 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a010000, 16), 2),]);
364 }
365
366 #[test]
368 fn covering_diff_l_empty() {
369 let a: PrefixMap<P, i32> = PrefixMap::new();
370 let b = map_from(&[(0x0a000000, 8, 99)]);
371 assert!(a
372 .view()
373 .covering_difference(b.view())
374 .into_iter()
375 .next()
376 .is_none());
377 }
378
379 #[test]
381 fn covering_diff_partial_coverage() {
382 let a = map_from(&[
383 (0x0a000000, 8, 1),
384 (0x0a010000, 16, 2),
385 (0x0a010100, 24, 3), (0x0a020000, 16, 4),
387 (0x0b000000, 8, 5),
388 ]);
389 let b = map_from(&[(0x0a010000, 16, 99)]);
390 let got = collect(a.view().covering_difference(b.view()).into_iter());
391 assert_eq!(
392 got,
393 vec![
394 (p(0x0a000000, 8), 1),
395 (p(0x0a020000, 16), 4),
398 (p(0x0b000000, 8), 5),
399 ]
400 );
401 }
402
403 #[test]
405 fn covering_diff_large_same_depth() {
406 let a = map_from(&[
407 (0x01000000, 8, 1),
408 (0x0a000000, 8, 10),
409 (0x0a000000, 16, 11),
410 (0x0a010000, 16, 12),
411 (0x0a010100, 24, 13),
412 (0x0a020000, 16, 14),
413 (0x0b000000, 8, 20),
414 (0x0b010000, 16, 21),
415 (0x64000000, 8, 100),
416 ]);
417 let b = map_from(&[
418 (0x0a000000, 8, 99), (0x0b010000, 16, 99), ]);
421 let got = collect(a.view().covering_difference(b.view()).into_iter());
422 assert_eq!(
423 got,
424 vec![
425 (p(0x01000000, 8), 1),
426 (p(0x0b000000, 8), 20),
428 (p(0x64000000, 8), 100),
430 ]
431 );
432 }
433
434 #[test]
437 fn covering_diff_find_then_iter() {
438 let a = map_from(&[
439 (0x0a000000, 8, 1),
440 (0x0a010000, 16, 2),
441 (0x0a010100, 24, 3), (0x0a020000, 16, 4),
443 ]);
444 let b = map_from(&[(0x0a010000, 16, 99)]);
445 let sub = a
446 .view()
447 .covering_difference(b.view())
448 .find(&p(0x0a000000, 8));
449 assert!(sub.is_some());
450 let got = collect(sub.unwrap().into_iter());
451 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a020000, 16), 4),]);
452 }
453
454 #[test]
455 fn covering_diff_mut_find_lpm_value_does_not_require_clone() {
456 let mut a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2), (0x0a010100, 24, 3)]);
457 let b = map_from(&[(0x0a010100, 24, 30)]);
458
459 let got = (&mut a)
460 .view()
461 .covering_difference(b.view())
462 .find_lpm_value(&p(0x0a010180, 25))
463 .map(|(prefix, value)| {
464 *value += 10;
465 (prefix, *value)
466 });
467
468 assert_eq!(got, Some((p(0x0a010000, 16), 12)));
469 assert_eq!(a.get(&p(0x0a010000, 16)), Some(&12));
470 }
471
472 #[test]
476 fn covering_diff_right_shallower_covers() {
477 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
478 let b = map_from(&[(0x0a000000, 8, 99)]);
479 let a_sub = a.view_at(&p(0x0a000000, 8)).unwrap();
480 let b_root = b.view();
481 assert!(a_sub
482 .covering_difference(b_root)
483 .into_iter()
484 .next()
485 .is_none());
486 }
487
488 #[test]
490 fn covering_diff_right_shallower_no_cover() {
491 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
492 let b = map_from(&[(0x0b000000, 8, 99)]);
493 let a_sub = a.view_at(&p(0x0a000000, 8)).unwrap();
494 let b_root = b.view();
495 let got = collect(a_sub.covering_difference(b_root).into_iter());
496 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a010000, 16), 2),]);
497 }
498
499 #[test]
501 fn covering_diff_right_shallower_partial() {
502 let a = map_from(&[
503 (0x0a000000, 8, 1),
504 (0x0a010000, 16, 2), (0x0a020000, 16, 3),
506 ]);
507 let b = map_from(&[(0x0a010000, 16, 99), (0x0b000000, 8, 99)]);
508 let a_sub = a.view_at(&p(0x0a000000, 8)).unwrap();
509 let b_root = b.view();
510 let got = collect(a_sub.covering_difference(b_root).into_iter());
511 assert_eq!(got, vec![(p(0x0a000000, 8), 1), (p(0x0a020000, 16), 3),]);
512 }
513
514 #[test]
517 fn covering_diff_left_shallower_right_deeper() {
518 let a = map_from(&[
519 (0x09000000, 8, 1),
520 (0x0a000000, 8, 2),
521 (0x0a010000, 16, 3), (0x0b000000, 8, 4),
523 ]);
524 let b = map_from(&[(0x0a010000, 16, 99)]);
525 let a_root = a.view();
526 let b_sub = b.view_at(&p(0x0a010000, 16)).unwrap();
527 let got = collect(a_root.covering_difference(b_sub).into_iter());
528 assert_eq!(
529 got,
530 vec![
531 (p(0x09000000, 8), 1),
532 (p(0x0a000000, 8), 2), (p(0x0b000000, 8), 4),
535 ]
536 );
537 }
538
539 #[test]
542 fn covering_diff_composed_with_difference() {
543 let a = map_from(&[
544 (0x0a000000, 8, 1),
545 (0x0a010000, 16, 2),
546 (0x0a010100, 24, 3), (0x0b000000, 8, 4),
548 ]);
549 let b = map_from(&[(0x0a010000, 16, 99)]);
550 let c = map_from(&[(0x0a000000, 8, 99)]);
551
552 let got = collect(
554 a.view()
555 .covering_difference(b.view())
556 .difference(c.view())
557 .into_iter(),
558 );
559 assert_eq!(got, vec![(p(0x0b000000, 8), 4)]);
560 }
561
562 #[test]
563 fn covering_diff_composed_with_intersection() {
564 let a = map_from(&[
565 (0x0a000000, 8, 1),
566 (0x0a010000, 16, 2),
567 (0x0a010100, 24, 3), (0x0b000000, 8, 4),
569 ]);
570 let b = map_from(&[(0x0a010000, 16, 99)]);
571 let c = map_from(&[(0x0a000000, 8, 100), (0x0b000000, 8, 200)]);
572
573 let got: Vec<_> = a
575 .view()
576 .covering_difference(b.view())
577 .intersection(c.view())
578 .unwrap()
579 .into_iter()
580 .map(|(p, (l, r))| (p, *l, *r))
581 .collect();
582 assert_eq!(
583 got,
584 vec![(p(0x0a000000, 8), 1, 100), (p(0x0b000000, 8), 4, 200),]
585 );
586 }
587
588 #[test]
589 fn covering_diff_into_iter_for_loop() {
590 let a = map_from(&[(0x0a000000, 8, 1), (0x0a010000, 16, 2)]);
591 let b = map_from(&[(0x0a010000, 16, 99)]);
592 let mut count = 0;
593 for _ in a.view().covering_difference(b.view()) {
594 count += 1;
595 }
596 assert_eq!(count, 1); }
598
599 #[test]
600 fn view_into_right_child() {
601 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 1, 1), (0x00000000, 2, 2)]);
602 let b = map_from(&[(0x00000000, 0, 0), (0x00000000, 2, 2)]);
603 let b_view = b.view_at(&p(0x00000000, 1)).unwrap();
604 let got = a
605 .view()
606 .covering_difference(b_view)
607 .iter()
608 .collect::<Vec<_>>();
609 let want = vec![(p(0x00000000, 0), &0), (p(0x00000000, 1), &1)];
610 assert_eq!(got, want);
611 }
612
613 #[test]
614 fn view_into_left_child() {
615 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 1, 1), (0x00000000, 2, 2)]);
616 let b = map_from(&[(0x00000000, 2, 2)]);
617 let a_view = a.view_at(&p(0x00000000, 1)).unwrap();
618 let got = a_view
619 .covering_difference(b.view())
620 .iter()
621 .collect::<Vec<_>>();
622 let want = vec![(p(0x00000000, 1), &1)];
623 assert_eq!(got, want);
624 }
625
626 #[test]
627 fn view_into_right_child_deep() {
628 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 5, 5), (0x00000000, 6, 6)]);
629 let b = map_from(&[(0x00000000, 0, 0), (0x00000000, 6, 6)]);
630 let b_view = b.view_at(&p(0x00000000, 5)).unwrap();
631 let got = a
632 .view()
633 .covering_difference(b_view)
634 .iter()
635 .collect::<Vec<_>>();
636 let want = vec![(p(0x00000000, 0), &0), (p(0x00000000, 5), &5)];
637 assert_eq!(got, want);
638 }
639
640 #[test]
641 fn view_into_left_child_deep() {
642 let a = map_from(&[(0x00000000, 0, 0), (0x00000000, 5, 5), (0x00000000, 6, 6)]);
643 let b = map_from(&[(0x00000000, 6, 6)]);
644 let a_view = a.view_at(&p(0x00000000, 5)).unwrap();
645 let got = a_view
646 .covering_difference(b.view())
647 .iter()
648 .collect::<Vec<_>>();
649 let want = vec![(p(0x00000000, 5), &5)];
650 assert_eq!(got, want);
651 }
652}