1use std::collections::BTreeMap;
12
13#[derive(Debug, Default, PartialEq)]
15pub struct RMap {
16 ranges: BTreeMap<u64, u64>,
17}
18
19impl RMap {
20 pub const 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 && *value <= end
129 {
130 return Some((start, end));
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 overlapping: Vec<(u64, u64)> = self
176 .iter_from(start)
177 .take_while(|&(&r_start, _)| r_start <= end)
178 .map(|(&r_start, &r_end)| (r_start, r_end))
179 .collect();
180
181 for (r_start, r_end) in overlapping {
183 self.ranges.remove(&r_start);
184 if r_start < start {
185 self.ranges.insert(r_start, start - 1);
186 }
187 if r_end > end {
188 self.ranges.insert(end + 1, r_end);
189 }
190 }
191 }
192
193 pub fn iter(&self) -> impl Iterator<Item = (&u64, &u64)> {
213 self.ranges.iter()
214 }
215
216 pub fn iter_from(&self, from: u64) -> impl Iterator<Item = (&u64, &u64)> {
241 let candidate = self
243 .ranges
244 .range(..=from)
245 .next_back()
246 .filter(|&(_, &end)| end >= from);
247
248 let tail = match from {
250 u64::MAX => None,
251 _ => Some(self.ranges.range(from + 1..)),
252 };
253 candidate.into_iter().chain(tail.into_iter().flatten())
254 }
255
256 pub fn first_index(&self) -> Option<u64> {
271 self.ranges.first_key_value().map(|(&start, _)| start)
272 }
273
274 pub fn last_index(&self) -> Option<u64> {
289 self.ranges.last_key_value().map(|(_, &end)| end)
290 }
291
292 pub fn next_gap(&self, value: u64) -> (Option<u64>, Option<u64>) {
336 let current_range_end = match self.ranges.range(..=value).next_back().map(|(_, &end)| end) {
337 Some(end) if end >= value => Some(end),
338 _ => None,
339 };
340
341 let next_range_start = match value {
342 u64::MAX => None,
343 _ => self
344 .ranges
345 .range(value + 1..)
346 .next()
347 .map(|(&start, _)| start),
348 };
349
350 (current_range_end, next_range_start)
351 }
352
353 pub fn missing_items(&self, start: u64, max: usize) -> Vec<u64> {
397 assert!(max > 0, "max must be greater than 0");
399 let mut missing = Vec::with_capacity(max);
400
401 let mut current = start;
403 for (&r_start, &r_end) in self.iter_from(start) {
404 missing.extend((current..r_start).take(max - missing.len()));
405 if missing.len() == max {
406 break;
407 }
408 let Some(next) = r_end.checked_add(1) else {
409 break;
410 };
411 current = next;
412 }
413 missing
414 }
415}
416
417#[cfg(test)]
418mod tests {
419 use super::*;
420
421 #[test]
422 fn test_new() {
423 let map = RMap::new();
424 assert_eq!(map.iter().count(), 0);
425 }
426
427 #[test]
428 fn test_insert_empty() {
429 let mut map = RMap::new();
430 map.insert(5);
431 assert_eq!(map.get(&5), Some((5, 5)));
432 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &5)]);
433 }
434
435 #[test]
436 fn test_insert_isolated() {
437 let mut map = RMap::new();
438 map.insert(5);
439 map.insert(10);
440 assert_eq!(map.get(&5), Some((5, 5)));
441 assert_eq!(map.get(&10), Some((10, 10)));
442 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &5), (&10, &10)]);
443 }
444
445 #[test]
446 fn test_insert_covered() {
447 let mut map = RMap::new();
448 map.insert(1);
449 map.insert(2);
450 map.insert(3); map.insert(2); assert_eq!(map.get(&1), Some((1, 3)));
453 assert_eq!(map.get(&2), Some((1, 3)));
454 assert_eq!(map.get(&3), Some((1, 3)));
455 assert_eq!(map.iter().count(), 1);
456 assert_eq!(map.iter().next(), Some((&1, &3)));
457 }
458
459 #[test]
460 fn test_insert_adjacent_end() {
461 let mut map = RMap::new();
462 map.insert(1);
463 map.insert(2); map.insert(3); assert_eq!(map.get(&1), Some((1, 3)));
466 assert_eq!(map.get(&3), Some((1, 3)));
467 assert_eq!(map.iter().next(), Some((&1, &3)));
468 }
469
470 #[test]
471 fn test_insert_adjacent_start() {
472 let mut map = RMap::new();
473 map.insert(2);
474 map.insert(3); map.insert(1); assert_eq!(map.get(&1), Some((1, 3)));
477 assert_eq!(map.get(&3), Some((1, 3)));
478 assert_eq!(map.iter().next(), Some((&1, &3)));
479 }
480
481 #[test]
482 fn test_insert_bridge_ranges() {
483 let mut map = RMap::new();
484 map.insert(1);
485 map.insert(2);
486 assert_eq!(map.get(&1), Some((1, 2)));
487 map.insert(5);
488 map.insert(6);
489 assert_eq!(map.get(&5), Some((5, 6)));
490 map.insert(3); assert_eq!(map.get(&1), Some((1, 3)));
493 assert_eq!(map.get(&2), Some((1, 3)));
494 assert_eq!(map.get(&3), Some((1, 3)));
495 assert_eq!(map.get(&5), Some((5, 6)));
496 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &3), (&5, &6)]);
497
498 map.insert(4); assert_eq!(map.get(&1), Some((1, 6)));
500 assert_eq!(map.get(&3), Some((1, 6)));
501 assert_eq!(map.get(&4), Some((1, 6)));
502 assert_eq!(map.get(&6), Some((1, 6)));
503 assert_eq!(map.iter().count(), 1);
504 assert_eq!(map.iter().next(), Some((&1, &6)));
505 }
506
507 #[test]
508 fn test_insert_complex_merging_and_ordering() {
509 let mut map = RMap::new();
510 map.insert(10); map.insert(12); map.insert(11); assert_eq!(map.get(&10), Some((10, 12)));
514 assert_eq!(map.get(&11), Some((10, 12)));
515 assert_eq!(map.get(&12), Some((10, 12)));
516
517 map.insert(15); map.insert(13); assert_eq!(map.get(&13), Some((10, 13)));
520 assert_eq!(map.get(&12), Some((10, 13)));
521 assert_eq!(map.get(&15), Some((15, 15)));
522
523 map.insert(14); assert_eq!(map.get(&10), Some((10, 15)));
525 assert_eq!(map.get(&14), Some((10, 15)));
526 assert_eq!(map.get(&15), Some((10, 15)));
527 assert_eq!(map.iter().count(), 1);
528 assert_eq!(map.iter().next(), Some((&10, &15)));
529
530 map.insert(5); map.insert(7); map.insert(6); assert_eq!(map.get(&5), Some((5, 7)));
534 assert_eq!(map.get(&6), Some((5, 7)));
535 assert_eq!(map.get(&7), Some((5, 7)));
536 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &7), (&10, &15)]);
537
538 map.insert(9); assert_eq!(map.get(&9), Some((9, 15)));
540 assert_eq!(map.get(&10), Some((9, 15)));
541 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&5, &7), (&9, &15)]);
542
543 map.insert(8); assert_eq!(map.get(&5), Some((5, 15)));
545 assert_eq!(map.get(&8), Some((5, 15)));
546 assert_eq!(map.get(&15), Some((5, 15)));
547 assert_eq!(map.iter().next(), Some((&5, &15)));
548 }
549
550 #[test]
551 fn test_insert_max_value() {
552 let mut map = RMap::new();
553 map.insert(u64::MAX);
554 assert_eq!(map.get(&u64::MAX), Some((u64::MAX, u64::MAX)));
555 map.insert(u64::MAX - 1);
556 assert_eq!(map.get(&(u64::MAX - 1)), Some((u64::MAX - 1, u64::MAX)));
557 assert_eq!(map.get(&u64::MAX), Some((u64::MAX - 1, u64::MAX)));
558 }
559
560 #[test]
561 fn test_get() {
562 let mut map = RMap::new();
563 map.insert(1);
564 map.insert(2);
565 map.insert(3); map.insert(5);
567 map.insert(6); assert_eq!(map.get(&1), Some((1, 3)));
570 assert_eq!(map.get(&2), Some((1, 3)));
571 assert_eq!(map.get(&3), Some((1, 3)));
572 assert_eq!(map.get(&4), None);
573 assert_eq!(map.get(&5), Some((5, 6)));
574 assert_eq!(map.get(&6), Some((5, 6)));
575 assert_eq!(map.get(&0), None);
576 assert_eq!(map.get(&7), None);
577 }
578
579 #[test]
580 fn test_remove_empty() {
581 let mut map = RMap::new();
582 map.remove(1, 5);
583 assert_eq!(map.iter().count(), 0);
584 }
585
586 #[test]
587 fn test_remove_invalid_range() {
588 let mut map = RMap::new();
589 map.insert(1);
590 map.insert(2); map.remove(5, 1); assert_eq!(map.iter().next(), Some((&1, &2)));
593 }
594
595 #[test]
596 fn test_remove_non_existent() {
597 let mut map = RMap::new();
598 map.insert(5);
599 map.insert(6); map.remove(1, 3); assert_eq!(map.iter().next(), Some((&5, &6)));
602 map.remove(8, 10); assert_eq!(map.iter().next(), Some((&5, &6)));
604 map.remove(1, 10); assert_eq!(map.iter().count(), 0);
606 }
607
608 #[test]
609 fn test_remove_exact_match() {
610 let mut map = RMap::new();
611 map.insert(1);
612 map.insert(2);
613 map.insert(3); map.insert(5);
615 map.insert(6); map.remove(1, 3);
617 assert_eq!(map.get(&2), None);
618 assert_eq!(map.iter().next(), Some((&5, &6)));
619 map.remove(5, 6);
620 assert_eq!(map.iter().count(), 0);
621 }
622
623 #[test]
624 fn test_remove_subset_split() {
625 let mut map = RMap::new();
626 map.insert(1);
627 map.insert(2);
628 map.insert(3);
629 map.insert(4);
630 map.insert(5); map.remove(3, 3); assert_eq!(map.get(&2), Some((1, 2)));
633 assert_eq!(map.get(&3), None);
634 assert_eq!(map.get(&4), Some((4, 5)));
635 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &2), (&4, &5)]);
636
637 let mut map2 = RMap::new();
639 map2.insert(1);
640 map2.insert(2);
641 map2.insert(3);
642 map2.insert(4);
643 map2.insert(5); map2.remove(2, 4); assert_eq!(map2.get(&1), Some((1, 1)));
646 assert_eq!(map2.get(&2), None);
647 assert_eq!(map2.get(&3), None);
648 assert_eq!(map2.get(&4), None);
649 assert_eq!(map2.get(&5), Some((5, 5)));
650 assert_eq!(map2.iter().collect::<Vec<_>>(), vec![(&1, &1), (&5, &5)]);
651 }
652
653 #[test]
654 fn test_remove_overlap_start() {
655 let mut map = RMap::new();
656 map.insert(1);
657 map.insert(2);
658 map.insert(3);
659 map.insert(4);
660 map.insert(5); map.remove(0, 2); assert_eq!(map.get(&1), None);
663 assert_eq!(map.get(&2), None);
664 assert_eq!(map.get(&3), Some((3, 5)));
665 assert_eq!(map.iter().next(), Some((&3, &5)));
666 }
667
668 #[test]
669 fn test_remove_overlap_end() {
670 let mut map = RMap::new();
671 map.insert(1);
672 map.insert(2);
673 map.insert(3);
674 map.insert(4);
675 map.insert(5); map.remove(4, 6); assert_eq!(map.get(&3), Some((1, 3)));
678 assert_eq!(map.get(&4), None);
679 assert_eq!(map.get(&5), None);
680 assert_eq!(map.iter().next(), Some((&1, &3)));
681 }
682
683 #[test]
684 fn test_remove_cover_multiple_ranges() {
685 let mut map = RMap::new();
686 map.insert(1);
687 map.insert(2); map.insert(4);
689 map.insert(5); map.insert(7);
691 map.insert(8); map.remove(3, 6); assert_eq!(map.get(&2), Some((1, 2)));
695 assert_eq!(map.get(&4), None);
696 assert_eq!(map.get(&5), None);
697 assert_eq!(map.get(&7), Some((7, 8)));
698 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&1, &2), (&7, &8)]);
699
700 map.remove(0, 10); assert_eq!(map.iter().count(), 0);
702 }
703
704 #[test]
705 fn test_remove_partial_overlap_multiple_ranges() {
706 let mut map = RMap::new();
707 map.insert(1);
708 map.insert(2);
709 map.insert(3); map.insert(5);
711 map.insert(6);
712 map.insert(7); map.insert(9);
714 map.insert(10);
715 map.insert(11); map.remove(2, 6); assert_eq!(map.get(&1), Some((1, 1)));
719 assert_eq!(map.get(&2), None);
720 assert_eq!(map.get(&3), None);
721 assert_eq!(map.get(&5), None);
722 assert_eq!(map.get(&6), None);
723 assert_eq!(map.get(&7), Some((7, 7)));
724 assert_eq!(map.get(&9), Some((9, 11)));
725 assert_eq!(
726 map.iter().collect::<Vec<_>>(),
727 vec![(&1, &1), (&7, &7), (&9, &11)]
728 );
729
730 let mut map2 = RMap::new();
732 map2.insert(1);
733 map2.insert(2);
734 map2.insert(3);
735 map2.insert(5);
736 map2.insert(6);
737 map2.insert(7);
738 map2.insert(9);
739 map2.insert(10);
740 map2.insert(11);
741 map2.remove(0, 20); assert_eq!(map2.iter().count(), 0);
743 }
744
745 #[test]
746 fn test_remove_touching_boundaries_no_merge() {
747 let mut map = RMap::new();
748 map.insert(0);
749 map.insert(1);
750 map.insert(2); map.insert(4);
752 map.insert(5); map.remove(3, 3);
756 assert_eq!(map.iter().collect::<Vec<_>>(), vec![(&0, &2), (&4, &5)]);
757 }
758
759 #[test]
760 fn test_remove_max_value_ranges() {
761 let mut map = RMap::new();
762 map.insert(u64::MAX - 2);
763 map.insert(u64::MAX - 1);
764 map.insert(u64::MAX); map.remove(u64::MAX, u64::MAX); assert_eq!(map.get(&(u64::MAX - 2)), Some((u64::MAX - 2, u64::MAX - 1)));
768 assert_eq!(map.get(&u64::MAX), None);
769
770 map.remove(u64::MAX - 2, u64::MAX - 2); assert_eq!(map.get(&(u64::MAX - 2)), None);
772 assert_eq!(map.get(&(u64::MAX - 1)), Some((u64::MAX - 1, u64::MAX - 1)));
773
774 map.remove(u64::MAX - 1, u64::MAX - 1); assert_eq!(map.iter().count(), 0);
776
777 map.insert(u64::MAX - 1);
778 map.insert(u64::MAX); map.remove(u64::MIN, u64::MAX); assert_eq!(map.iter().count(), 0);
781 }
782
783 #[test]
784 fn test_iter() {
785 let mut map = RMap::new();
786 assert_eq!(map.iter().next(), None);
787 map.insert(5);
788 map.insert(6); map.insert(1);
790 map.insert(2); let mut iter = map.iter();
792 assert_eq!(iter.next(), Some((&1, &2)));
793 assert_eq!(iter.next(), Some((&5, &6)));
794 assert_eq!(iter.next(), None);
795 }
796
797 #[test]
798 fn test_first_index() {
799 let mut map = RMap::new();
800 assert_eq!(map.first_index(), None);
801
802 map.insert(5);
803 map.insert(6); assert_eq!(map.first_index(), Some(5));
805
806 map.insert(1); assert_eq!(map.first_index(), Some(1));
808
809 map.remove(0, 4); assert_eq!(map.first_index(), Some(5));
811
812 map.remove(5, 6); assert_eq!(map.first_index(), None);
814 }
815
816 #[test]
817 fn test_last_index() {
818 let mut map = RMap::new();
819 assert_eq!(map.last_index(), None);
820
821 map.insert(1);
822 map.insert(2); assert_eq!(map.last_index(), Some(2));
824
825 map.insert(5); assert_eq!(map.last_index(), Some(5));
827
828 map.insert(6); assert_eq!(map.last_index(), Some(6));
830
831 map.remove(5, 10); assert_eq!(map.last_index(), Some(2));
833
834 map.remove(0, 2); assert_eq!(map.last_index(), None);
836 }
837
838 #[test]
839 fn test_next_gap_empty() {
840 let map = RMap::new();
841 assert_eq!(map.next_gap(5), (None, None));
842 }
843
844 #[test]
845 fn test_next_gap_single_range() {
846 let mut map = RMap::new();
847 map.insert(5);
848 map.insert(6);
849 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)); }
856
857 #[test]
858 fn test_next_gap_multiple_ranges() {
859 let mut map = RMap::new();
860 map.insert(1);
861 map.insert(2); map.insert(5);
863 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)); }
879
880 #[test]
881 fn test_next_gap_value_is_max() {
882 let mut map = RMap::new();
883 map.insert(u64::MAX - 5);
884 map.insert(u64::MAX - 4); map.insert(u64::MAX - 1);
886 map.insert(u64::MAX); assert_eq!(map.next_gap(u64::MAX - 6), (None, Some(u64::MAX - 5)));
889 assert_eq!(
890 map.next_gap(u64::MAX - 5),
891 (Some(u64::MAX - 4), Some(u64::MAX - 1))
892 );
893 assert_eq!(
894 map.next_gap(u64::MAX - 4),
895 (Some(u64::MAX - 4), Some(u64::MAX - 1))
896 );
897 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));
900 assert_eq!(map.next_gap(u64::MAX), (Some(u64::MAX), None));
901 }
902
903 #[test]
904 fn test_odd_ranges() {
905 let mut map = RMap::new();
907 map.insert(1);
908 map.insert(10);
909 map.insert(11);
910 map.insert(14);
911
912 assert_eq!(map.next_gap(0), (None, Some(1)));
914 assert_eq!(map.next_gap(1), (Some(1), Some(10)));
915 assert_eq!(map.next_gap(10), (Some(11), Some(14)));
916 assert_eq!(map.next_gap(11), (Some(11), Some(14)));
917 assert_eq!(map.next_gap(12), (None, Some(14)));
918 assert_eq!(map.next_gap(14), (Some(14), None));
919 }
920
921 #[test]
922 fn test_missing_items_empty_map() {
923 let map = RMap::new();
924 assert_eq!(map.missing_items(0, 5), Vec::<u64>::new());
925 assert_eq!(map.missing_items(100, 10), Vec::<u64>::new());
926 }
927
928 #[test]
929 fn test_missing_items_single_gap() {
930 let mut map = RMap::new();
931 map.insert(1);
932 map.insert(2); map.insert(5);
934 map.insert(6); assert_eq!(map.missing_items(3, 5), vec![3, 4]);
938 assert_eq!(map.missing_items(3, 2), vec![3, 4]);
939 assert_eq!(map.missing_items(3, 1), vec![3]);
940 assert_eq!(map.missing_items(4, 1), vec![4]);
941 }
942
943 #[test]
944 fn test_missing_items_multiple_gaps() {
945 let mut map = RMap::new();
946 map.insert(1);
947 map.insert(2); map.insert(5);
949 map.insert(6); map.insert(10); assert_eq!(map.missing_items(0, 5), vec![0, 3, 4, 7, 8]);
954 assert_eq!(map.missing_items(0, 6), vec![0, 3, 4, 7, 8, 9]);
955 assert_eq!(map.missing_items(0, 7), vec![0, 3, 4, 7, 8, 9]);
956
957 assert_eq!(map.missing_items(3, 3), vec![3, 4, 7]);
959 assert_eq!(map.missing_items(4, 2), vec![4, 7]);
960
961 assert_eq!(map.missing_items(7, 10), vec![7, 8, 9]);
963 assert_eq!(map.missing_items(8, 2), vec![8, 9]);
964
965 assert_eq!(map.missing_items(11, 5), Vec::<u64>::new());
967 assert_eq!(map.missing_items(100, 10), Vec::<u64>::new());
968 }
969
970 #[test]
971 fn test_missing_items_starting_in_range() {
972 let mut map = RMap::new();
973 map.insert(1);
974 map.insert(2);
975 map.insert(3); map.insert(7);
977 map.insert(8);
978 map.insert(9); assert_eq!(map.missing_items(1, 3), vec![4, 5, 6]);
982 assert_eq!(map.missing_items(2, 4), vec![4, 5, 6]);
983 assert_eq!(map.missing_items(3, 2), vec![4, 5]);
984
985 assert_eq!(map.missing_items(7, 5), Vec::<u64>::new());
987 assert_eq!(map.missing_items(8, 3), Vec::<u64>::new());
988 assert_eq!(map.missing_items(9, 1), Vec::<u64>::new());
989 }
990
991 #[test]
992 #[should_panic]
993 fn test_missing_items_zero_n() {
994 let mut map = RMap::new();
995 map.insert(1);
996 map.insert(5);
997
998 map.missing_items(1, 0);
999 }
1000
1001 #[test]
1002 fn test_missing_items_large_gap() {
1003 let mut map = RMap::new();
1004 map.insert(1);
1005 map.insert(1000);
1006
1007 assert_eq!(map.missing_items(2, 5), vec![2, 3, 4, 5, 6]);
1009 assert_eq!(map.missing_items(995, 5), vec![995, 996, 997, 998, 999]);
1010
1011 let items = map.missing_items(2, 998);
1013 assert_eq!(items.len(), 998);
1014 assert_eq!(items[0], 2);
1015 assert_eq!(items[997], 999);
1016 }
1017
1018 #[test]
1019 fn test_missing_items_at_boundaries() {
1020 let mut map = RMap::new();
1021 map.insert(5);
1022 map.insert(6); map.insert(10); assert_eq!(map.missing_items(5, 3), vec![7, 8, 9]);
1027
1028 assert_eq!(map.missing_items(6, 3), vec![7, 8, 9]);
1030
1031 assert_eq!(map.missing_items(10, 5), Vec::<u64>::new());
1033 }
1034
1035 #[test]
1036 fn test_missing_items_near_max() {
1037 let mut map = RMap::new();
1038 map.insert(u64::MAX - 5);
1039 map.insert(u64::MAX - 3);
1040 map.insert(u64::MAX);
1041
1042 assert_eq!(
1044 map.missing_items(u64::MAX - 6, 5),
1045 vec![u64::MAX - 6, u64::MAX - 4, u64::MAX - 2, u64::MAX - 1]
1046 );
1047 assert_eq!(
1048 map.missing_items(u64::MAX - 4, 3),
1049 vec![u64::MAX - 4, u64::MAX - 2, u64::MAX - 1]
1050 );
1051
1052 assert_eq!(map.missing_items(u64::MAX, 5), Vec::<u64>::new());
1054 }
1055
1056 #[test]
1057 fn test_missing_items_range_ending_at_max() {
1058 let mut map = RMap::new();
1059 map.insert(u64::MAX - 2);
1060 map.insert(u64::MAX - 1);
1061 map.insert(u64::MAX); assert_eq!(map.missing_items(u64::MAX - 2, 3), Vec::<u64>::new());
1064 assert_eq!(map.missing_items(u64::MAX - 1, 3), Vec::<u64>::new());
1065 assert_eq!(map.missing_items(u64::MAX, 3), Vec::<u64>::new());
1066 }
1067
1068 #[test]
1069 fn test_missing_items_contiguous_ranges() {
1070 let mut map = RMap::new();
1071 map.insert(1);
1072 map.insert(2);
1073 map.insert(3); map.insert(4);
1075 map.insert(5);
1076 map.insert(6); assert_eq!(map.missing_items(0, 3), vec![0]);
1080 assert_eq!(map.missing_items(7, 5), Vec::<u64>::new());
1081 }
1082}