1use crate::util::Interval;
2use std::cmp::Ord;
3use std::fmt::Debug;
4use std::ops::Bound;
5use std::ops::Bound::*;
6use std::rc::Rc;
7
8#[derive(Hash)]
9struct Node<T: Ord> {
10 interval: Option<Interval<T>>,
11 max: Option<Rc<Bound<T>>>,
12 height: usize,
13 size: usize,
14 left_child: Option<Box<Node<T>>>,
15 right_child: Option<Box<Node<T>>>,
16}
17
18impl<T: Ord> Node<T> {
19 fn init(interval: Interval<T>, max: Rc<Bound<T>>, height: usize, size: usize) -> Node<T> {
20 Node {
21 interval: Some(interval),
22 max: Some(max),
23 height: height,
24 size: size,
25 left_child: None,
26 right_child: None,
27 }
28 }
29
30 fn interval(&self) -> &Interval<T> {
31 &self.interval.as_ref().unwrap()
32 }
33
34 fn get_interval(&mut self) -> Interval<T> {
35 self.interval.take().unwrap()
36 }
37
38 fn get_max(&self) -> Rc<Bound<T>> {
39 Rc::clone(&self.max.as_ref().unwrap())
40 }
41
42 fn update_height(&mut self) {
43 self.height = (1 + Node::_max_height(&self.left_child, &self.right_child)) as usize;
44 }
45
46 fn update_size(&mut self) {
47 self.size = 1 + Node::size(&self.left_child) + Node::size(&self.right_child);
48 }
49
50 fn update_max(&mut self) {
51 let max = match (&self.left_child, &self.right_child) {
52 (Some(_left_child), Some(_right_child)) => Node::find_max(
53 self.interval().get_high(),
54 Node::find_max(_left_child.get_max(), _right_child.get_max()),
55 ),
56 (Some(_left_child), None) => {
57 Node::find_max(self.interval().get_high(), _left_child.get_max())
58 }
59 (None, Some(_right_child)) => {
60 Node::find_max(self.interval().get_high(), _right_child.get_max())
61 }
62 (None, None) => self.interval().get_high(),
63 };
64
65 self.max = Some(Rc::clone(&max));
66 }
67
68 fn find_max(bound1: Rc<Bound<T>>, bound2: Rc<Bound<T>>) -> Rc<Bound<T>> {
69 match (bound1.as_ref(), bound2.as_ref()) {
70 (Included(_val1), Included(_val2))
71 | (Included(_val1), Excluded(_val2))
72 | (Excluded(_val1), Excluded(_val2)) => {
73 if _val1 >= _val2 {
74 bound1
75 } else {
76 bound2
77 }
78 }
79 (Excluded(_val1), Included(_val2)) => {
80 if _val1 > _val2 {
81 bound1
82 } else {
83 bound2
84 }
85 }
86 (Unbounded, _) => bound1,
87 (_, Unbounded) => bound2,
88 }
89 }
90
91 fn is_ge(bound1: Rc<Bound<T>>, bound2: Rc<Bound<T>>) -> bool {
92 match (bound1.as_ref(), bound2.as_ref()) {
93 (Included(_val1), Included(_val2)) => _val1 >= _val2,
94 (Included(_val1), Excluded(_val2)) => _val1 > _val2,
95 (Excluded(_val1), Included(_val2)) => _val1 > _val2,
96 (Excluded(_val1), Excluded(_val2)) => _val1 > _val2,
97
98 (Unbounded, Included(_val2)) => true,
99 (Unbounded, Excluded(_val2)) => true,
100 (Included(_val1), Unbounded) => true,
101 (Excluded(_val1), Unbounded) => true,
102
103 (Unbounded, Unbounded) => true,
104 }
105 }
106
107 fn _max_height(node1: &Option<Box<Node<T>>>, node2: &Option<Box<Node<T>>>) -> i64 {
108 std::cmp::max(Node::height(node1), Node::height(node2))
109 }
110
111 fn height(node: &Option<Box<Node<T>>>) -> i64 {
112 match node {
113 Some(_node) => _node.height as i64,
114 None => -1,
115 }
116 }
117
118 fn size(node: &Option<Box<Node<T>>>) -> usize {
119 match node {
120 Some(_node) => _node.size,
121 None => 0,
122 }
123 }
124
125 fn balance_factor(node: &Box<Node<T>>) -> i64 {
126 Node::height(&node.left_child) - Node::height(&node.right_child)
127 }
128}
129
130#[derive(Hash)]
180pub struct IntervalTree<T: Ord> {
181 root: Option<Box<Node<T>>>,
182}
183
184impl<T: Ord> IntervalTree<T> {
185 pub fn init() -> IntervalTree<T> {
194 IntervalTree { root: None }
195 }
196
197 pub fn is_empty(&self) -> bool {
199 self.root.is_none()
200 }
201
202 pub fn size(&self) -> usize {
204 Node::size(&self.root)
205 }
206
207 pub fn height(&self) -> i64 {
209 Node::height(&self.root)
210 }
211
212 pub fn overlaps(&self, interval: &Interval<T>) -> bool {
234 self.find_overlap(interval).is_some()
235 }
236
237 pub fn find_overlap(&self, interval: &Interval<T>) -> Option<Interval<T>> {
271 IntervalTree::_find_overlap(&self.root, interval)
272 }
273
274 fn _find_overlap(node: &Option<Box<Node<T>>>, interval: &Interval<T>) -> Option<Interval<T>> {
275 if node.is_none() {
276 return None;
277 }
278 let mut current = node;
279 while current.is_some() {
280 let node_ref = current.as_ref().unwrap();
281 if Interval::overlaps(node_ref.interval(), interval) {
282 break;
283 }
284
285 if node_ref.left_child.is_some()
286 && Node::is_ge(
287 node_ref.left_child.as_ref().unwrap().get_max(),
288 interval.get_low(),
289 )
290 {
291 current = &node_ref.left_child;
292 } else {
293 current = &node_ref.right_child;
294 }
295 }
296
297 if current.is_none() {
298 None
299 } else {
300 Some(current.as_ref().unwrap().interval().duplicate())
301 }
302 }
303
304 pub fn find_overlaps(&self, interval: &Interval<T>) -> Vec<Interval<T>> {
335 let mut overlaps = Vec::<Interval<T>>::new();
336
337 IntervalTree::_find_overlaps(&self.root, interval, &mut overlaps);
338
339 overlaps
340 }
341
342 fn _find_overlaps(
343 node: &Option<Box<Node<T>>>,
344 interval: &Interval<T>,
345 overlaps: &mut Vec<Interval<T>>,
346 ) {
347 if node.is_none() {
348 return;
349 }
350 let node_ref = node.as_ref().unwrap();
351 if Interval::overlaps(node_ref.interval(), interval) {
352 overlaps.push(node_ref.interval().duplicate());
353 }
354
355 if node_ref.left_child.is_some()
356 && Node::is_ge(
357 node_ref.left_child.as_ref().unwrap().get_max(),
358 interval.get_low(),
359 )
360 {
361 IntervalTree::_find_overlaps(&node_ref.left_child, interval, overlaps);
362 }
363 IntervalTree::_find_overlaps(&node_ref.right_child, interval, overlaps);
364 }
365
366 pub fn insert(&mut self, interval: Interval<T>) {
392 let max = interval.get_high();
393
394 self.root = IntervalTree::_insert(self.root.take(), interval, max);
395 }
396
397 fn _insert(
398 node: Option<Box<Node<T>>>,
399 interval: Interval<T>,
400 max: Rc<Bound<T>>,
401 ) -> Option<Box<Node<T>>> {
402 if node.is_none() {
403 return Some(Box::new(Node::init(interval, max, 0, 1)));
404 }
405
406 let mut node_ref = node.unwrap();
407
408 if interval < *node_ref.interval() {
409 node_ref.left_child = IntervalTree::_insert(node_ref.left_child, interval, max);
410 } else if interval > *node_ref.interval() {
411 node_ref.right_child = IntervalTree::_insert(node_ref.right_child, interval, max);
412 } else {
413 return Some(node_ref);
414 }
415
416 node_ref.update_height();
417 node_ref.update_size();
418 node_ref.update_max();
419
420 Some(IntervalTree::balance(node_ref))
421 }
422
423 fn balance(mut node: Box<Node<T>>) -> Box<Node<T>> {
424 if Node::balance_factor(&node) < -1 {
425 if Node::balance_factor(node.right_child.as_ref().unwrap()) > 0 {
426 node.right_child = Some(IntervalTree::rotate_right(node.right_child.unwrap()));
427 }
428 node = IntervalTree::rotate_left(node);
429 } else if Node::balance_factor(&node) > 1 {
430 if Node::balance_factor(node.left_child.as_ref().unwrap()) < 0 {
431 node.left_child = Some(IntervalTree::rotate_left(node.left_child.unwrap()));
432 }
433 node = IntervalTree::rotate_right(node);
434 }
435 node
436 }
437
438 fn rotate_right(mut node: Box<Node<T>>) -> Box<Node<T>> {
439 let mut y = node.left_child.unwrap();
440 node.left_child = y.right_child;
441 y.size = node.size;
442 node.update_height();
443 node.update_size();
444 node.update_max();
445
446 y.right_child = Some(node);
447 y.update_height();
448 y.update_max();
449
450 y
451 }
452
453 fn rotate_left(mut node: Box<Node<T>>) -> Box<Node<T>> {
454 let mut y = node.right_child.unwrap();
455 node.right_child = y.left_child;
456 y.size = node.size;
457
458 node.update_height();
459 node.update_size();
460 node.update_max();
461
462 y.left_child = Some(node);
463 y.update_height();
464 y.update_max();
465
466 y
467 }
468
469 pub fn delete(&mut self, interval: &Interval<T>) {
500 if !self.is_empty() {
501 self.root = IntervalTree::_delete(self.root.take(), interval);
502 }
503 }
504
505 fn _delete(node: Option<Box<Node<T>>>, interval: &Interval<T>) -> Option<Box<Node<T>>> {
506 match node {
507 None => node,
508 Some(mut _node) => {
509 if *interval < *_node.interval() {
510 _node.left_child = IntervalTree::_delete(_node.left_child.take(), interval);
511 } else if *interval > *_node.interval() {
512 _node.right_child = IntervalTree::_delete(_node.right_child.take(), interval);
513 } else {
514 if _node.left_child.is_none() {
515 return _node.right_child;
516 } else if _node.right_child.is_none() {
517 return _node.left_child;
518 } else {
519 let mut y = _node;
520 _node = IntervalTree::_min(&mut y.right_child);
521 _node.right_child = IntervalTree::_delete_min(y.right_child.unwrap());
522 _node.left_child = y.left_child;
523 }
524 }
525
526 _node.update_height();
527 _node.update_size();
528 _node.update_max();
529 Some(IntervalTree::balance(_node))
530 }
531 }
532 }
533 fn _min(node: &mut Option<Box<Node<T>>>) -> Box<Node<T>> {
534 match node {
535 Some(_node) => {
536 if _node.left_child.is_none() {
537 Box::new(Node::init(_node.get_interval(), _node.get_max(), 0, 1))
538 } else {
539 IntervalTree::_min(&mut _node.left_child)
540 }
541 }
542 None => panic!("Called min on None node"),
543 }
544 }
545
546 pub fn delete_min(&mut self) {
573 if !self.is_empty() {
574 self.root = IntervalTree::_delete_min(self.root.take().unwrap());
575 }
576 }
577
578 fn _delete_min(mut node: Box<Node<T>>) -> Option<Box<Node<T>>> {
579 if node.left_child.is_none() {
580 return node.right_child.take();
581 }
582
583 node.left_child = IntervalTree::_delete_min(node.left_child.unwrap());
584
585 node.update_height();
586 node.update_size();
587 node.update_size();
588
589 Some(IntervalTree::balance(node))
590 }
591
592 pub fn delete_max(&mut self) {
618 if !self.is_empty() {
619 self.root = IntervalTree::_delete_max(self.root.take().unwrap());
620 }
621 }
622
623 fn _delete_max(mut node: Box<Node<T>>) -> Option<Box<Node<T>>> {
624 if node.right_child.is_none() {
625 return node.left_child.take();
626 }
627
628 node.right_child = IntervalTree::_delete_max(node.right_child.unwrap());
629
630 node.update_height();
631 node.update_size();
632 node.update_max();
633
634 Some(IntervalTree::balance(node))
635 }
636
637 pub fn select(&self, k: usize) -> Option<Interval<T>> {
670 if k > self.size() {
671 panic!("K must be in range 0 <= k <= size - 1");
672 }
673 IntervalTree::_select(&self.root, k)
674 }
675
676 fn _select(node: &Option<Box<Node<T>>>, k: usize) -> Option<Interval<T>> {
677 if node.is_none() {
678 return None;
679 }
680 let node_ref = node.as_ref().unwrap();
681
682 let t = Node::size(&node_ref.left_child);
683 if t > k {
684 return IntervalTree::_select(&node_ref.left_child, k);
685 } else if t < k {
686 return IntervalTree::_select(&node_ref.right_child, k - t - 1);
687 } else {
688 return Some(node_ref.interval().duplicate());
689 }
690 }
691
692 pub fn min(&self) -> Option<Interval<T>> {
694 self.select(0)
695 }
696
697 pub fn max(&self) -> Option<Interval<T>> {
699 self.select(self.size() - 1)
700 }
701
702 pub fn intervals_between(
741 &self,
742 low_bound: &Interval<T>,
743 high_bound: &Interval<T>,
744 ) -> Vec<&Interval<T>> {
745 let mut intervals: Vec<&Interval<T>> = Vec::new();
746
747 IntervalTree::_intervals_between(&self.root, low_bound, high_bound, &mut intervals);
748
749 intervals
750 }
751
752 fn _intervals_between<'a>(
753 node: &'a Option<Box<Node<T>>>,
754 low_bound: &Interval<T>,
755 high_bound: &Interval<T>,
756 intervals: &mut Vec<&'a Interval<T>>,
757 ) {
758 if node.is_none() {
759 return;
760 }
761
762 let node_ref = node.as_ref().unwrap();
763 if *low_bound < *node_ref.interval() {
764 IntervalTree::_intervals_between(
765 &node_ref.left_child,
766 low_bound,
767 high_bound,
768 intervals,
769 );
770 }
771 if *low_bound <= *node_ref.interval() && *node_ref.interval() <= *high_bound {
772 intervals.push(node_ref.interval());
773 }
774 if *high_bound > *node_ref.interval() {
775 IntervalTree::_intervals_between(
776 &node_ref.right_child,
777 low_bound,
778 high_bound,
779 intervals,
780 );
781 }
782 }
783
784
785 pub fn intervals(&self) -> Vec<Interval<T>> {
788 let mut intervals: Vec<Interval<T>> = Vec::new();
789
790 IntervalTree::_intervals_in_order(&self.root, &mut intervals);
791
792 intervals
793 }
794
795 fn _intervals_in_order(node: &Option<Box<Node<T>>>, intervals: &mut Vec<Interval<T>>) {
796 if node.is_none() {
797 return;
798 }
799
800 let node_ref = node.as_ref().unwrap();
801 IntervalTree::_intervals_in_order(&node_ref.left_child, intervals);
802 intervals.push(node_ref.interval().duplicate());
803 IntervalTree::_intervals_in_order(&node_ref.right_child, intervals);
804 }
805
806 pub fn rank(&self, interval: &Interval<T>) -> usize {
833 IntervalTree::_rank(&self.root, interval)
834 }
835 fn _rank(node: &Option<Box<Node<T>>>, interval: &Interval<T>) -> usize {
836 if node.is_none() {
837 return 0;
838 }
839 let node_ref = node.as_ref().unwrap();
840 if *interval < *node_ref.interval() {
841 IntervalTree::_rank(&node_ref.left_child, interval)
842 } else if *interval >= *node_ref.interval() {
843 1 + Node::size(&node_ref.left_child)
844 + IntervalTree::_rank(&node_ref.right_child, interval)
845 } else {
846 Node::size(&node_ref.left_child)
847 }
848 }
849
850 pub fn size_between(&self, low_bound: &Interval<T>, high_bound: &Interval<T>) -> usize {
880 if self.is_empty() {
881 return 0;
882 }
883 if *low_bound > *high_bound {
884 return 0;
885 }
886
887 return self.rank(high_bound) - self.rank(low_bound) + 1;
888 }
889}
890
891impl<T: Debug + Ord> Debug for IntervalTree<T> {
892 fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::fmt::Result {
893 fmt.write_str("IntervalTree ")?;
894 fmt.debug_set().entries(self.intervals().iter()).finish()
895 }
896}
897
898#[cfg(test)]
899mod tests {
900 use super::*;
901
902 #[test]
903 fn tree_interval_init() {
904 let interval_tree = IntervalTree::<usize>::init();
905
906 assert_eq!(interval_tree.is_empty(), true);
907 assert_eq!(interval_tree.size(), 0);
908 }
909
910 #[test]
911 fn tree_interval_insert() {
912 let mut interval_tree = IntervalTree::<usize>::init();
913
914 interval_tree.insert(Interval::new(Included(0), Included(3)));
915 interval_tree.insert(Interval::new(Included(5), Included(8)));
916 interval_tree.insert(Interval::new(Included(6), Included(10)));
917 interval_tree.insert(Interval::new(Included(8), Included(9)));
918 interval_tree.insert(Interval::new(Included(15), Included(23)));
919 interval_tree.insert(Interval::new(Included(16), Included(21)));
920 interval_tree.insert(Interval::new(Included(17), Included(19)));
921 interval_tree.insert(Interval::new(Included(19), Included(20)));
922 interval_tree.insert(Interval::new(Included(25), Included(30)));
923 interval_tree.insert(Interval::new(Included(26), Included(26)));
924
925 assert_eq!(interval_tree.size(), 10);
926 }
927
928 #[test]
929 fn tree_interval_find_overlap_1() {
930 let mut interval_tree = IntervalTree::<usize>::init();
931
932 interval_tree.insert(Interval::new(Included(0), Included(3)));
933 interval_tree.insert(Interval::new(Included(5), Included(8)));
934 interval_tree.insert(Interval::new(Included(6), Included(10)));
935 interval_tree.insert(Interval::new(Included(8), Included(9)));
936 interval_tree.insert(Interval::new(Included(15), Included(23)));
937 interval_tree.insert(Interval::new(Included(16), Included(21)));
938 interval_tree.insert(Interval::new(Included(17), Included(19)));
939 interval_tree.insert(Interval::new(Included(19), Included(20)));
940 interval_tree.insert(Interval::new(Included(25), Included(30)));
941 interval_tree.insert(Interval::new(Included(26), Included(26)));
942
943 assert!(
944 format!(
945 "{}",
946 interval_tree
947 .find_overlap(&Interval::new(Included(1), Included(2)))
948 .unwrap()
949 ) == String::from("[0,3]")
950 );
951
952 assert!(
953 format!(
954 "{}",
955 interval_tree
956 .find_overlap(&Interval::new(Included(4), Included(5)))
957 .unwrap()
958 ) == String::from("[5,8]")
959 );
960
961 assert!(
962 format!(
963 "{}",
964 interval_tree
965 .find_overlap(&Interval::new(Included(10), Included(14)))
966 .unwrap()
967 ) == String::from("[6,10]")
968 );
969
970 assert!(
971 format!(
972 "{}",
973 interval_tree
974 .find_overlap(&Interval::new(Included(14), Included(15)))
975 .unwrap()
976 ) == String::from("[15,23]")
977 );
978
979 assert!(
980 format!(
981 "{}",
982 interval_tree
983 .find_overlap(&Interval::new(Included(15), Included(18)))
984 .unwrap()
985 ) == String::from("[16,21]")
986 );
987
988 assert!(
989 format!(
990 "{}",
991 interval_tree
992 .find_overlap(&Interval::new(Included(19), Included(19)))
993 .unwrap()
994 ) == String::from("[19,20]")
995 );
996
997 assert!(
998 format!(
999 "{}",
1000 interval_tree
1001 .find_overlap(&Interval::new(Included(23), Included(23)))
1002 .unwrap()
1003 ) == String::from("[15,23]")
1004 );
1005
1006 assert!(
1007 format!(
1008 "{}",
1009 interval_tree
1010 .find_overlap(&Interval::new(Included(24), Included(26)))
1011 .unwrap()
1012 ) == String::from("[25,30]")
1013 );
1014
1015 assert!(
1016 format!(
1017 "{}",
1018 interval_tree
1019 .find_overlap(&Interval::new(Included(26), Included(36)))
1020 .unwrap()
1021 ) == String::from("[25,30]")
1022 );
1023
1024 assert!(interval_tree
1025 .find_overlap(&Interval::new(Included(31), Included(36)))
1026 .is_none());
1027 assert!(interval_tree
1028 .find_overlap(&Interval::new(Included(12), Included(12)))
1029 .is_none());
1030 assert!(interval_tree
1031 .find_overlap(&Interval::new(Included(13), Included(13)))
1032 .is_none());
1033 assert!(interval_tree
1034 .find_overlap(&Interval::new(Included(12), Included(14)))
1035 .is_none());
1036 }
1037
1038 #[test]
1039 fn tree_interval_find_overlap_2() {
1040 let mut interval_tree = IntervalTree::<usize>::init();
1041
1042 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1043 interval_tree.insert(Interval::new(Excluded(5), Included(8)));
1044 interval_tree.insert(Interval::new(Included(6), Included(10)));
1045 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1046 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1047 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1048 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1049 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1050 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1051 interval_tree.insert(Interval::new(Included(26), Included(26)));
1052
1053 assert!(
1054 format!(
1055 "{}",
1056 interval_tree
1057 .find_overlap(&Interval::new(Included(1), Included(2)))
1058 .unwrap()
1059 ) == String::from("[0,3)")
1060 );
1061
1062 assert!(interval_tree
1063 .find_overlap(&Interval::new(Included(4), Included(5)))
1064 .is_none());
1065
1066 assert!(
1067 format!(
1068 "{}",
1069 interval_tree
1070 .find_overlap(&Interval::new(Included(10), Included(14)))
1071 .unwrap()
1072 ) == String::from("[6,10]")
1073 );
1074
1075 assert!(interval_tree
1076 .find_overlap(&Interval::new(Included(14), Included(15)))
1077 .is_none());
1078
1079 assert!(
1080 format!(
1081 "{}",
1082 interval_tree
1083 .find_overlap(&Interval::new(Included(15), Included(18)))
1084 .unwrap()
1085 ) == String::from("[16,21)")
1086 );
1087
1088 assert!(
1089 format!(
1090 "{}",
1091 interval_tree
1092 .find_overlap(&Interval::new(Included(19), Included(19)))
1093 .unwrap()
1094 ) == String::from("[16,21)")
1095 );
1096
1097 assert!(
1098 format!(
1099 "{}",
1100 interval_tree
1101 .find_overlap(&Interval::new(Excluded(23), Included(26)))
1102 .unwrap()
1103 ) == String::from("(25,30]")
1104 );
1105
1106 assert!(interval_tree
1107 .find_overlap(&Interval::new(Excluded(10), Excluded(15)))
1108 .is_none());
1109
1110 assert!(
1111 format!(
1112 "{}",
1113 interval_tree
1114 .find_overlap(&Interval::new(Excluded(21), Included(23)))
1115 .unwrap()
1116 ) == String::from("(15,23)")
1117 );
1118
1119 assert!(interval_tree
1120 .find_overlap(&Interval::new(Included(31), Included(36)))
1121 .is_none());
1122 assert!(interval_tree
1123 .find_overlap(&Interval::new(Included(12), Included(12)))
1124 .is_none());
1125 assert!(interval_tree
1126 .find_overlap(&Interval::new(Included(13), Included(13)))
1127 .is_none());
1128 assert!(interval_tree
1129 .find_overlap(&Interval::new(Included(12), Included(14)))
1130 .is_none());
1131 }
1132
1133 #[test]
1134 fn tree_interval_find_overlap_3() {
1135 let mut interval_tree = IntervalTree::<usize>::init();
1136
1137 interval_tree.insert(Interval::new(Unbounded, Excluded(3)));
1138 interval_tree.insert(Interval::new(Excluded(5), Included(8)));
1139 interval_tree.insert(Interval::new(Included(6), Included(10)));
1140 interval_tree.insert(Interval::new(Unbounded, Included(9)));
1141 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1142 interval_tree.insert(Interval::new(Unbounded, Excluded(21)));
1143 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1144 interval_tree.insert(Interval::new(Excluded(19), Unbounded));
1145 interval_tree.insert(Interval::new(Unbounded, Included(30)));
1146 interval_tree.insert(Interval::new(Included(26), Unbounded));
1147
1148 assert!(
1149 format!(
1150 "{}",
1151 interval_tree
1152 .find_overlap(&Interval::new(Included(1), Included(2)))
1153 .unwrap()
1154 ) == String::from("(_,9]")
1155 );
1156
1157 assert!(
1158 format!(
1159 "{}",
1160 interval_tree
1161 .find_overlap(&Interval::new(Included(4), Included(5)))
1162 .unwrap()
1163 ) == String::from("(_,9]")
1164 );
1165
1166 assert!(
1167 format!(
1168 "{}",
1169 interval_tree
1170 .find_overlap(&Interval::new(Included(10), Included(14)))
1171 .unwrap()
1172 ) == String::from("(_,21)")
1173 );
1174
1175 assert!(
1176 format!(
1177 "{}",
1178 interval_tree
1179 .find_overlap(&Interval::new(Included(14), Included(15)))
1180 .unwrap()
1181 ) == String::from("(_,21)")
1182 );
1183
1184 assert!(
1185 format!(
1186 "{}",
1187 interval_tree
1188 .find_overlap(&Interval::new(Included(15), Included(18)))
1189 .unwrap()
1190 ) == String::from("(_,21)")
1191 );
1192
1193 assert!(
1194 format!(
1195 "{}",
1196 interval_tree
1197 .find_overlap(&Interval::new(Included(19), Included(19)))
1198 .unwrap()
1199 ) == String::from("(_,21)")
1200 );
1201
1202 assert!(
1203 format!(
1204 "{}",
1205 interval_tree
1206 .find_overlap(&Interval::new(Excluded(23), Included(26)))
1207 .unwrap()
1208 ) == String::from("(_,30]")
1209 );
1210
1211 assert!(
1212 format!(
1213 "{}",
1214 interval_tree
1215 .find_overlap(&Interval::new(Excluded(21), Included(23)))
1216 .unwrap()
1217 ) == String::from("(_,30]")
1218 );
1219
1220 assert!(
1221 format!(
1222 "{}",
1223 interval_tree
1224 .find_overlap(&Interval::new(Unbounded, Included(0)))
1225 .unwrap()
1226 ) == String::from("(_,9]")
1227 );
1228 }
1229
1230 #[test]
1231 fn tree_interval_delete_1() {
1232 let mut interval_tree = IntervalTree::<usize>::init();
1233
1234 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1235 interval_tree.insert(Interval::new(Excluded(5), Included(8)));
1236 interval_tree.insert(Interval::new(Included(6), Included(10)));
1237 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1238 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1239 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1240 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1241 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1242 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1243 interval_tree.insert(Interval::new(Included(26), Included(26)));
1244 let mut interval = Interval::new(Included(1), Included(2));
1245 let mut overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
1246 interval_tree.delete(&overlapped_interval);
1247 assert!(interval_tree.find_overlap(&interval).is_none());
1248
1249 interval = Interval::new(Included(15), Included(18));
1250 overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
1251 interval_tree.delete(&overlapped_interval);
1252 overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
1253 interval_tree.delete(&overlapped_interval);
1254 overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
1255 interval_tree.delete(&overlapped_interval);
1256 assert!(interval_tree.find_overlap(&interval).is_none());
1257 }
1258
1259 #[test]
1260 fn tree_interval_delete_max_1() {
1261 let mut interval_tree = IntervalTree::<usize>::init();
1262
1263 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1264 interval_tree.insert(Interval::new(Excluded(5), Included(8)));
1265 interval_tree.insert(Interval::new(Included(6), Included(10)));
1266 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1267 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1268 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1269 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1270 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1271 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1272 interval_tree.insert(Interval::new(Included(26), Included(26)));
1273 interval_tree.delete_max();
1274 interval_tree.delete_max();
1275
1276 assert!(interval_tree
1277 .find_overlap(&Interval::new(Included(23), Included(23)))
1278 .is_none());
1279 }
1280
1281 #[test]
1282 fn tree_interval_delete_min_1() {
1283 let mut interval_tree = IntervalTree::<usize>::init();
1284
1285 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1286 interval_tree.insert(Interval::new(Excluded(5), Included(8)));
1287 interval_tree.insert(Interval::new(Included(6), Included(10)));
1288 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1289 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1290 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1291 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1292 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1293 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1294 interval_tree.insert(Interval::new(Included(26), Included(26)));
1295 interval_tree.delete_min();
1296 interval_tree.delete_min();
1297
1298 assert!(interval_tree
1299 .find_overlap(&Interval::new(Included(1), Excluded(6)))
1300 .is_none());
1301 }
1302
1303 #[test]
1304 fn tree_interval_select_1() {
1305 let mut interval_tree = IntervalTree::<usize>::init();
1306
1307 interval_tree.insert(Interval::new(Excluded(0), Included(1)));
1308 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1309 interval_tree.insert(Interval::new(Included(6), Included(10)));
1310 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1311 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1312 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1313 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1314 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1315 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1316 interval_tree.insert(Interval::new(Included(26), Included(26)));
1317 assert!(format!("{}", interval_tree.select(0).unwrap()) == String::from("[0,3)"));
1318 assert!(format!("{}", interval_tree.select(1).unwrap()) == String::from("(0,1]"));
1319 assert!(format!("{}", interval_tree.select(2).unwrap()) == String::from("[6,10]"));
1320 assert!(format!("{}", interval_tree.select(3).unwrap()) == String::from("(8,9]"));
1321 assert!(format!("{}", interval_tree.select(4).unwrap()) == String::from("(15,23)"));
1322 assert!(format!("{}", interval_tree.select(5).unwrap()) == String::from("[16,21)"));
1323 assert!(format!("{}", interval_tree.select(6).unwrap()) == String::from("[17,19)"));
1324 assert!(format!("{}", interval_tree.select(7).unwrap()) == String::from("(19,20]"));
1325 assert!(format!("{}", interval_tree.select(8).unwrap()) == String::from("(25,30]"));
1326 assert!(format!("{}", interval_tree.select(9).unwrap()) == String::from("[26,26]"));
1327 }
1328
1329 #[test]
1330 fn tree_interval_intervals_between_1() {
1331 let mut interval_tree = IntervalTree::<usize>::init();
1332
1333 interval_tree.insert(Interval::new(Excluded(0), Included(1)));
1334 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1335 interval_tree.insert(Interval::new(Included(6), Included(10)));
1336 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1337 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1338 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1339 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1340 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1341 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1342 interval_tree.insert(Interval::new(Included(26), Included(26)));
1343
1344 let low = Interval::new(Included(14), Included(14));
1345 let high = Interval::new(Included(24), Included(24));
1346 let intervals = interval_tree.intervals_between(&low, &high);
1347
1348 let accept = String::from("(15,23)[16,21)[17,19)(19,20]");
1349
1350 let mut result = String::from("");
1351 for interval in intervals {
1352 result.push_str(&format!("{}", interval))
1353 }
1354
1355 assert_eq!(result, accept);
1356 }
1357
1358 #[test]
1359 fn tree_interval_find_overlaps_1() {
1360 let mut interval_tree = IntervalTree::<usize>::init();
1361
1362 interval_tree.insert(Interval::new(Excluded(0), Included(1)));
1363 interval_tree.insert(Interval::new(Included(0), Excluded(3)));
1364 interval_tree.insert(Interval::new(Included(6), Included(10)));
1365 interval_tree.insert(Interval::new(Excluded(8), Included(9)));
1366 interval_tree.insert(Interval::new(Excluded(15), Excluded(23)));
1367 interval_tree.insert(Interval::new(Included(16), Excluded(21)));
1368 interval_tree.insert(Interval::new(Included(17), Excluded(19)));
1369 interval_tree.insert(Interval::new(Excluded(19), Included(20)));
1370 interval_tree.insert(Interval::new(Excluded(25), Included(30)));
1371 interval_tree.insert(Interval::new(Included(26), Included(26)));
1372
1373 let interval = Interval::new(Included(8), Included(26));
1374 let intervals = interval_tree.find_overlaps(&interval);
1375
1376 let accept = String::from("(8,9][6,10](19,20][16,21)(15,23)[17,19)(25,30][26,26]");
1377
1378 let mut result = String::from("");
1379 for interval in intervals {
1380 result.push_str(&format!("{}", interval))
1381 }
1382
1383 assert_eq!(result, accept);
1384 }
1385
1386 #[test]
1387 fn tree_interval_debug() {
1388 let mut interval_tree = IntervalTree::<usize>::init();
1389 assert_eq!(format!("{:?}", &interval_tree), "IntervalTree {}");
1390 interval_tree.insert(Interval::new(Excluded(0), Included(1)));
1391 assert_eq!(format!("{:?}", &interval_tree),
1392 "IntervalTree {Interval { low: Excluded(0), high: Included(1) }}");
1393 }
1394}