#![no_std]
#![warn(clippy::cargo)]
#![deny(rustdoc::broken_intra_doc_links)]
#![deny(clippy::all)]
#![warn(
missing_debug_implementations,
trivial_numeric_casts,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
unused_must_use
)]
#![warn(clippy::pedantic)]
#![allow(clippy::comparison_chain)]
#![allow(clippy::derive_hash_xor_eq)]
#![allow(clippy::missing_panics_doc)]
#[macro_use]
pub extern crate alloc;
use alloc::{boxed::Box, rc::Rc, vec::Vec};
use core::cmp::Ord;
use core::fmt::Debug;
use core::ops::Bound;
mod interval;
pub use interval::Interval;
mod node;
use node::Node;
mod iterators;
pub use iterators::{Entry, EntryMut, IntervalTreeIterator, IntervalTreeIteratorMut};
#[derive(Clone, Default, Hash)]
pub struct IntervalTree<T: Ord, V> {
root: Option<Box<Node<T, V>>>,
}
impl<T: Ord, V> IntervalTree<T, V> {
#[must_use]
pub fn new() -> IntervalTree<T, V> {
IntervalTree { root: None }
}
#[must_use]
pub fn is_empty(&self) -> bool {
self.root.is_none()
}
#[must_use]
pub fn size(&self) -> usize {
Node::size(&self.root)
}
#[must_use]
pub fn height(&self) -> i64 {
Node::height(&self.root)
}
#[must_use]
pub fn query<'a, 'v, 'i>(
&'a self,
interval: &'i Interval<T>,
) -> IntervalTreeIterator<'v, 'i, T, V>
where
'a: 'v,
'a: 'i,
{
if let Some(ref n) = self.root {
IntervalTreeIterator {
nodes: vec![n],
interval,
}
} else {
let nodes = vec![];
IntervalTreeIterator { nodes, interval }
}
}
pub fn query_mut<'a, 'v, 'i>(
&'a mut self,
interval: &'i Interval<T>,
) -> IntervalTreeIteratorMut<'v, 'i, T, V>
where
'a: 'v,
'a: 'i,
{
if let Some(ref mut n) = self.root {
IntervalTreeIteratorMut {
nodes: vec![n],
interval,
}
} else {
let nodes = vec![];
IntervalTreeIteratorMut { nodes, interval }
}
}
#[must_use]
pub fn overlaps(&self, interval: &Interval<T>) -> bool {
self.find_overlap(interval).is_some()
}
#[must_use]
pub fn find_overlap(&self, interval: &Interval<T>) -> Option<Interval<T>> {
IntervalTree::_find_overlap(&self.root, interval)
}
fn _find_overlap(
node: &Option<Box<Node<T, V>>>,
interval: &Interval<T>,
) -> Option<Interval<T>> {
if node.is_none() {
return None;
}
let mut current = node;
while current.is_some() {
let node_ref = current.as_ref().unwrap();
if Interval::overlaps(node_ref.interval(), interval) {
break;
}
if node_ref.left_child.is_some()
&& Node::<T, V>::is_ge(
&node_ref.left_child.as_ref().unwrap().get_max(),
&interval.get_low(),
)
{
current = &node_ref.left_child;
} else {
current = &node_ref.right_child;
}
}
if current.is_none() {
None
} else {
Some(current.as_ref().unwrap().interval().duplicate())
}
}
#[must_use]
pub fn find_overlaps(&self, interval: &Interval<T>) -> Vec<Interval<T>> {
let mut overlaps = Vec::<Interval<T>>::new();
IntervalTree::_find_overlaps(&self.root, interval, &mut overlaps);
overlaps
}
fn _find_overlaps(
node: &Option<Box<Node<T, V>>>,
interval: &Interval<T>,
overlaps: &mut Vec<Interval<T>>,
) {
if node.is_none() {
return;
}
let node_ref = node.as_ref().unwrap();
if Interval::overlaps(node_ref.interval(), interval) {
overlaps.push(node_ref.interval().duplicate());
}
if node_ref.left_child.is_some()
&& Node::<T, V>::is_ge(
&node_ref.left_child.as_ref().unwrap().get_max(),
&interval.get_low(),
)
{
IntervalTree::_find_overlaps(&node_ref.left_child, interval, overlaps);
}
IntervalTree::_find_overlaps(&node_ref.right_child, interval, overlaps);
}
pub fn insert(&mut self, interval: Interval<T>, value: V) {
let max = interval.get_high();
self.root = Some(IntervalTree::_insert(
self.root.take(),
interval,
value,
max,
));
}
fn _insert(
node: Option<Box<Node<T, V>>>,
interval: Interval<T>,
value: V,
max: Rc<Bound<T>>,
) -> Box<Node<T, V>> {
if node.is_none() {
return Box::new(Node::init(interval, value, max, 0, 1));
}
let mut node_ref = node.unwrap();
if interval < *node_ref.interval() {
node_ref.left_child = Some(IntervalTree::_insert(
node_ref.left_child,
interval,
value,
max,
));
} else if interval > *node_ref.interval() {
node_ref.right_child = Some(IntervalTree::_insert(
node_ref.right_child,
interval,
value,
max,
));
} else {
return node_ref;
}
node_ref.update_height();
node_ref.update_size();
node_ref.update_max();
IntervalTree::balance(node_ref)
}
fn balance(mut node: Box<Node<T, V>>) -> Box<Node<T, V>> {
if Node::balance_factor(&node) < -1 {
if Node::balance_factor(node.right_child.as_ref().unwrap()) > 0 {
node.right_child = Some(IntervalTree::rotate_right(node.right_child.unwrap()));
}
node = IntervalTree::rotate_left(node);
} else if Node::balance_factor(&node) > 1 {
if Node::balance_factor(node.left_child.as_ref().unwrap()) < 0 {
node.left_child = Some(IntervalTree::rotate_left(node.left_child.unwrap()));
}
node = IntervalTree::rotate_right(node);
}
node
}
fn rotate_right(mut node: Box<Node<T, V>>) -> Box<Node<T, V>> {
let mut y = node.left_child.unwrap();
node.left_child = y.right_child;
y.size = node.size;
node.update_height();
node.update_size();
node.update_max();
y.right_child = Some(node);
y.update_height();
y.update_max();
y
}
fn rotate_left(mut node: Box<Node<T, V>>) -> Box<Node<T, V>> {
let mut y = node.right_child.unwrap();
node.right_child = y.left_child;
y.size = node.size;
node.update_height();
node.update_size();
node.update_max();
y.left_child = Some(node);
y.update_height();
y.update_max();
y
}
pub fn delete(&mut self, interval: &Interval<T>) {
if !self.is_empty() {
self.root = IntervalTree::_delete(self.root.take(), interval);
}
}
fn _delete(node: Option<Box<Node<T, V>>>, interval: &Interval<T>) -> Option<Box<Node<T, V>>> {
match node {
None => None,
Some(mut node) => {
if *interval < *node.interval() {
node.left_child = IntervalTree::_delete(node.left_child.take(), interval);
} else if *interval > *node.interval() {
node.right_child = IntervalTree::_delete(node.right_child.take(), interval);
} else if node.left_child.is_none() {
return node.right_child;
} else if node.right_child.is_none() {
return node.left_child;
} else {
let mut y = node;
node = IntervalTree::_min(&mut y.right_child);
node.right_child = IntervalTree::_delete_min(y.right_child.unwrap());
node.left_child = y.left_child;
}
node.update_height();
node.update_size();
node.update_max();
Some(IntervalTree::balance(node))
}
}
}
fn _min(node: &mut Option<Box<Node<T, V>>>) -> Box<Node<T, V>> {
match node {
Some(node) => {
if node.left_child.is_none() {
Box::new(Node::init(
node.get_interval(),
node.get_value(),
node.get_max(),
0,
1,
))
} else {
IntervalTree::_min(&mut node.left_child)
}
}
None => panic!("Called min on None node"),
}
}
pub fn delete_min(&mut self) {
if !self.is_empty() {
self.root = IntervalTree::_delete_min(self.root.take().unwrap());
}
}
fn _delete_min(mut node: Box<Node<T, V>>) -> Option<Box<Node<T, V>>> {
if node.left_child.is_none() {
return node.right_child.take();
}
node.left_child = IntervalTree::_delete_min(node.left_child.unwrap());
node.update_height();
node.update_size();
node.update_max();
Some(IntervalTree::balance(node))
}
pub fn delete_max(&mut self) {
if !self.is_empty() {
self.root = IntervalTree::_delete_max(self.root.take().unwrap());
}
}
fn _delete_max(mut node: Box<Node<T, V>>) -> Option<Box<Node<T, V>>> {
if node.right_child.is_none() {
return node.left_child.take();
}
node.right_child = IntervalTree::_delete_max(node.right_child.unwrap());
node.update_height();
node.update_size();
node.update_max();
Some(IntervalTree::balance(node))
}
#[must_use]
pub fn select(&self, k: usize) -> Option<Interval<T>> {
assert!(k <= self.size(), "K must be in range 0 <= k <= size - 1");
IntervalTree::_select(&self.root, k)
}
fn _select(node: &Option<Box<Node<T, V>>>, k: usize) -> Option<Interval<T>> {
if node.is_none() {
return None;
}
let node_ref = node.as_ref().unwrap();
let t = Node::size(&node_ref.left_child);
if t > k {
IntervalTree::_select(&node_ref.left_child, k)
} else if t < k {
IntervalTree::_select(&node_ref.right_child, k - t - 1)
} else {
return Some(node_ref.interval().duplicate());
}
}
#[must_use]
pub fn min(&self) -> Option<Interval<T>> {
self.select(0)
}
#[must_use]
pub fn max(&self) -> Option<Interval<T>> {
self.select(self.size() - 1)
}
#[must_use]
pub fn intervals_between(
&self,
low_bound: &Interval<T>,
high_bound: &Interval<T>,
) -> Vec<&Interval<T>> {
let mut intervals: Vec<&Interval<T>> = Vec::new();
IntervalTree::_intervals_between(&self.root, low_bound, high_bound, &mut intervals);
intervals
}
fn _intervals_between<'a>(
node: &'a Option<Box<Node<T, V>>>,
low_bound: &Interval<T>,
high_bound: &Interval<T>,
intervals: &mut Vec<&'a Interval<T>>,
) {
if node.is_none() {
return;
}
let node_ref = node.as_ref().unwrap();
if *low_bound < *node_ref.interval() {
IntervalTree::_intervals_between(
&node_ref.left_child,
low_bound,
high_bound,
intervals,
);
}
if *low_bound <= *node_ref.interval() && *node_ref.interval() <= *high_bound {
intervals.push(node_ref.interval());
}
if *high_bound > *node_ref.interval() {
IntervalTree::_intervals_between(
&node_ref.right_child,
low_bound,
high_bound,
intervals,
);
}
}
#[must_use]
pub fn intervals(&self) -> Vec<Interval<T>> {
let mut intervals: Vec<Interval<T>> = Vec::new();
IntervalTree::_intervals_in_order(&self.root, &mut intervals);
intervals
}
fn _intervals_in_order(node: &Option<Box<Node<T, V>>>, intervals: &mut Vec<Interval<T>>) {
if node.is_none() {
return;
}
let node_ref = node.as_ref().unwrap();
IntervalTree::_intervals_in_order(&node_ref.left_child, intervals);
intervals.push(node_ref.interval().duplicate());
IntervalTree::_intervals_in_order(&node_ref.right_child, intervals);
}
#[must_use]
pub fn rank(&self, interval: &Interval<T>) -> usize {
IntervalTree::_rank(&self.root, interval)
}
fn _rank(node: &Option<Box<Node<T, V>>>, interval: &Interval<T>) -> usize {
if node.is_none() {
return 0;
}
let node_ref = node.as_ref().unwrap();
if *interval < *node_ref.interval() {
IntervalTree::_rank(&node_ref.left_child, interval)
} else if *interval >= *node_ref.interval() {
1 + Node::size(&node_ref.left_child)
+ IntervalTree::_rank(&node_ref.right_child, interval)
} else {
Node::size(&node_ref.left_child)
}
}
#[must_use]
pub fn size_between(&self, low_bound: &Interval<T>, high_bound: &Interval<T>) -> usize {
if self.is_empty() {
return 0;
}
if *low_bound > *high_bound {
return 0;
}
self.rank(high_bound) - self.rank(low_bound) + 1
}
}
impl<T: Debug + Ord, V: Debug> Debug for IntervalTree<T, V> {
fn fmt(&self, fmt: &mut core::fmt::Formatter) -> core::fmt::Result {
fmt.write_str("IntervalTree ")?;
fmt.debug_set().entries(self.intervals().iter()).finish()
}
}
#[cfg(test)]
mod tests {
use alloc::string::String;
use super::*;
use core::ops::Bound::{Excluded, Included, Unbounded};
#[test]
fn tree_interval_init() {
let interval_tree = IntervalTree::<usize, ()>::new();
assert!(interval_tree.is_empty());
assert_eq!(interval_tree.size(), 0);
}
#[test]
fn tree_interval_insert() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Included(0), Included(3)), ());
interval_tree.insert(Interval::new(Included(5), Included(8)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Included(8), Included(9)), ());
interval_tree.insert(Interval::new(Included(15), Included(23)), ());
interval_tree.insert(Interval::new(Included(16), Included(21)), ());
interval_tree.insert(Interval::new(Included(17), Included(19)), ());
interval_tree.insert(Interval::new(Included(19), Included(20)), ());
interval_tree.insert(Interval::new(Included(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
assert_eq!(interval_tree.size(), 10);
}
#[test]
fn tree_interval_find_overlap_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Included(0), Included(3)), ());
interval_tree.insert(Interval::new(Included(5), Included(8)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Included(8), Included(9)), ());
interval_tree.insert(Interval::new(Included(15), Included(23)), ());
interval_tree.insert(Interval::new(Included(16), Included(21)), ());
interval_tree.insert(Interval::new(Included(17), Included(19)), ());
interval_tree.insert(Interval::new(Included(19), Included(20)), ());
interval_tree.insert(Interval::new(Included(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(1), Included(2)))
.unwrap()
) == *"[0,3]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(4), Included(5)))
.unwrap()
) == *"[5,8]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(10), Included(14)))
.unwrap()
) == *"[6,10]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(14), Included(15)))
.unwrap()
) == *"[15,23]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(15), Included(18)))
.unwrap()
) == *"[16,21]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(19), Included(19)))
.unwrap()
) == *"[19,20]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(23), Included(23)))
.unwrap()
) == *"[15,23]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(24), Included(26)))
.unwrap()
) == *"[25,30]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(26), Included(36)))
.unwrap()
) == *"[25,30]"
);
assert!(interval_tree
.find_overlap(&Interval::new(Included(31), Included(36)))
.is_none());
assert!(interval_tree
.find_overlap(&Interval::new(Included(12), Included(12)))
.is_none());
assert!(interval_tree
.find_overlap(&Interval::new(Included(13), Included(13)))
.is_none());
assert!(interval_tree
.find_overlap(&Interval::new(Included(12), Included(14)))
.is_none());
}
#[test]
fn tree_interval_find_overlap_2() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Included(0), Excluded(3)), ());
interval_tree.insert(Interval::new(Excluded(5), Included(8)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Excluded(8), Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Included(16), Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Included(20)), ());
interval_tree.insert(Interval::new(Excluded(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(1), Included(2)))
.unwrap()
) == *"[0,3)"
);
assert!(interval_tree
.find_overlap(&Interval::new(Included(4), Included(5)))
.is_none());
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(10), Included(14)))
.unwrap()
) == *"[6,10]"
);
assert!(interval_tree
.find_overlap(&Interval::new(Included(14), Included(15)))
.is_none());
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(15), Included(18)))
.unwrap()
) == *"[16,21)"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(19), Included(19)))
.unwrap()
) == *"[16,21)"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Excluded(23), Included(26)))
.unwrap()
) == *"(25,30]"
);
assert!(interval_tree
.find_overlap(&Interval::new(Excluded(10), Excluded(15)))
.is_none());
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Excluded(21), Included(23)))
.unwrap()
) == *"(15,23)"
);
assert!(interval_tree
.find_overlap(&Interval::new(Included(31), Included(36)))
.is_none());
assert!(interval_tree
.find_overlap(&Interval::new(Included(12), Included(12)))
.is_none());
assert!(interval_tree
.find_overlap(&Interval::new(Included(13), Included(13)))
.is_none());
assert!(interval_tree
.find_overlap(&Interval::new(Included(12), Included(14)))
.is_none());
}
#[test]
fn tree_interval_find_overlap_3() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Unbounded, Excluded(3)), ());
interval_tree.insert(Interval::new(Excluded(5), Included(8)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Unbounded, Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Unbounded, Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Unbounded), ());
interval_tree.insert(Interval::new(Unbounded, Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Unbounded), ());
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(1), Included(2)))
.unwrap()
) == *"(_,9]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(4), Included(5)))
.unwrap()
) == *"(_,9]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(10), Included(14)))
.unwrap()
) == *"(_,21)"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(14), Included(15)))
.unwrap()
) == *"(_,21)"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(15), Included(18)))
.unwrap()
) == *"(_,21)"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Included(19), Included(19)))
.unwrap()
) == *"(_,21)"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Excluded(23), Included(26)))
.unwrap()
) == *"(_,30]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Excluded(21), Included(23)))
.unwrap()
) == *"(_,30]"
);
assert!(
format!(
"{}",
interval_tree
.find_overlap(&Interval::new(Unbounded, Included(0)))
.unwrap()
) == *"(_,9]"
);
}
#[test]
fn tree_interval_delete_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Included(0), Included(3)), ());
interval_tree.insert(Interval::new(Included(5), Included(8)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Included(8), Included(9)), ());
interval_tree.insert(Interval::new(Included(15), Included(23)), ());
interval_tree.insert(Interval::new(Included(16), Included(21)), ());
interval_tree.insert(Interval::new(Included(17), Included(19)), ());
interval_tree.insert(Interval::new(Included(19), Included(20)), ());
interval_tree.insert(Interval::new(Included(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
let mut interval = Interval::new(Included(1), Included(2));
let mut overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
interval_tree.delete(&overlapped_interval);
assert!(interval_tree.find_overlap(&interval).is_none());
interval = Interval::new(Included(15), Included(18));
overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
interval_tree.delete(&overlapped_interval);
overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
interval_tree.delete(&overlapped_interval);
overlapped_interval = interval_tree.find_overlap(&interval).unwrap();
interval_tree.delete(&overlapped_interval);
assert!(interval_tree.find_overlap(&interval).is_none());
}
#[test]
fn tree_interval_delete_max_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Excluded(0), Included(1)), ());
interval_tree.insert(Interval::new(Included(0), Excluded(3)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Excluded(8), Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Included(16), Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Included(20)), ());
interval_tree.insert(Interval::new(Excluded(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
interval_tree.delete_max();
interval_tree.delete_max();
assert!(interval_tree
.find_overlap(&Interval::new(Included(23), Included(23)))
.is_none());
}
#[test]
fn tree_interval_delete_min_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Included(0), Included(3)), ());
interval_tree.insert(Interval::new(Included(5), Included(8)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Included(8), Included(9)), ());
interval_tree.insert(Interval::new(Included(15), Included(23)), ());
interval_tree.insert(Interval::new(Included(16), Included(21)), ());
interval_tree.insert(Interval::new(Included(17), Included(19)), ());
interval_tree.insert(Interval::new(Included(19), Included(20)), ());
interval_tree.insert(Interval::new(Included(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
interval_tree.delete_min();
interval_tree.delete_min();
assert!(interval_tree
.find_overlap(&Interval::new(Included(1), Excluded(6)))
.is_none());
}
#[test]
fn tree_interval_select_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Excluded(0), Included(1)), ());
interval_tree.insert(Interval::new(Included(0), Excluded(3)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Excluded(8), Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Included(16), Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Included(20)), ());
interval_tree.insert(Interval::new(Excluded(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
assert!(format!("{}", interval_tree.select(0).unwrap()) == *"[0,3)");
assert!(format!("{}", interval_tree.select(1).unwrap()) == *"(0,1]");
assert!(format!("{}", interval_tree.select(2).unwrap()) == *"[6,10]");
assert!(format!("{}", interval_tree.select(3).unwrap()) == *"(8,9]");
assert!(format!("{}", interval_tree.select(4).unwrap()) == *"(15,23)");
assert!(format!("{}", interval_tree.select(5).unwrap()) == *"[16,21)");
assert!(format!("{}", interval_tree.select(6).unwrap()) == *"[17,19)");
assert!(format!("{}", interval_tree.select(7).unwrap()) == *"(19,20]");
assert!(format!("{}", interval_tree.select(8).unwrap()) == *"(25,30]");
assert!(format!("{}", interval_tree.select(9).unwrap()) == *"[26,26]");
}
#[test]
fn tree_interval_intervals_between_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Excluded(0), Included(1)), ());
interval_tree.insert(Interval::new(Included(0), Excluded(3)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Excluded(8), Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Included(16), Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Included(20)), ());
interval_tree.insert(Interval::new(Excluded(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
let low = Interval::new(Included(14), Included(14));
let high = Interval::new(Included(24), Included(24));
let intervals = interval_tree.intervals_between(&low, &high);
let accept = String::from("(15,23)[16,21)[17,19)(19,20]");
let mut result = String::from("");
for interval in intervals {
result.push_str(&format!("{}", interval));
}
assert_eq!(result, accept);
}
#[test]
fn tree_interval_find_overlaps_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Excluded(0), Included(1)), ());
interval_tree.insert(Interval::new(Included(0), Excluded(3)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Excluded(8), Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Included(16), Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Included(20)), ());
interval_tree.insert(Interval::new(Excluded(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
let interval = Interval::new(Included(8), Included(26));
let intervals = interval_tree.find_overlaps(&interval);
let accept = String::from("(8,9][6,10](19,20][16,21)(15,23)[17,19)(25,30][26,26]");
let mut result = String::from("");
for interval in intervals {
result.push_str(&format!("{}", interval));
}
assert_eq!(result, accept);
}
#[test]
fn tree_interval_query_1() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
interval_tree.insert(Interval::new(Excluded(0), Included(1)), ());
interval_tree.insert(Interval::new(Included(0), Excluded(3)), ());
interval_tree.insert(Interval::new(Included(6), Included(10)), ());
interval_tree.insert(Interval::new(Excluded(8), Included(9)), ());
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), ());
interval_tree.insert(Interval::new(Included(16), Excluded(21)), ());
interval_tree.insert(Interval::new(Included(17), Excluded(19)), ());
interval_tree.insert(Interval::new(Excluded(19), Included(20)), ());
interval_tree.insert(Interval::new(Excluded(25), Included(30)), ());
interval_tree.insert(Interval::new(Included(26), Included(26)), ());
let interval = Interval::new(Included(8), Included(26));
let iter = interval_tree.query(&interval);
let accept = String::from("(8,9][6,10](19,20][16,21)(15,23)[17,19)(25,30][26,26]");
let mut result = String::from("");
for entry in iter {
result.push_str(&format!("{}", entry.interval()));
}
assert_eq!(result, accept);
}
#[test]
fn tree_interval_query_2() {
let mut interval_tree = IntervalTree::<usize, bool>::new();
interval_tree.insert(Interval::new(Excluded(0), Included(1)), true);
interval_tree.insert(Interval::new(Included(0), Excluded(3)), true);
interval_tree.insert(Interval::new(Included(6), Included(10)), true);
interval_tree.insert(Interval::new(Excluded(8), Included(9)), true);
interval_tree.insert(Interval::new(Excluded(15), Excluded(23)), true);
interval_tree.insert(Interval::new(Included(16), Excluded(21)), true);
interval_tree.insert(Interval::new(Included(17), Excluded(19)), true);
interval_tree.insert(Interval::new(Excluded(19), Included(20)), true);
interval_tree.insert(Interval::new(Excluded(25), Included(30)), true);
interval_tree.insert(Interval::new(Included(26), Included(26)), true);
let interval = Interval::new(Included(8), Included(26));
let iter = interval_tree.query_mut(&interval);
for mut entry in iter {
*entry.value() = false;
}
let iter = interval_tree.query(&interval);
for entry in iter {
assert!(!*entry.value());
}
}
#[test]
fn tree_interval_debug() {
let mut interval_tree = IntervalTree::<usize, ()>::new();
assert_eq!(format!("{:?}", &interval_tree), "IntervalTree {}");
interval_tree.insert(Interval::new(Excluded(0), Included(1)), ());
assert_eq!(
format!("{:?}", &interval_tree),
"IntervalTree {Interval { low: Excluded(0), high: Included(1) }}"
);
}
}