1use std::collections::BTreeMap;
12
13#[derive(Debug, Default, PartialEq)]
15pub struct RMap {
16 ranges: BTreeMap<u64, u64>,
17}
18
19impl RMap {
20 pub fn new() -> Self {
22 Self {
23 ranges: BTreeMap::new(),
24 }
25 }
26
27 pub fn insert(&mut self, value: u64) {
60 let prev_opt = self
61 .ranges
62 .range(..=value)
63 .next_back()
64 .map(|(&s, &e)| (s, e));
65 let next_opt = match value {
66 u64::MAX => None,
67 _ => self.ranges.range(value + 1..).next().map(|(&s, &e)| (s, e)),
68 };
69
70 match (prev_opt, next_opt) {
71 (Some((p_start, p_end)), Some((n_start, n_end))) => {
72 if value <= p_end {
73 return;
75 }
76 if value == p_end + 1 && value + 1 == n_start {
77 self.ranges.remove(&p_start);
79 self.ranges.remove(&n_start);
80 self.ranges.insert(p_start, n_end);
81 } else if value == p_end + 1 {
82 self.ranges.remove(&p_start);
84 self.ranges.insert(p_start, value);
85 } else if value + 1 == n_start {
86 self.ranges.remove(&n_start);
88 self.ranges.insert(value, n_end);
89 } else {
90 self.ranges.insert(value, value);
92 }
93 }
94 (Some((p_start, p_end)), None) => {
95 if value <= p_end {
96 return;
98 }
99 if value == p_end + 1 {
100 self.ranges.remove(&p_start);
102 self.ranges.insert(p_start, value);
103 } else {
104 self.ranges.insert(value, value);
106 }
107 }
108 (None, Some((n_start, n_end))) => {
109 if value + 1 == n_start {
110 self.ranges.remove(&n_start);
112 self.ranges.insert(value, n_end);
113 } else {
114 self.ranges.insert(value, value);
116 }
117 }
118 (None, None) => {
119 self.ranges.insert(value, value);
121 }
122 }
123 }
124
125 pub fn get(&self, value: &u64) -> Option<(u64, u64)> {
127 if let Some((&start, &end)) = self.ranges.range(..=value).next_back() {
128 if *value <= end {
129 return Some((start, end));
130 }
131 }
132 None
133 }
134
135 pub fn remove(&mut self, start: u64, end: u64) {
170 if start > end {
171 return;
172 }
173
174 let mut to_add = Vec::new();
181 let mut to_remove = Vec::new();
182
183 for (&r_start, &r_end) in self.ranges.iter() {
184 if r_end < start || r_start > end {
186 continue;
187 }
188
189 if start <= r_start && end >= r_end {
191 to_remove.push(r_start);
192 continue;
193 }
194
195 if r_start < start && r_end > end {
197 to_remove.push(r_start);
198 to_add.push((r_start, start - 1));
199 to_add.push((end + 1, r_end));
200 continue;
201 }
202
203 if start <= r_start && end < r_end {
205 to_remove.push(r_start);
207 to_add.push((end + 1, r_end));
208 continue;
209 }
210
211 if start > r_start && end >= r_end {
213 to_remove.push(r_start);
215 to_add.push((r_start, start - 1));
216 continue;
217 }
218 }
219
220 for r_start in to_remove {
222 self.ranges.remove(&r_start);
223 }
224
225 for (a_start, a_end) in to_add {
227 if a_start <= a_end {
228 self.ranges.insert(a_start, a_end);
230 }
231 }
232 }
233
234 pub fn iter(&self) -> impl Iterator<Item = (&u64, &u64)> {
254 self.ranges.iter()
255 }
256
257 pub fn next_gap(&self, value: u64) -> (Option<u64>, Option<u64>) {
301 let current_range_end = match self.ranges.range(..=value).next_back().map(|(_, &end)| end) {
302 Some(end) if end >= value => Some(end),
303 _ => None,
304 };
305
306 let next_range_start = match value {
307 u64::MAX => None,
308 _ => self
309 .ranges
310 .range(value + 1..)
311 .next()
312 .map(|(&start, _)| start),
313 };
314
315 (current_range_end, next_range_start)
316 }
317
318 pub fn missing_items(&self, start: u64, max: usize) -> Vec<u64> {
363 assert!(max > 0, "max must be greater than 0");
365 let mut current = start;
366
367 let mut missing = Vec::with_capacity(max);
369 loop {
370 let (current_range_end, next_range_start) = self.next_gap(current);
372 if let Some(end) = current_range_end {
373 if end == u64::MAX {
375 break missing; }
377 current = end + 1;
378 continue;
379 }
380
381 let Some(next_start) = next_range_start else {
383 break missing; };
385
386 let gap_end = next_start - 1; let items_needed = max - missing.len(); let gap_end = gap_end.min(current.saturating_add(items_needed as u64 - 1));
390 for index in current..=gap_end {
391 missing.push(index);
392 }
393
394 if missing.len() >= max {
396 break missing;
397 }
398
399 current = next_start;
401 }
402 }
403}
404
405#[cfg(test)]
406mod tests {
407 use super::*;
408
409 #[test]
410 fn test_new() {
411 let map = RMap::new();
412 assert_eq!(map.iter().count(), 0);
413 }
414
415 #[test]
416 fn test_insert_empty() {
417 let mut map = RMap::new();
418 map.insert(5);
419 assert_eq!(map.get(&5), Some((5, 5)));
420 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &5)]);
421 }
422
423 #[test]
424 fn test_insert_isolated() {
425 let mut map = RMap::new();
426 map.insert(5);
427 map.insert(10);
428 assert_eq!(map.get(&5), Some((5, 5)));
429 assert_eq!(map.get(&10), Some((10, 10)));
430 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &5), (&10, &10)]);
431 }
432
433 #[test]
434 fn test_insert_covered() {
435 let mut map = RMap::new();
436 map.insert(1);
437 map.insert(2);
438 map.insert(3); map.insert(2); assert_eq!(map.get(&1), Some((1, 3)));
441 assert_eq!(map.get(&2), Some((1, 3)));
442 assert_eq!(map.get(&3), Some((1, 3)));
443 assert_eq!(map.iter().count(), 1);
444 assert_eq!(map.iter().next(), Some((&1, &3)));
445 }
446
447 #[test]
448 fn test_insert_adjacent_end() {
449 let mut map = RMap::new();
450 map.insert(1);
451 map.insert(2); map.insert(3); assert_eq!(map.get(&1), Some((1, 3)));
454 assert_eq!(map.get(&3), Some((1, 3)));
455 assert_eq!(map.iter().next(), Some((&1, &3)));
456 }
457
458 #[test]
459 fn test_insert_adjacent_start() {
460 let mut map = RMap::new();
461 map.insert(2);
462 map.insert(3); map.insert(1); assert_eq!(map.get(&1), Some((1, 3)));
465 assert_eq!(map.get(&3), Some((1, 3)));
466 assert_eq!(map.iter().next(), Some((&1, &3)));
467 }
468
469 #[test]
470 fn test_insert_bridge_ranges() {
471 let mut map = RMap::new();
472 map.insert(1);
473 map.insert(2);
474 assert_eq!(map.get(&1), Some((1, 2)));
475 map.insert(5);
476 map.insert(6);
477 assert_eq!(map.get(&5), Some((5, 6)));
478 map.insert(3); assert_eq!(map.get(&1), Some((1, 3)));
481 assert_eq!(map.get(&2), Some((1, 3)));
482 assert_eq!(map.get(&3), Some((1, 3)));
483 assert_eq!(map.get(&5), Some((5, 6)));
484 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &3), (&5, &6)]);
485
486 map.insert(4); assert_eq!(map.get(&1), Some((1, 6)));
488 assert_eq!(map.get(&3), Some((1, 6)));
489 assert_eq!(map.get(&4), Some((1, 6)));
490 assert_eq!(map.get(&6), Some((1, 6)));
491 assert_eq!(map.iter().count(), 1);
492 assert_eq!(map.iter().next(), Some((&1, &6)));
493 }
494
495 #[test]
496 fn test_insert_complex_merging_and_ordering() {
497 let mut map = RMap::new();
498 map.insert(10); map.insert(12); map.insert(11); assert_eq!(map.get(&10), Some((10, 12)));
502 assert_eq!(map.get(&11), Some((10, 12)));
503 assert_eq!(map.get(&12), Some((10, 12)));
504
505 map.insert(15); map.insert(13); assert_eq!(map.get(&13), Some((10, 13)));
508 assert_eq!(map.get(&12), Some((10, 13)));
509 assert_eq!(map.get(&15), Some((15, 15)));
510
511 map.insert(14); assert_eq!(map.get(&10), Some((10, 15)));
513 assert_eq!(map.get(&14), Some((10, 15)));
514 assert_eq!(map.get(&15), Some((10, 15)));
515 assert_eq!(map.iter().count(), 1);
516 assert_eq!(map.iter().next(), Some((&10, &15)));
517
518 map.insert(5); map.insert(7); map.insert(6); assert_eq!(map.get(&5), Some((5, 7)));
522 assert_eq!(map.get(&6), Some((5, 7)));
523 assert_eq!(map.get(&7), Some((5, 7)));
524 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &7), (&10, &15)]);
525
526 map.insert(9); assert_eq!(map.get(&9), Some((9, 15)));
528 assert_eq!(map.get(&10), Some((9, 15)));
529 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &7), (&9, &15)]);
530
531 map.insert(8); assert_eq!(map.get(&5), Some((5, 15)));
533 assert_eq!(map.get(&8), Some((5, 15)));
534 assert_eq!(map.get(&15), Some((5, 15)));
535 assert_eq!(map.iter().next(), Some((&5, &15)));
536 }
537
538 #[test]
539 fn test_insert_max_value() {
540 let mut map = RMap::new();
541 map.insert(u64::MAX);
542 assert_eq!(map.get(&u64::MAX), Some((u64::MAX, u64::MAX)));
543 map.insert(u64::MAX - 1);
544 assert_eq!(map.get(&(u64::MAX - 1)), Some((u64::MAX - 1, u64::MAX)));
545 assert_eq!(map.get(&u64::MAX), Some((u64::MAX - 1, u64::MAX)));
546 }
547
548 #[test]
549 fn test_get() {
550 let mut map = RMap::new();
551 map.insert(1);
552 map.insert(2);
553 map.insert(3); map.insert(5);
555 map.insert(6); assert_eq!(map.get(&1), Some((1, 3)));
558 assert_eq!(map.get(&2), Some((1, 3)));
559 assert_eq!(map.get(&3), Some((1, 3)));
560 assert_eq!(map.get(&4), None);
561 assert_eq!(map.get(&5), Some((5, 6)));
562 assert_eq!(map.get(&6), Some((5, 6)));
563 assert_eq!(map.get(&0), None);
564 assert_eq!(map.get(&7), None);
565 }
566
567 #[test]
568 fn test_remove_empty() {
569 let mut map = RMap::new();
570 map.remove(1, 5);
571 assert_eq!(map.iter().count(), 0);
572 }
573
574 #[test]
575 fn test_remove_invalid_range() {
576 let mut map = RMap::new();
577 map.insert(1);
578 map.insert(2); map.remove(5, 1); assert_eq!(map.iter().next(), Some((&1, &2)));
581 }
582
583 #[test]
584 fn test_remove_non_existent() {
585 let mut map = RMap::new();
586 map.insert(5);
587 map.insert(6); map.remove(1, 3); assert_eq!(map.iter().next(), Some((&5, &6)));
590 map.remove(8, 10); assert_eq!(map.iter().next(), Some((&5, &6)));
592 map.remove(1, 10); assert_eq!(map.iter().count(), 0);
594 }
595
596 #[test]
597 fn test_remove_exact_match() {
598 let mut map = RMap::new();
599 map.insert(1);
600 map.insert(2);
601 map.insert(3); map.insert(5);
603 map.insert(6); map.remove(1, 3);
605 assert_eq!(map.get(&2), None);
606 assert_eq!(map.iter().next(), Some((&5, &6)));
607 map.remove(5, 6);
608 assert_eq!(map.iter().count(), 0);
609 }
610
611 #[test]
612 fn test_remove_subset_split() {
613 let mut map = RMap::new();
614 map.insert(1);
615 map.insert(2);
616 map.insert(3);
617 map.insert(4);
618 map.insert(5); map.remove(3, 3); assert_eq!(map.get(&2), Some((1, 2)));
621 assert_eq!(map.get(&3), None);
622 assert_eq!(map.get(&4), Some((4, 5)));
623 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &2), (&4, &5)]);
624
625 let mut map2 = RMap::new();
627 map2.insert(1);
628 map2.insert(2);
629 map2.insert(3);
630 map2.insert(4);
631 map2.insert(5); map2.remove(2, 4); assert_eq!(map2.get(&1), Some((1, 1)));
634 assert_eq!(map2.get(&2), None);
635 assert_eq!(map2.get(&3), None);
636 assert_eq!(map2.get(&4), None);
637 assert_eq!(map2.get(&5), Some((5, 5)));
638 assert_eq!(map2.iter().collect::<Vec<_>>(), vec![(&1, &1), (&5, &5)]);
639 }
640
641 #[test]
642 fn test_remove_overlap_start() {
643 let mut map = RMap::new();
644 map.insert(1);
645 map.insert(2);
646 map.insert(3);
647 map.insert(4);
648 map.insert(5); map.remove(0, 2); assert_eq!(map.get(&1), None);
651 assert_eq!(map.get(&2), None);
652 assert_eq!(map.get(&3), Some((3, 5)));
653 assert_eq!(map.iter().next(), Some((&3, &5)));
654 }
655
656 #[test]
657 fn test_remove_overlap_end() {
658 let mut map = RMap::new();
659 map.insert(1);
660 map.insert(2);
661 map.insert(3);
662 map.insert(4);
663 map.insert(5); map.remove(4, 6); assert_eq!(map.get(&3), Some((1, 3)));
666 assert_eq!(map.get(&4), None);
667 assert_eq!(map.get(&5), None);
668 assert_eq!(map.iter().next(), Some((&1, &3)));
669 }
670
671 #[test]
672 fn test_remove_cover_multiple_ranges() {
673 let mut map = RMap::new();
674 map.insert(1);
675 map.insert(2); map.insert(4);
677 map.insert(5); map.insert(7);
679 map.insert(8); map.remove(3, 6); assert_eq!(map.get(&2), Some((1, 2)));
683 assert_eq!(map.get(&4), None);
684 assert_eq!(map.get(&5), None);
685 assert_eq!(map.get(&7), Some((7, 8)));
686 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &2), (&7, &8)]);
687
688 map.remove(0, 10); assert_eq!(map.iter().count(), 0);
690 }
691
692 #[test]
693 fn test_remove_partial_overlap_multiple_ranges() {
694 let mut map = RMap::new();
695 map.insert(1);
696 map.insert(2);
697 map.insert(3); map.insert(5);
699 map.insert(6);
700 map.insert(7); map.insert(9);
702 map.insert(10);
703 map.insert(11); map.remove(2, 6); assert_eq!(map.get(&1), Some((1, 1)));
707 assert_eq!(map.get(&2), None);
708 assert_eq!(map.get(&3), None);
709 assert_eq!(map.get(&5), None);
710 assert_eq!(map.get(&6), None);
711 assert_eq!(map.get(&7), Some((7, 7)));
712 assert_eq!(map.get(&9), Some((9, 11)));
713 assert_eq!(
714 map.iter().collect::<Vec<_>>(),
715 vec![(&1, &1), (&7, &7), (&9, &11)]
716 );
717
718 let mut map2 = RMap::new();
720 map2.insert(1);
721 map2.insert(2);
722 map2.insert(3);
723 map2.insert(5);
724 map2.insert(6);
725 map2.insert(7);
726 map2.insert(9);
727 map2.insert(10);
728 map2.insert(11);
729 map2.remove(0, 20); assert_eq!(map2.iter().count(), 0);
731 }
732
733 #[test]
734 fn test_remove_touching_boundaries_no_merge() {
735 let mut map = RMap::new();
736 map.insert(0);
737 map.insert(1);
738 map.insert(2); map.insert(4);
740 map.insert(5); map.remove(3, 3);
744 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&0, &2), (&4, &5)]);
745 }
746
747 #[test]
748 fn test_remove_max_value_ranges() {
749 let mut map = RMap::new();
750 map.insert(u64::MAX - 2);
751 map.insert(u64::MAX - 1);
752 map.insert(u64::MAX); map.remove(u64::MAX, u64::MAX); assert_eq!(map.get(&(u64::MAX - 2)), Some((u64::MAX - 2, u64::MAX - 1)));
756 assert_eq!(map.get(&u64::MAX), None);
757
758 map.remove(u64::MAX - 2, u64::MAX - 2); assert_eq!(map.get(&(u64::MAX - 2)), None);
760 assert_eq!(map.get(&(u64::MAX - 1)), Some((u64::MAX - 1, u64::MAX - 1)));
761
762 map.remove(u64::MAX - 1, u64::MAX - 1); assert_eq!(map.iter().count(), 0);
764
765 map.insert(u64::MAX - 1);
766 map.insert(u64::MAX); map.remove(u64::MIN, u64::MAX); assert_eq!(map.iter().count(), 0);
769 }
770
771 #[test]
772 fn test_iter() {
773 let mut map = RMap::new();
774 assert_eq!(map.iter().next(), None);
775 map.insert(5);
776 map.insert(6); map.insert(1);
778 map.insert(2); let mut iter = map.iter();
780 assert_eq!(iter.next(), Some((&1, &2)));
781 assert_eq!(iter.next(), Some((&5, &6)));
782 assert_eq!(iter.next(), None);
783 }
784
785 #[test]
786 fn test_next_gap_empty() {
787 let map = RMap::new();
788 assert_eq!(map.next_gap(5), (None, None));
789 }
790
791 #[test]
792 fn test_next_gap_single_range() {
793 let mut map = RMap::new();
794 map.insert(5);
795 map.insert(6);
796 map.insert(7); assert_eq!(map.next_gap(4), (None, Some(5))); assert_eq!(map.next_gap(5), (Some(7), None)); assert_eq!(map.next_gap(6), (Some(7), None)); assert_eq!(map.next_gap(7), (Some(7), None)); assert_eq!(map.next_gap(8), (None, None)); }
803
804 #[test]
805 fn test_next_gap_multiple_ranges() {
806 let mut map = RMap::new();
807 map.insert(1);
808 map.insert(2); map.insert(5);
810 map.insert(6); map.insert(10); assert_eq!(map.next_gap(0), (None, Some(1))); assert_eq!(map.next_gap(1), (Some(2), Some(5))); assert_eq!(map.next_gap(2), (Some(2), Some(5))); assert_eq!(map.next_gap(3), (None, Some(5))); assert_eq!(map.next_gap(4), (None, Some(5))); assert_eq!(map.next_gap(5), (Some(6), Some(10))); assert_eq!(map.next_gap(6), (Some(6), Some(10))); assert_eq!(map.next_gap(7), (None, Some(10))); assert_eq!(map.next_gap(8), (None, Some(10))); assert_eq!(map.next_gap(9), (None, Some(10))); assert_eq!(map.next_gap(10), (Some(10), None)); assert_eq!(map.next_gap(11), (None, None)); }
826
827 #[test]
828 fn test_next_gap_value_is_max() {
829 let mut map = RMap::new();
830 map.insert(u64::MAX - 5);
831 map.insert(u64::MAX - 4); map.insert(u64::MAX - 1);
833 map.insert(u64::MAX); assert_eq!(map.next_gap(u64::MAX - 6), (None, Some(u64::MAX - 5)));
836 assert_eq!(
837 map.next_gap(u64::MAX - 5),
838 (Some(u64::MAX - 4), Some(u64::MAX - 1))
839 );
840 assert_eq!(
841 map.next_gap(u64::MAX - 4),
842 (Some(u64::MAX - 4), Some(u64::MAX - 1))
843 );
844 assert_eq!(map.next_gap(u64::MAX - 3), (None, Some(u64::MAX - 1))); assert_eq!(map.next_gap(u64::MAX - 2), (None, Some(u64::MAX - 1))); assert_eq!(map.next_gap(u64::MAX - 1), (Some(u64::MAX), None));
847 assert_eq!(map.next_gap(u64::MAX), (Some(u64::MAX), None));
848 }
849
850 #[test]
851 fn test_odd_ranges() {
852 let mut map = RMap::new();
854 map.insert(1);
855 map.insert(10);
856 map.insert(11);
857 map.insert(14);
858
859 assert_eq!(map.next_gap(0), (None, Some(1)));
861 assert_eq!(map.next_gap(1), (Some(1), Some(10)));
862 assert_eq!(map.next_gap(10), (Some(11), Some(14)));
863 assert_eq!(map.next_gap(11), (Some(11), Some(14)));
864 assert_eq!(map.next_gap(12), (None, Some(14)));
865 assert_eq!(map.next_gap(14), (Some(14), None));
866 }
867
868 #[test]
869 fn test_missing_items_empty_map() {
870 let map = RMap::new();
871 assert_eq!(map.missing_items(0, 5), Vec::<u64>::new());
872 assert_eq!(map.missing_items(100, 10), Vec::<u64>::new());
873 }
874
875 #[test]
876 fn test_missing_items_single_gap() {
877 let mut map = RMap::new();
878 map.insert(1);
879 map.insert(2); map.insert(5);
881 map.insert(6); assert_eq!(map.missing_items(3, 5), vec![3, 4]);
885 assert_eq!(map.missing_items(3, 2), vec![3, 4]);
886 assert_eq!(map.missing_items(3, 1), vec![3]);
887 assert_eq!(map.missing_items(4, 1), vec![4]);
888 }
889
890 #[test]
891 fn test_missing_items_multiple_gaps() {
892 let mut map = RMap::new();
893 map.insert(1);
894 map.insert(2); map.insert(5);
896 map.insert(6); map.insert(10); assert_eq!(map.missing_items(0, 5), vec![0, 3, 4, 7, 8]);
901 assert_eq!(map.missing_items(0, 6), vec![0, 3, 4, 7, 8, 9]);
902 assert_eq!(map.missing_items(0, 7), vec![0, 3, 4, 7, 8, 9]);
903
904 assert_eq!(map.missing_items(3, 3), vec![3, 4, 7]);
906 assert_eq!(map.missing_items(4, 2), vec![4, 7]);
907
908 assert_eq!(map.missing_items(7, 10), vec![7, 8, 9]);
910 assert_eq!(map.missing_items(8, 2), vec![8, 9]);
911
912 assert_eq!(map.missing_items(11, 5), Vec::<u64>::new());
914 assert_eq!(map.missing_items(100, 10), Vec::<u64>::new());
915 }
916
917 #[test]
918 fn test_missing_items_starting_in_range() {
919 let mut map = RMap::new();
920 map.insert(1);
921 map.insert(2);
922 map.insert(3); map.insert(7);
924 map.insert(8);
925 map.insert(9); assert_eq!(map.missing_items(1, 3), vec![4, 5, 6]);
929 assert_eq!(map.missing_items(2, 4), vec![4, 5, 6]);
930 assert_eq!(map.missing_items(3, 2), vec![4, 5]);
931
932 assert_eq!(map.missing_items(7, 5), Vec::<u64>::new());
934 assert_eq!(map.missing_items(8, 3), Vec::<u64>::new());
935 assert_eq!(map.missing_items(9, 1), Vec::<u64>::new());
936 }
937
938 #[test]
939 #[should_panic]
940 fn test_missing_items_zero_n() {
941 let mut map = RMap::new();
942 map.insert(1);
943 map.insert(5);
944
945 map.missing_items(1, 0);
946 }
947
948 #[test]
949 fn test_missing_items_large_gap() {
950 let mut map = RMap::new();
951 map.insert(1);
952 map.insert(1000);
953
954 assert_eq!(map.missing_items(2, 5), vec![2, 3, 4, 5, 6]);
956 assert_eq!(map.missing_items(995, 5), vec![995, 996, 997, 998, 999]);
957
958 let items = map.missing_items(2, 998);
960 assert_eq!(items.len(), 998);
961 assert_eq!(items[0], 2);
962 assert_eq!(items[997], 999);
963 }
964
965 #[test]
966 fn test_missing_items_at_boundaries() {
967 let mut map = RMap::new();
968 map.insert(5);
969 map.insert(6); map.insert(10); assert_eq!(map.missing_items(5, 3), vec![7, 8, 9]);
974
975 assert_eq!(map.missing_items(6, 3), vec![7, 8, 9]);
977
978 assert_eq!(map.missing_items(10, 5), Vec::<u64>::new());
980 }
981
982 #[test]
983 fn test_missing_items_near_max() {
984 let mut map = RMap::new();
985 map.insert(u64::MAX - 5);
986 map.insert(u64::MAX - 3);
987 map.insert(u64::MAX);
988
989 assert_eq!(
991 map.missing_items(u64::MAX - 6, 5),
992 vec![u64::MAX - 6, u64::MAX - 4, u64::MAX - 2, u64::MAX - 1]
993 );
994 assert_eq!(
995 map.missing_items(u64::MAX - 4, 3),
996 vec![u64::MAX - 4, u64::MAX - 2, u64::MAX - 1]
997 );
998
999 assert_eq!(map.missing_items(u64::MAX, 5), Vec::<u64>::new());
1001 }
1002
1003 #[test]
1004 fn test_missing_items_contiguous_ranges() {
1005 let mut map = RMap::new();
1006 map.insert(1);
1007 map.insert(2);
1008 map.insert(3); map.insert(4);
1010 map.insert(5);
1011 map.insert(6); assert_eq!(map.missing_items(0, 3), vec![0]);
1015 assert_eq!(map.missing_items(7, 5), Vec::<u64>::new());
1016 }
1017}