1use crate::entry::{Entry, OccupiedEntry, VacantEntry};
2use crate::index::{DefaultIx, IndexType, NodeIndex};
3use crate::interval::{Interval, IntervalRef};
4use crate::iter::{FilterIter, IntoIter, Iter, UnsortedIter};
5use crate::node::{Color, Node};
6
7use std::collections::VecDeque;
8use std::fmt::Debug;
9
10#[cfg(feature = "serde")]
11use serde::{Deserialize, Serialize};
12
13#[cfg(feature = "graphviz")]
14use std::fmt::Display;
15#[cfg(feature = "graphviz")]
16use std::fs::OpenOptions;
17#[cfg(feature = "graphviz")]
18use std::io::Write;
19
20#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
22#[derive(Debug)]
23pub struct IntervalMap<T, V, Ix = DefaultIx> {
24 pub(crate) nodes: Vec<Node<T, V, Ix>>,
26 pub(crate) root: NodeIndex<Ix>,
28 pub(crate) len: usize,
30}
31
32impl<T, V, Ix> IntervalMap<T, V, Ix>
33where
34 T: Ord,
35 Ix: IndexType,
36{
37 #[inline]
39 #[must_use]
40 pub fn with_capacity(capacity: usize) -> Self {
41 let mut nodes = vec![Node::new_sentinel()];
42 nodes.reserve(capacity);
43 IntervalMap {
44 nodes,
45 root: NodeIndex::SENTINEL,
46 len: 0,
47 }
48 }
49
50 #[inline]
67 pub fn insert(&mut self, interval: Interval<T>, value: V) -> Option<V> {
68 let node_idx = NodeIndex::new(self.nodes.len());
69 let node = Node::new(interval, value, node_idx);
70 assert!(
72 <Ix as IndexType>::max().index() == !0
73 || <NodeIndex<_> as IndexType>::max() != node_idx,
74 "Reached maximum number of nodes"
75 );
76 self.nodes.push(node);
77 self.insert_inner(node_idx)
78 }
79
80 #[inline]
96 pub fn remove(&mut self, interval: &Interval<T>) -> Option<V> {
97 if let Some(node_idx) = self.search_exact(interval) {
98 self.remove_inner(node_idx);
99 let mut node = self.nodes.swap_remove(node_idx.index());
101 let old = NodeIndex::<Ix>::new(self.nodes.len());
102 self.update_idx(old, node_idx);
103
104 return node.value.take();
105 }
106 None
107 }
108
109 #[inline]
125 pub fn overlaps(&self, interval: &Interval<T>) -> bool {
126 let node_idx = self.search(interval);
127 !self.node_ref(node_idx, Node::is_sentinel)
128 }
129
130 const BFS_MIN_THRESHOLD: usize = 20;
133
134 #[inline]
153 pub fn find_all_overlap(&self, interval: &Interval<T>) -> Vec<(&Interval<T>, &V)> {
154 if self.node_ref(self.root, Node::is_sentinel) {
155 return Vec::new();
156 }
157 if self.len() > Self::BFS_MIN_THRESHOLD {
158 self.find_all_overlap_inner(self.root, interval)
159 } else {
160 self.unsorted_iter()
161 .filter(|v| v.0.overlaps(interval))
162 .collect()
163 }
164 }
165
166 #[inline]
185 pub fn find_all_overlap_ordered<'a>(
186 &'a self,
187 interval: &'a Interval<T>,
188 ) -> Vec<(&Interval<T>, &V)> {
189 if self.node_ref(self.root, Node::is_sentinel) {
190 Vec::new()
191 } else {
192 self.filter_iter(interval).collect()
193 }
194 }
195
196 #[inline]
210 pub fn get(&self, interval: &Interval<T>) -> Option<&V> {
211 self.search_exact(interval)
212 .map(|idx| self.node_ref(idx, Node::value))
213 }
214
215 #[inline]
227 pub fn get_mut(&mut self, interval: &Interval<T>) -> Option<&mut V> {
228 self.search_exact(interval)
229 .map(|idx| self.node_mut(idx, Node::value_mut))
230 }
231
232 #[inline]
234 #[must_use]
235 pub fn iter(&self) -> Iter<'_, T, V, Ix> {
236 Iter::new(self)
237 }
238
239 #[inline]
241 pub fn unsorted_iter(&self) -> UnsortedIter<T, V, Ix> {
242 UnsortedIter::new(self)
243 }
244
245 #[inline]
251 pub fn filter_iter<'a, 'b: 'a>(&'a self, query: &'b Interval<T>) -> FilterIter<T, V, Ix> {
252 FilterIter::new(self, query)
253 }
254
255 #[inline]
269 pub fn contains(&self, interval: &Interval<T>) -> bool {
270 let mut max_end: Option<&T> = None;
271 let mut min_begin: Option<&T> = None;
272
273 let mut continuous = true;
274 self.filter_iter(interval).find(|v| {
275 if min_begin.is_none() {
276 min_begin = Some(&v.0.low);
277 max_end = Some(&v.0.high);
278 return false;
279 }
280 if max_end.map(|mv| mv < &v.0.low).unwrap() {
281 continuous = false;
282 return true;
283 }
284 if max_end.map(|mv| mv < &v.0.high).unwrap() {
285 max_end = Some(&v.0.high);
286 }
287 false
288 });
289
290 continuous
291 && min_begin.is_some()
292 && max_end.map(|mv| mv >= &interval.high).unwrap()
293 && min_begin.map(|mv| mv <= &interval.low).unwrap()
294 }
295
296 #[inline]
311 pub fn entry(&mut self, interval: Interval<T>) -> Entry<'_, T, V, Ix> {
312 match self.search_exact(&interval) {
313 Some(node_idx) => Entry::Occupied(OccupiedEntry {
314 map_ref: self,
315 node_idx,
316 }),
317 None => Entry::Vacant(VacantEntry {
318 map_ref: self,
319 interval,
320 }),
321 }
322 }
323
324 #[inline]
326 pub fn clear(&mut self) {
327 self.nodes.clear();
328 self.nodes.push(Node::new_sentinel());
329 self.root = NodeIndex::SENTINEL;
330 self.len = 0;
331 }
332
333 #[inline]
335 #[must_use]
336 pub fn len(&self) -> usize {
337 self.len
338 }
339
340 #[inline]
342 #[must_use]
343 pub fn is_empty(&self) -> bool {
344 self.len() == 0
345 }
346}
347
348impl<T, V, Ix> IntoIterator for IntervalMap<T, V, Ix>
349where
350 T: Ord,
351 Ix: IndexType,
352{
353 type Item = (Interval<T>, V);
354
355 type IntoIter = IntoIter<T, V, Ix>;
356
357 fn into_iter(self) -> Self::IntoIter {
359 IntoIter::new(self)
360 }
361}
362
363impl<T, V> IntervalMap<T, V>
364where
365 T: Ord,
366{
367 #[inline]
369 #[must_use]
370 pub fn new() -> Self {
371 Self::with_capacity(0)
372 }
373}
374
375impl<T, V> Default for IntervalMap<T, V>
376where
377 T: Ord,
378{
379 #[inline]
380 fn default() -> Self {
381 Self::with_capacity(0)
382 }
383}
384
385impl<T, V, Ix> IntervalMap<T, V, Ix>
386where
387 T: Ord,
388 Ix: IndexType,
389{
390 fn insert_inner(&mut self, z: NodeIndex<Ix>) -> Option<V> {
392 let mut y = NodeIndex::SENTINEL;
393 let mut x = self.root;
394
395 while !self.node_ref(x, Node::is_sentinel) {
396 y = x;
397 if self.node_ref(z, Node::interval) == self.node_ref(y, Node::interval) {
398 let zval = self.node_mut(z, Node::take_value);
399 let old_value = self.node_mut(y, Node::set_value(zval));
400 return Some(old_value);
401 }
402 if self.node_ref(z, Node::interval) < self.node_ref(x, Node::interval) {
403 x = self.node_ref(x, Node::left);
404 } else {
405 x = self.node_ref(x, Node::right);
406 }
407 }
408 self.node_mut(z, Node::set_parent(y));
409 if self.node_ref(y, Node::is_sentinel) {
410 self.root = z;
411 } else {
412 if self.node_ref(z, Node::interval) < self.node_ref(y, Node::interval) {
413 self.node_mut(y, Node::set_left(z));
414 } else {
415 self.node_mut(y, Node::set_right(z));
416 }
417 self.update_max_bottom_up(y);
418 }
419 self.node_mut(z, Node::set_color(Color::Red));
420
421 self.insert_fixup(z);
422
423 self.len = self.len.wrapping_add(1);
424 None
425 }
426
427 fn remove_inner(&mut self, z: NodeIndex<Ix>) {
429 let mut y = z;
430 let mut y_orig_color = self.node_ref(y, Node::color);
431 let x;
432 if self.left_ref(z, Node::is_sentinel) {
433 x = self.node_ref(z, Node::right);
434 self.transplant(z, x);
435 self.update_max_bottom_up(self.node_ref(z, Node::parent));
436 } else if self.right_ref(z, Node::is_sentinel) {
437 x = self.node_ref(z, Node::left);
438 self.transplant(z, x);
439 self.update_max_bottom_up(self.node_ref(z, Node::parent));
440 } else {
441 y = self.tree_minimum(self.node_ref(z, Node::right));
442 let mut p = y;
443 y_orig_color = self.node_ref(y, Node::color);
444 x = self.node_ref(y, Node::right);
445 if self.node_ref(y, Node::parent) == z {
446 self.node_mut(x, Node::set_parent(y));
447 } else {
448 self.transplant(y, x);
449 p = self.node_ref(y, Node::parent);
450 self.node_mut(y, Node::set_right(self.node_ref(z, Node::right)));
451 self.right_mut(y, Node::set_parent(y));
452 }
453 self.transplant(z, y);
454 self.node_mut(y, Node::set_left(self.node_ref(z, Node::left)));
455 self.left_mut(y, Node::set_parent(y));
456 self.node_mut(y, Node::set_color(self.node_ref(z, Node::color)));
457
458 self.update_max_bottom_up(p);
459 }
460
461 if matches!(y_orig_color, Color::Black) {
462 self.remove_fixup(x);
463 }
464
465 self.len = self.len.wrapping_sub(1);
466 }
467
468 fn find_all_overlap_inner(
472 &self,
473 x: NodeIndex<Ix>,
474 interval: &Interval<T>,
475 ) -> Vec<(&Interval<T>, &V)> {
476 let mut list = Vec::new();
477 let mut queue = VecDeque::new();
478 queue.push_back(x);
479 while let Some(p) = queue.pop_front() {
480 if self.node_ref(p, Node::interval).overlaps(interval) {
481 list.push(self.node_ref(p, |np| (np.interval(), np.value())));
482 }
483 let p_left = self.node_ref(p, Node::left);
484 let p_right = self.node_ref(p, Node::right);
485 if self.max(p_left) >= Some(&interval.low) {
486 queue.push_back(p_left);
487 }
488 if self
489 .max(self.node_ref(p, Node::right))
490 .map(|rmax| IntervalRef::new(&self.node_ref(p, Node::interval).low, rmax))
491 .is_some_and(|i| i.overlap(interval))
492 {
493 queue.push_back(p_right);
494 }
495 }
496
497 list
498 }
499
500 fn search(&self, interval: &Interval<T>) -> NodeIndex<Ix> {
502 let mut x = self.root;
503 while self
504 .node_ref(x, Node::sentinel)
505 .map(Node::interval)
506 .is_some_and(|xi| !xi.overlaps(interval))
507 {
508 if self.max(self.node_ref(x, Node::left)) > Some(&interval.low) {
509 x = self.node_ref(x, Node::left);
510 } else {
511 x = self.node_ref(x, Node::right);
512 }
513 }
514 x
515 }
516
517 fn search_exact(&self, interval: &Interval<T>) -> Option<NodeIndex<Ix>> {
519 let mut x = self.root;
520 while !self.node_ref(x, Node::is_sentinel) {
521 if self.node_ref(x, Node::interval) == interval {
522 return Some(x);
523 }
524 if self.max(x) < Some(&interval.high) {
525 return None;
526 }
527 if self.node_ref(x, Node::interval) > interval {
528 x = self.node_ref(x, Node::left);
529 } else {
530 x = self.node_ref(x, Node::right);
531 }
532 }
533 None
534 }
535
536 fn insert_fixup(&mut self, mut z: NodeIndex<Ix>) {
538 while self.parent_ref(z, Node::is_red) {
539 if self.grand_parent_ref(z, Node::is_sentinel) {
540 break;
541 }
542 if self.is_left_child(self.node_ref(z, Node::parent)) {
543 let y = self.grand_parent_ref(z, Node::right);
544 if self.node_ref(y, Node::is_red) {
545 self.parent_mut(z, Node::set_color(Color::Black));
546 self.node_mut(y, Node::set_color(Color::Black));
547 self.grand_parent_mut(z, Node::set_color(Color::Red));
548 z = self.parent_ref(z, Node::parent);
549 } else {
550 if self.is_right_child(z) {
551 z = self.node_ref(z, Node::parent);
552 self.left_rotate(z);
553 }
554 self.parent_mut(z, Node::set_color(Color::Black));
555 self.grand_parent_mut(z, Node::set_color(Color::Red));
556 self.right_rotate(self.parent_ref(z, Node::parent));
557 }
558 } else {
559 let y = self.grand_parent_ref(z, Node::left);
560 if self.node_ref(y, Node::is_red) {
561 self.parent_mut(z, Node::set_color(Color::Black));
562 self.node_mut(y, Node::set_color(Color::Black));
563 self.grand_parent_mut(z, Node::set_color(Color::Red));
564 z = self.parent_ref(z, Node::parent);
565 } else {
566 if self.is_left_child(z) {
567 z = self.node_ref(z, Node::parent);
568 self.right_rotate(z);
569 }
570 self.parent_mut(z, Node::set_color(Color::Black));
571 self.grand_parent_mut(z, Node::set_color(Color::Red));
572 self.left_rotate(self.parent_ref(z, Node::parent));
573 }
574 }
575 }
576 self.node_mut(self.root, Node::set_color(Color::Black));
577 }
578
579 fn remove_fixup(&mut self, mut x: NodeIndex<Ix>) {
581 while x != self.root && self.node_ref(x, Node::is_black) {
582 let mut w;
583 if self.is_left_child(x) {
584 w = self.parent_ref(x, Node::right);
585 if self.node_ref(w, Node::is_red) {
586 self.node_mut(w, Node::set_color(Color::Black));
587 self.parent_mut(x, Node::set_color(Color::Red));
588 self.left_rotate(self.node_ref(x, Node::parent));
589 w = self.parent_ref(x, Node::right);
590 }
591 if self.node_ref(w, Node::is_sentinel) {
592 break;
593 }
594 if self.left_ref(w, Node::is_black) && self.right_ref(w, Node::is_black) {
595 self.node_mut(w, Node::set_color(Color::Red));
596 x = self.node_ref(x, Node::parent);
597 } else {
598 if self.right_ref(w, Node::is_black) {
599 self.left_mut(w, Node::set_color(Color::Black));
600 self.node_mut(w, Node::set_color(Color::Red));
601 self.right_rotate(w);
602 w = self.parent_ref(x, Node::right);
603 }
604 self.node_mut(w, Node::set_color(self.parent_ref(x, Node::color)));
605 self.parent_mut(x, Node::set_color(Color::Black));
606 self.right_mut(w, Node::set_color(Color::Black));
607 self.left_rotate(self.node_ref(x, Node::parent));
608 x = self.root;
609 }
610 } else {
611 w = self.parent_ref(x, Node::left);
612 if self.node_ref(w, Node::is_red) {
613 self.node_mut(w, Node::set_color(Color::Black));
614 self.parent_mut(x, Node::set_color(Color::Red));
615 self.right_rotate(self.node_ref(x, Node::parent));
616 w = self.parent_ref(x, Node::left);
617 }
618 if self.node_ref(w, Node::is_sentinel) {
619 break;
620 }
621 if self.right_ref(w, Node::is_black) && self.left_ref(w, Node::is_black) {
622 self.node_mut(w, Node::set_color(Color::Red));
623 x = self.node_ref(x, Node::parent);
624 } else {
625 if self.left_ref(w, Node::is_black) {
626 self.right_mut(w, Node::set_color(Color::Black));
627 self.node_mut(w, Node::set_color(Color::Red));
628 self.left_rotate(w);
629 w = self.parent_ref(x, Node::left);
630 }
631 self.node_mut(w, Node::set_color(self.parent_ref(x, Node::color)));
632 self.parent_mut(x, Node::set_color(Color::Black));
633 self.left_mut(w, Node::set_color(Color::Black));
634 self.right_rotate(self.node_ref(x, Node::parent));
635 x = self.root;
636 }
637 }
638 }
639 self.node_mut(x, Node::set_color(Color::Black));
640 }
641
642 fn left_rotate(&mut self, x: NodeIndex<Ix>) {
644 if self.right_ref(x, Node::is_sentinel) {
645 return;
646 }
647 let y = self.node_ref(x, Node::right);
648 self.node_mut(x, Node::set_right(self.node_ref(y, Node::left)));
649 if !self.left_ref(y, Node::is_sentinel) {
650 self.left_mut(y, Node::set_parent(x));
651 }
652
653 self.replace_parent(x, y);
654 self.node_mut(y, Node::set_left(x));
655
656 self.rotate_update_max(x, y);
657 }
658
659 fn right_rotate(&mut self, x: NodeIndex<Ix>) {
661 if self.left_ref(x, Node::is_sentinel) {
662 return;
663 }
664 let y = self.node_ref(x, Node::left);
665 self.node_mut(x, Node::set_left(self.node_ref(y, Node::right)));
666 if !self.right_ref(y, Node::is_sentinel) {
667 self.right_mut(y, Node::set_parent(x));
668 }
669
670 self.replace_parent(x, y);
671 self.node_mut(y, Node::set_right(x));
672
673 self.rotate_update_max(x, y);
674 }
675
676 fn replace_parent(&mut self, x: NodeIndex<Ix>, y: NodeIndex<Ix>) {
678 self.node_mut(y, Node::set_parent(self.node_ref(x, Node::parent)));
679 if self.parent_ref(x, Node::is_sentinel) {
680 self.root = y;
681 } else if self.is_left_child(x) {
682 self.parent_mut(x, Node::set_left(y));
683 } else {
684 self.parent_mut(x, Node::set_right(y));
685 }
686 self.node_mut(x, Node::set_parent(y));
687 }
688
689 fn rotate_update_max(&mut self, x: NodeIndex<Ix>, y: NodeIndex<Ix>) {
691 self.node_mut(y, Node::set_max_index(self.node_ref(x, Node::max_index)));
692 self.recaculate_max(x);
693 }
694
695 fn update_max_bottom_up(&mut self, x: NodeIndex<Ix>) {
697 let mut p = x;
698 while !self.node_ref(p, Node::is_sentinel) {
699 self.recaculate_max(p);
700 p = self.node_ref(p, Node::parent);
701 }
702 }
703
704 fn recaculate_max(&mut self, x: NodeIndex<Ix>) {
706 self.node_mut(x, Node::set_max_index(x));
707 let x_left = self.node_ref(x, Node::left);
708 let x_right = self.node_ref(x, Node::right);
709 if self.max(x_left) > self.max(x) {
710 self.node_mut(
711 x,
712 Node::set_max_index(self.node_ref(x_left, Node::max_index)),
713 );
714 }
715 if self.max(x_right) > self.max(x) {
716 self.node_mut(
717 x,
718 Node::set_max_index(self.node_ref(x_right, Node::max_index)),
719 );
720 }
721 }
722
723 fn tree_minimum(&self, mut x: NodeIndex<Ix>) -> NodeIndex<Ix> {
725 while !self.left_ref(x, Node::is_sentinel) {
726 x = self.node_ref(x, Node::left);
727 }
728 x
729 }
730
731 fn transplant(&mut self, u: NodeIndex<Ix>, v: NodeIndex<Ix>) {
733 if self.parent_ref(u, Node::is_sentinel) {
734 self.root = v;
735 } else if self.is_left_child(u) {
736 self.parent_mut(u, Node::set_left(v));
737 } else {
738 self.parent_mut(u, Node::set_right(v));
739 }
740 self.node_mut(v, Node::set_parent(self.node_ref(u, Node::parent)));
741 }
742
743 fn is_left_child(&self, node_idx: NodeIndex<Ix>) -> bool {
745 self.parent_ref(node_idx, Node::left) == node_idx
746 }
747
748 fn is_right_child(&self, node_idx: NodeIndex<Ix>) -> bool {
750 self.parent_ref(node_idx, Node::right) == node_idx
751 }
752
753 fn update_idx(&mut self, old: NodeIndex<Ix>, new: NodeIndex<Ix>) {
758 if self.root == old {
759 self.root = new;
760 }
761 if self.nodes.get(new.index()).is_some() {
762 if !self.parent_ref(new, Node::is_sentinel) {
763 if self.parent_ref(new, Node::left) == old {
764 self.parent_mut(new, Node::set_left(new));
765 } else {
766 self.parent_mut(new, Node::set_right(new));
767 }
768 }
769 self.left_mut(new, Node::set_parent(new));
770 self.right_mut(new, Node::set_parent(new));
771
772 let mut p = new;
773 while !self.node_ref(p, Node::is_sentinel) {
774 if self.node_ref(p, Node::max_index) == old {
775 self.node_mut(p, Node::set_max_index(new));
776 }
777 p = self.node_ref(p, Node::parent);
778 }
779 }
780 }
781}
782
783#[cfg(feature = "graphviz")]
784impl<T, V, Ix> IntervalMap<T, V, Ix>
785where
786 T: Ord + Copy + Display,
787 V: Display,
788 Ix: IndexType,
789{
790 pub fn draw(&self, filename: &str) -> std::io::Result<()> {
792 let mut file = OpenOptions::new()
793 .write(true)
794 .create(true)
795 .truncate(true)
796 .open(filename)?;
797 writeln!(file, "digraph {{")?;
798 for i in 1..self.nodes.len() {
800 self.nodes[i].draw(i, &mut file)?;
801 }
802 writeln!(file, "}}")
803 }
804}
805
806#[cfg(feature = "graphviz")]
807impl<T, V, Ix> IntervalMap<T, V, Ix>
808where
809 T: Ord + Copy + Display,
810 Ix: IndexType,
811{
812 pub fn draw_without_value(&self, filename: &str) -> std::io::Result<()> {
814 let mut file = OpenOptions::new()
815 .write(true)
816 .create(true)
817 .truncate(true)
818 .open(filename)?;
819 writeln!(file, "digraph {{")?;
820 for i in 1..self.nodes.len() {
822 self.nodes[i].draw_without_value(i, &mut file)?;
823 }
824 writeln!(file, "}}")
825 }
826}
827
828impl<'a, T, V, Ix> IntervalMap<T, V, Ix>
830where
831 T: Ord,
832 Ix: IndexType,
833{
834 pub(crate) fn node_ref<F, R>(&'a self, node_idx: NodeIndex<Ix>, op: F) -> R
835 where
836 R: 'a,
837 F: FnOnce(&'a Node<T, V, Ix>) -> R,
838 {
839 op(&self.nodes[node_idx.index()])
840 }
841
842 pub(crate) fn node_mut<F, R>(&'a mut self, node_idx: NodeIndex<Ix>, op: F) -> R
843 where
844 R: 'a,
845 F: FnOnce(&'a mut Node<T, V, Ix>) -> R,
846 {
847 op(&mut self.nodes[node_idx.index()])
848 }
849
850 pub(crate) fn left_ref<F, R>(&'a self, node_idx: NodeIndex<Ix>, op: F) -> R
851 where
852 R: 'a,
853 F: FnOnce(&'a Node<T, V, Ix>) -> R,
854 {
855 let idx = self.nodes[node_idx.index()].left().index();
856 op(&self.nodes[idx])
857 }
858
859 pub(crate) fn right_ref<F, R>(&'a self, node_idx: NodeIndex<Ix>, op: F) -> R
860 where
861 R: 'a,
862 F: FnOnce(&'a Node<T, V, Ix>) -> R,
863 {
864 let idx = self.nodes[node_idx.index()].right().index();
865 op(&self.nodes[idx])
866 }
867
868 fn parent_ref<F, R>(&'a self, node_idx: NodeIndex<Ix>, op: F) -> R
869 where
870 R: 'a,
871 F: FnOnce(&'a Node<T, V, Ix>) -> R,
872 {
873 let idx = self.nodes[node_idx.index()].parent().index();
874 op(&self.nodes[idx])
875 }
876
877 fn grand_parent_ref<F, R>(&'a self, node_idx: NodeIndex<Ix>, op: F) -> R
878 where
879 R: 'a,
880 F: FnOnce(&'a Node<T, V, Ix>) -> R,
881 {
882 let parent_idx = self.nodes[node_idx.index()].parent().index();
883 let grand_parent_idx = self.nodes[parent_idx].parent().index();
884 op(&self.nodes[grand_parent_idx])
885 }
886
887 fn left_mut<F, R>(&'a mut self, node_idx: NodeIndex<Ix>, op: F) -> R
888 where
889 R: 'a,
890 F: FnOnce(&'a mut Node<T, V, Ix>) -> R,
891 {
892 let idx = self.nodes[node_idx.index()].left().index();
893 op(&mut self.nodes[idx])
894 }
895
896 fn right_mut<F, R>(&'a mut self, node_idx: NodeIndex<Ix>, op: F) -> R
897 where
898 R: 'a,
899 F: FnOnce(&'a mut Node<T, V, Ix>) -> R,
900 {
901 let idx = self.nodes[node_idx.index()].right().index();
902 op(&mut self.nodes[idx])
903 }
904
905 fn parent_mut<F, R>(&'a mut self, node_idx: NodeIndex<Ix>, op: F) -> R
906 where
907 R: 'a,
908 F: FnOnce(&'a mut Node<T, V, Ix>) -> R,
909 {
910 let idx = self.nodes[node_idx.index()].parent().index();
911 op(&mut self.nodes[idx])
912 }
913
914 fn grand_parent_mut<F, R>(&'a mut self, node_idx: NodeIndex<Ix>, op: F) -> R
915 where
916 R: 'a,
917 F: FnOnce(&'a mut Node<T, V, Ix>) -> R,
918 {
919 let parent_idx = self.nodes[node_idx.index()].parent().index();
920 let grand_parent_idx = self.nodes[parent_idx].parent().index();
921 op(&mut self.nodes[grand_parent_idx])
922 }
923
924 pub(crate) fn max(&self, node_idx: NodeIndex<Ix>) -> Option<&T> {
925 let max_index = self.nodes[node_idx.index()].max_index?.index();
926 self.nodes[max_index].interval.as_ref().map(|i| &i.high)
927 }
928}
929
930#[cfg(test)]
931mod test {
932 use super::*;
933
934 #[derive(Debug, PartialEq, Eq)]
935 pub struct VisitedInterval<T> {
936 key: Interval<T>,
937 left: Option<Interval<T>>,
938 right: Option<Interval<T>>,
939 color: Color,
940 depth: i32,
941 }
942
943 impl<T> VisitedInterval<T> {
944 pub fn new(
945 key: Interval<T>,
946 left: Option<Interval<T>>,
947 right: Option<Interval<T>>,
948 color: Color,
949 depth: i32,
950 ) -> Self {
951 Self {
952 key,
953 left,
954 right,
955 color,
956 depth,
957 }
958 }
959 }
960
961 impl<T, V, Ix> IntervalMap<T, V, Ix>
962 where
963 T: Ord + Clone,
964 Ix: IndexType,
965 {
966 fn visit_level(&self) -> Vec<VisitedInterval<T>> {
967 let mut res: Vec<VisitedInterval<T>> = Vec::new();
968 let mut queue = VecDeque::new();
969 queue.push_back(self.root);
970 let mut depth = 0;
971 while !queue.is_empty() {
972 for _ in 0..queue.len() {
973 let p = queue.pop_front().unwrap();
974 let node = &self.nodes[p.index()];
975 let p_left_node = &self.nodes[node.left().index()];
976 let p_right_node = &self.nodes[node.right().index()];
977
978 res.push(VisitedInterval {
979 key: node.interval.clone().unwrap(),
980 left: p_left_node.interval.clone(),
981 right: p_right_node.interval.clone(),
982 color: node.color(),
983 depth,
984 });
985 if !p_left_node.is_sentinel() {
986 queue.push_back(node.left())
987 }
988 if !p_right_node.is_sentinel() {
989 queue.push_back(node.right())
990 }
991 }
992 depth += 1;
993 }
994 res
995 }
996 }
997
998 #[test]
999 fn test_interval_tree_insert() {
1000 let mut map = IntervalMap::new();
1001 map.insert(Interval::new(16, 21), 30);
1002 map.insert(Interval::new(8, 9), 23);
1003 map.insert(Interval::new(0, 3), 3);
1004 map.insert(Interval::new(5, 8), 10);
1005 map.insert(Interval::new(6, 10), 10);
1006 map.insert(Interval::new(15, 23), 23);
1007 map.insert(Interval::new(17, 19), 20);
1008 map.insert(Interval::new(25, 30), 30);
1009 map.insert(Interval::new(26, 27), 26);
1010 map.insert(Interval::new(19, 20), 20);
1011
1012 let expected = vec![
1013 VisitedInterval::new(
1014 Interval::new(16, 21),
1015 Some(Interval::new(8, 9)),
1016 Some(Interval::new(25, 30)),
1017 Color::Black,
1018 0,
1019 ),
1020 VisitedInterval::new(
1021 Interval::new(8, 9),
1022 Some(Interval::new(5, 8)),
1023 Some(Interval::new(15, 23)),
1024 Color::Red,
1025 1,
1026 ),
1027 VisitedInterval::new(
1028 Interval::new(25, 30),
1029 Some(Interval::new(17, 19)),
1030 Some(Interval::new(26, 27)),
1031 Color::Red,
1032 1,
1033 ),
1034 VisitedInterval::new(
1035 Interval::new(5, 8),
1036 Some(Interval::new(0, 3)),
1037 Some(Interval::new(6, 10)),
1038 Color::Black,
1039 2,
1040 ),
1041 VisitedInterval::new(Interval::new(15, 23), None, None, Color::Black, 2),
1042 VisitedInterval::new(
1043 Interval::new(17, 19),
1044 None,
1045 Some(Interval::new(19, 20)),
1046 Color::Black,
1047 2,
1048 ),
1049 VisitedInterval::new(Interval::new(26, 27), None, None, Color::Black, 2),
1050 VisitedInterval::new(Interval::new(0, 3), None, None, Color::Red, 3),
1051 VisitedInterval::new(Interval::new(6, 10), None, None, Color::Red, 3),
1052 VisitedInterval::new(Interval::new(19, 20), None, None, Color::Red, 3),
1053 ];
1054
1055 let res = map.visit_level();
1056 assert_eq!(res, expected);
1057 }
1058
1059 #[test]
1060 fn test_interval_tree_self_balanced() {
1061 let mut map = IntervalMap::new();
1062 map.insert(Interval::new(0, 1), 0);
1063 map.insert(Interval::new(1, 2), 0);
1064 map.insert(Interval::new(3, 4), 0);
1065 map.insert(Interval::new(5, 6), 0);
1066 map.insert(Interval::new(7, 8), 0);
1067 map.insert(Interval::new(8, 9), 0);
1068
1069 let expected = vec![
1070 VisitedInterval::new(
1071 Interval::new(1, 2),
1072 Some(Interval::new(0, 1)),
1073 Some(Interval::new(5, 6)),
1074 Color::Black,
1075 0,
1076 ),
1077 VisitedInterval::new(Interval::new(0, 1), None, None, Color::Black, 1),
1078 VisitedInterval::new(
1079 Interval::new(5, 6),
1080 Some(Interval::new(3, 4)),
1081 Some(Interval::new(7, 8)),
1082 Color::Red,
1083 1,
1084 ),
1085 VisitedInterval::new(Interval::new(3, 4), None, None, Color::Black, 2),
1086 VisitedInterval::new(
1087 Interval::new(7, 8),
1088 None,
1089 Some(Interval::new(8, 9)),
1090 Color::Black,
1091 2,
1092 ),
1093 VisitedInterval::new(Interval::new(8, 9), None, None, Color::Red, 3),
1094 ];
1095
1096 let res = map.visit_level();
1097 assert_eq!(res, expected);
1098 }
1099
1100 #[test]
1101 fn test_interval_tree_delete() {
1102 let mut map = IntervalMap::new();
1103 map.insert(Interval::new(510, 511), 0);
1104 map.insert(Interval::new(82, 83), 0);
1105 map.insert(Interval::new(830, 831), 0);
1106 map.insert(Interval::new(11, 12), 0);
1107 map.insert(Interval::new(383, 384), 0);
1108 map.insert(Interval::new(647, 648), 0);
1109 map.insert(Interval::new(899, 900), 0);
1110 map.insert(Interval::new(261, 262), 0);
1111 map.insert(Interval::new(410, 411), 0);
1112 map.insert(Interval::new(514, 515), 0);
1113 map.insert(Interval::new(815, 816), 0);
1114 map.insert(Interval::new(888, 889), 0);
1115 map.insert(Interval::new(972, 973), 0);
1116 map.insert(Interval::new(238, 239), 0);
1117 map.insert(Interval::new(292, 293), 0);
1118 map.insert(Interval::new(953, 954), 0);
1119
1120 let expected_before_delete = vec![
1121 VisitedInterval::new(
1122 Interval::new(510, 511),
1123 Some(Interval::new(82, 83)),
1124 Some(Interval::new(830, 831)),
1125 Color::Black,
1126 0,
1127 ),
1128 VisitedInterval::new(
1129 Interval::new(82, 83),
1130 Some(Interval::new(11, 12)),
1131 Some(Interval::new(383, 384)),
1132 Color::Black,
1133 1,
1134 ),
1135 VisitedInterval::new(
1136 Interval::new(830, 831),
1137 Some(Interval::new(647, 648)),
1138 Some(Interval::new(899, 900)),
1139 Color::Black,
1140 1,
1141 ),
1142 VisitedInterval::new(Interval::new(11, 12), None, None, Color::Black, 2),
1143 VisitedInterval::new(
1144 Interval::new(383, 384),
1145 Some(Interval::new(261, 262)),
1146 Some(Interval::new(410, 411)),
1147 Color::Red,
1148 2,
1149 ),
1150 VisitedInterval::new(
1151 Interval::new(647, 648),
1152 Some(Interval::new(514, 515)),
1153 Some(Interval::new(815, 816)),
1154 Color::Black,
1155 2,
1156 ),
1157 VisitedInterval::new(
1158 Interval::new(899, 900),
1159 Some(Interval::new(888, 889)),
1160 Some(Interval::new(972, 973)),
1161 Color::Red,
1162 2,
1163 ),
1164 VisitedInterval::new(
1165 Interval::new(261, 262),
1166 Some(Interval::new(238, 239)),
1167 Some(Interval::new(292, 293)),
1168 Color::Black,
1169 3,
1170 ),
1171 VisitedInterval::new(Interval::new(410, 411), None, None, Color::Black, 3),
1172 VisitedInterval::new(Interval::new(514, 515), None, None, Color::Red, 3),
1173 VisitedInterval::new(Interval::new(815, 816), None, None, Color::Red, 3),
1174 VisitedInterval::new(Interval::new(888, 889), None, None, Color::Black, 3),
1175 VisitedInterval::new(
1176 Interval::new(972, 973),
1177 Some(Interval::new(953, 954)),
1178 None,
1179 Color::Black,
1180 3,
1181 ),
1182 VisitedInterval::new(Interval::new(238, 239), None, None, Color::Red, 4),
1183 VisitedInterval::new(Interval::new(292, 293), None, None, Color::Red, 4),
1184 VisitedInterval::new(Interval::new(953, 954), None, None, Color::Red, 4),
1185 ];
1186
1187 let res = map.visit_level();
1188 assert_eq!(res, expected_before_delete);
1189
1190 let range514 = Interval::new(514, 515);
1192 let deleted = map.remove(&range514);
1193 assert!(deleted.is_some());
1194
1195 let expected_after_delete514 = vec![
1196 VisitedInterval::new(
1197 Interval::new(510, 511),
1198 Some(Interval::new(82, 83)),
1199 Some(Interval::new(830, 831)),
1200 Color::Black,
1201 0,
1202 ),
1203 VisitedInterval::new(
1204 Interval::new(82, 83),
1205 Some(Interval::new(11, 12)),
1206 Some(Interval::new(383, 384)),
1207 Color::Black,
1208 1,
1209 ),
1210 VisitedInterval::new(
1211 Interval::new(830, 831),
1212 Some(Interval::new(647, 648)),
1213 Some(Interval::new(899, 900)),
1214 Color::Black,
1215 1,
1216 ),
1217 VisitedInterval::new(Interval::new(11, 12), None, None, Color::Black, 2),
1218 VisitedInterval::new(
1219 Interval::new(383, 384),
1220 Some(Interval::new(261, 262)),
1221 Some(Interval::new(410, 411)),
1222 Color::Red,
1223 2,
1224 ),
1225 VisitedInterval::new(
1226 Interval::new(647, 648),
1227 None,
1228 Some(Interval::new(815, 816)),
1229 Color::Black,
1230 2,
1231 ),
1232 VisitedInterval::new(
1233 Interval::new(899, 900),
1234 Some(Interval::new(888, 889)),
1235 Some(Interval::new(972, 973)),
1236 Color::Red,
1237 2,
1238 ),
1239 VisitedInterval::new(
1240 Interval::new(261, 262),
1241 Some(Interval::new(238, 239)),
1242 Some(Interval::new(292, 293)),
1243 Color::Black,
1244 3,
1245 ),
1246 VisitedInterval::new(Interval::new(410, 411), None, None, Color::Black, 3),
1247 VisitedInterval::new(Interval::new(815, 816), None, None, Color::Red, 3),
1248 VisitedInterval::new(Interval::new(888, 889), None, None, Color::Black, 3),
1249 VisitedInterval::new(
1250 Interval::new(972, 973),
1251 Some(Interval::new(953, 954)),
1252 None,
1253 Color::Black,
1254 3,
1255 ),
1256 VisitedInterval::new(Interval::new(238, 239), None, None, Color::Red, 4),
1257 VisitedInterval::new(Interval::new(292, 293), None, None, Color::Red, 4),
1258 VisitedInterval::new(Interval::new(953, 954), None, None, Color::Red, 4),
1259 ];
1260
1261 let res = map.visit_level();
1262 assert_eq!(res, expected_after_delete514);
1263
1264 let range11 = Interval::new(11, 12);
1266 let deleted = map.remove(&range11);
1267 assert!(deleted.is_some());
1268
1269 let expected_after_delete11 = vec![
1270 VisitedInterval::new(
1271 Interval::new(510, 511),
1272 Some(Interval::new(383, 384)),
1273 Some(Interval::new(830, 831)),
1274 Color::Black,
1275 0,
1276 ),
1277 VisitedInterval::new(
1278 Interval::new(383, 384),
1279 Some(Interval::new(261, 262)),
1280 Some(Interval::new(410, 411)),
1281 Color::Black,
1282 1,
1283 ),
1284 VisitedInterval::new(
1285 Interval::new(830, 831),
1286 Some(Interval::new(647, 648)),
1287 Some(Interval::new(899, 900)),
1288 Color::Black,
1289 1,
1290 ),
1291 VisitedInterval::new(
1292 Interval::new(261, 262),
1293 Some(Interval::new(82, 83)),
1294 Some(Interval::new(292, 293)),
1295 Color::Red,
1296 2,
1297 ),
1298 VisitedInterval::new(Interval::new(410, 411), None, None, Color::Black, 2),
1299 VisitedInterval::new(
1300 Interval::new(647, 648),
1301 None,
1302 Some(Interval::new(815, 816)),
1303 Color::Black,
1304 2,
1305 ),
1306 VisitedInterval::new(
1307 Interval::new(899, 900),
1308 Some(Interval::new(888, 889)),
1309 Some(Interval::new(972, 973)),
1310 Color::Red,
1311 2,
1312 ),
1313 VisitedInterval::new(
1314 Interval::new(82, 83),
1315 None,
1316 Some(Interval::new(238, 239)),
1317 Color::Black,
1318 3,
1319 ),
1320 VisitedInterval::new(Interval::new(292, 293), None, None, Color::Black, 3),
1321 VisitedInterval::new(Interval::new(815, 816), None, None, Color::Red, 3),
1322 VisitedInterval::new(Interval::new(888, 889), None, None, Color::Black, 3),
1323 VisitedInterval::new(
1324 Interval::new(972, 973),
1325 Some(Interval::new(953, 954)),
1326 None,
1327 Color::Black,
1328 3,
1329 ),
1330 VisitedInterval::new(Interval::new(238, 239), None, None, Color::Red, 4),
1331 VisitedInterval::new(Interval::new(953, 954), None, None, Color::Red, 4),
1332 ];
1333
1334 let res = map.visit_level();
1335 assert_eq!(res, expected_after_delete11);
1336 }
1337
1338 impl Interval<String> {
1339 fn new_point(x: &str) -> Interval<String> {
1340 let mut hx = x.to_owned();
1341 hx.push('\0');
1342 Interval {
1343 low: x.to_owned(),
1344 high: hx,
1345 }
1346 }
1347 }
1348
1349 #[test]
1350 fn test_interval_tree_intersects() {
1351 let mut map = IntervalMap::<String, i32>::new();
1352 map.insert(Interval::new(String::from("1"), String::from("3")), 123);
1353
1354 assert!(!map.overlaps(&Interval::new_point("0")), "contains 0");
1355 assert!(map.overlaps(&Interval::new_point("1")), "missing 1");
1356 assert!(map.overlaps(&Interval::new_point("11")), "missing 11");
1357 assert!(map.overlaps(&Interval::new_point("2")), "missing 2");
1358 assert!(!map.overlaps(&Interval::new_point("3")), "contains 3");
1359 }
1360
1361 #[test]
1362 fn test_interval_tree_find_all_overlap() {
1363 let mut map = IntervalMap::<String, i32>::new();
1364 map.insert(Interval::new(String::from("0"), String::from("1")), 123);
1365 map.insert(Interval::new(String::from("0"), String::from("2")), 456);
1366 map.insert(Interval::new(String::from("5"), String::from("6")), 789);
1367 map.insert(Interval::new(String::from("6"), String::from("8")), 999);
1368 map.insert(Interval::new(String::from("0"), String::from("3")), 0);
1369
1370 let tmp = map.node_ref(map.node_ref(map.root, Node::max_index), Node::interval);
1371 assert_eq!(tmp, &Interval::new(String::from("6"), String::from("8")));
1372
1373 assert_eq!(map.find_all_overlap(&Interval::new_point("0")).len(), 3);
1374 assert_eq!(map.find_all_overlap(&Interval::new_point("1")).len(), 2);
1375 assert_eq!(map.find_all_overlap(&Interval::new_point("2")).len(), 1);
1376 assert_eq!(map.find_all_overlap(&Interval::new_point("3")).len(), 0);
1377 assert_eq!(map.find_all_overlap(&Interval::new_point("5")).len(), 1);
1378 assert_eq!(map.find_all_overlap(&Interval::new_point("55")).len(), 1);
1379 assert_eq!(map.find_all_overlap(&Interval::new_point("6")).len(), 1);
1380 }
1381
1382 type TestCaseBFn = dyn Fn(&(&Interval<i32>, &())) -> bool;
1383 struct TestCaseB {
1384 f: Box<TestCaseBFn>,
1385 wcount: i32,
1386 }
1387 #[test]
1388 fn test_interval_tree_visit_exit() {
1389 let ivls = vec![
1390 Interval::new(1, 10),
1391 Interval::new(2, 5),
1392 Interval::new(3, 6),
1393 Interval::new(4, 8),
1394 ];
1395 let ivl_range = Interval::new(0, 100);
1396
1397 let tests = [
1398 TestCaseB {
1399 f: Box::new(|_| false),
1400 wcount: 1,
1401 },
1402 TestCaseB {
1403 f: Box::new({
1404 let ivls = ivls.clone();
1405 move |v| v.0.low <= ivls[0].low
1406 }),
1407 wcount: 2,
1408 },
1409 TestCaseB {
1410 f: Box::new({
1411 let ivls = ivls.clone();
1412 move |v| v.0.low < ivls[2].low
1413 }),
1414 wcount: 3,
1415 },
1416 TestCaseB {
1417 f: Box::new(|_| true),
1418 wcount: 4,
1419 },
1420 ];
1421
1422 for (i, tt) in tests.iter().enumerate() {
1423 let mut map = IntervalMap::new();
1424 ivls.iter().for_each(|v| {
1425 map.insert(v.clone(), ());
1426 });
1427 let mut count = 0;
1428 map.filter_iter(&ivl_range).find(|v| {
1429 count += 1;
1430 !(tt.f)(v)
1431 });
1432 assert_eq!(count, tt.wcount, "#{}: error", i);
1433 }
1434 }
1435
1436 struct TestCaseC {
1437 ivls: Vec<Interval<i32>>,
1438 chk_ivl: Interval<i32>,
1439
1440 w_contains: bool,
1441 }
1442 #[test]
1443 fn test_interval_tree_contains() {
1444 let tests = [
1445 TestCaseC {
1446 ivls: vec![Interval::new(1, 10)],
1447 chk_ivl: Interval::new(0, 100),
1448
1449 w_contains: false,
1450 },
1451 TestCaseC {
1452 ivls: vec![Interval::new(1, 10)],
1453 chk_ivl: Interval::new(1, 10),
1454
1455 w_contains: true,
1456 },
1457 TestCaseC {
1458 ivls: vec![Interval::new(1, 10)],
1459 chk_ivl: Interval::new(2, 8),
1460
1461 w_contains: true,
1462 },
1463 TestCaseC {
1464 ivls: vec![Interval::new(1, 5), Interval::new(6, 10)],
1465 chk_ivl: Interval::new(1, 10),
1466
1467 w_contains: false,
1468 },
1469 TestCaseC {
1470 ivls: vec![Interval::new(1, 5), Interval::new(3, 10)],
1471 chk_ivl: Interval::new(1, 10),
1472
1473 w_contains: true,
1474 },
1475 TestCaseC {
1476 ivls: vec![
1477 Interval::new(1, 4),
1478 Interval::new(4, 7),
1479 Interval::new(3, 10),
1480 ],
1481 chk_ivl: Interval::new(1, 10),
1482
1483 w_contains: true,
1484 },
1485 TestCaseC {
1486 ivls: vec![],
1487 chk_ivl: Interval::new(1, 10),
1488
1489 w_contains: false,
1490 },
1491 ];
1492 for (i, tt) in tests.iter().enumerate() {
1493 let mut map = IntervalMap::new();
1494 tt.ivls.iter().for_each(|v| {
1495 map.insert(v.clone(), ());
1496 });
1497 assert_eq!(map.contains(&tt.chk_ivl), tt.w_contains, "#{}: error", i);
1498 }
1499 }
1500
1501 struct TestCaseA {
1502 ivls: Vec<Interval<i32>>,
1503 visit_range: Interval<i32>,
1504 }
1505 #[test]
1506 fn test_interval_tree_sorted_visit() {
1507 let tests = [
1508 TestCaseA {
1509 ivls: vec![
1510 Interval::new(1, 10),
1511 Interval::new(2, 5),
1512 Interval::new(3, 6),
1513 ],
1514 visit_range: Interval::new(0, 100),
1515 },
1516 TestCaseA {
1517 ivls: vec![
1518 Interval::new(1, 10),
1519 Interval::new(10, 12),
1520 Interval::new(3, 6),
1521 ],
1522 visit_range: Interval::new(0, 100),
1523 },
1524 TestCaseA {
1525 ivls: vec![
1526 Interval::new(2, 3),
1527 Interval::new(3, 4),
1528 Interval::new(6, 7),
1529 Interval::new(5, 6),
1530 ],
1531 visit_range: Interval::new(0, 100),
1532 },
1533 TestCaseA {
1534 ivls: vec![
1535 Interval::new(2, 3),
1536 Interval::new(2, 4),
1537 Interval::new(3, 7),
1538 Interval::new(2, 5),
1539 Interval::new(3, 8),
1540 Interval::new(3, 5),
1541 ],
1542 visit_range: Interval::new(0, 100),
1543 },
1544 ];
1545 for (i, tt) in tests.iter().enumerate() {
1546 let mut map = IntervalMap::new();
1547 tt.ivls.iter().for_each(|v| {
1548 map.insert(v.clone(), ());
1549 });
1550 let mut last = tt.ivls[0].low;
1551 let count = map
1552 .iter()
1553 .filter(|v| v.0.overlaps(&tt.visit_range))
1554 .fold(0, |acc, v| {
1555 assert!(
1556 last <= v.0.low,
1557 "#{}: expected less than {}, got interval {:?}",
1558 i,
1559 last,
1560 v.0
1561 );
1562 last = v.0.low;
1563 acc + 1
1564 });
1565 assert_eq!(count, tt.ivls.len(), "#{}: did not cover all intervals.", i);
1566 }
1567 }
1568}