#![deny(
missing_docs,
missing_debug_implementations,
missing_copy_implementations,
trivial_casts,
trivial_numeric_casts,
unstable_features,
unused_import_braces,
unused_qualifications
)]
#![cfg_attr(not(feature = "std"), no_std)]
#[cfg(feature = "std")]
use std::{
collections::{
btree_map::{Iter, IterMut},
BTreeMap,
},
ops::{Deref, DerefMut, Range},
};
#[cfg(not(feature = "std"))]
extern crate alloc;
#[cfg(not(feature = "std"))]
use alloc::collections::{
btree_map::{Iter, IterMut},
BTreeMap,
};
#[cfg(not(feature = "std"))]
use alloc::{vec, vec::Vec};
#[cfg(not(feature = "std"))]
use core::ops::{Deref, DerefMut, Range};
#[cfg(not(feature = "std"))]
pub use alloc::collections::btree_map::Range as ValueRange;
#[cfg(not(feature = "std"))]
pub use alloc::collections::btree_map::RangeMut as ValueRangeMut;
#[cfg(feature = "std")]
pub use std::collections::btree_map::Range as ValueRange;
#[cfg(feature = "std")]
pub use std::collections::btree_map::RangeMut as ValueRangeMut;
#[derive(Clone, Debug, Copy, PartialEq, Eq)]
pub struct IntervalValue<K, V> {
val: V,
end: K,
}
impl<K, V> IntervalValue<K, V> {
fn new(val: V, end: K) -> Self {
Self { val, end }
}
pub fn value(&self) -> &V {
&self.val
}
pub fn value_mut(&mut self) -> &mut V {
&mut self.val
}
pub fn into_inner(self) -> V {
self.val
}
pub fn end(&self) -> &K {
&self.end
}
pub fn into_end(self) -> K {
self.end
}
}
impl<K, V> Deref for IntervalValue<K, V> {
type Target = V;
fn deref(&self) -> &Self::Target {
self.value()
}
}
impl<K, V> DerefMut for IntervalValue<K, V> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.value_mut()
}
}
#[derive(Clone, Debug)]
pub struct NonOverlappingIntervalTree<K, V> {
tree: BTreeMap<K, IntervalValue<K, V>>,
}
impl<K, V> Default for NonOverlappingIntervalTree<K, V> {
fn default() -> Self {
Self::new()
}
}
impl<K, V> NonOverlappingIntervalTree<K, V> {
pub fn new() -> Self {
Self {
tree: BTreeMap::new(),
}
}
}
fn overlap<R: PartialOrd>(a: &Range<R>, b: &Range<R>) -> bool {
a.start < b.end && b.start < a.end
}
impl<K: Ord + Clone, V> NonOverlappingIntervalTree<K, V> {
pub fn insert(&mut self, int: Range<K>, val: V) -> Option<V> {
self.tree
.insert(int.start, IntervalValue::new(val, int.end))
.map(|v| v.val)
}
pub fn insert_replace(&mut self, int: Range<K>, val: V) -> Vec<(Range<K>, V)> {
let mut removed = vec![];
'outer: loop {
let noderange = self.tree.range(..&int.end);
let mut count = 0;
for n in noderange.rev() {
let thisrange = K::clone(n.0)..K::clone(&n.1.end);
if int.start >= n.1.end {
break 'outer;
}
if overlap(&thisrange, &int) {
let rem = self.tree.remove(&thisrange.start).unwrap().val;
removed.push((thisrange, rem));
break;
}
count += 1;
}
if count == 0 {
break;
}
}
let key = int.start;
if let Some(v) = self
.tree
.insert(K::clone(&key), IntervalValue::new(val, int.end))
{
removed.push((key..v.end, v.val));
}
removed
}
pub fn get(&self, point: &K) -> Option<&V> {
if let Some(v) = self.tree.get(point) {
return Some(&v.val);
}
let noderange = self.tree.range(..point);
if let Some(prev) = noderange.last() {
let range = prev.0..&prev.1.end;
if range.contains(&point) {
return Some(&prev.1.val);
}
}
None
}
pub fn get_mut(&mut self, point: &K) -> Option<&mut V> {
let noderange = self.tree.range_mut(..=point);
if let Some(prev) = noderange.last() {
let range = prev.0..&prev.1.end;
if range.contains(&point) {
return Some(&mut prev.1.val);
}
}
None
}
pub fn remove(&mut self, point: &K) -> Option<V> {
if let Some(v) = self.tree.remove(point) {
return Some(v.val);
}
let range = {
self.tree
.range(..point)
.last()
.map(|prev| K::clone(prev.0)..K::clone(&prev.1.end))
};
if let Some(range) = range {
if range.contains(point) {
return self.tree.remove(&range.start).map(|v| v.val);
}
}
None
}
fn elem_range_that_may_overlap_range(&self, range: Range<K>) -> Range<K> {
let start = range.start;
let maybe_range_before = self.tree.range(..K::clone(&start)).last();
let adjusted_start = match maybe_range_before {
Some((preceding_start, interval_value)) if (preceding_start..&interval_value.end).contains(&&start) => preceding_start,
_ => &start,
};
K::clone(adjusted_start)..range.end
}
pub fn range(&self, range: Range<K>) -> ValueRange<'_, K, IntervalValue<K, V>> {
self.tree.range(self.elem_range_that_may_overlap_range(range))
}
pub fn range_mut(&mut self, range: Range<K>) -> ValueRangeMut<'_, K, IntervalValue<K, V>> {
self.tree.range_mut(self.elem_range_that_may_overlap_range(range))
}
pub fn clear(&mut self) {
self.tree.clear()
}
pub fn iter(&self) -> Iter<'_, K, IntervalValue<K, V>> {
self.tree.iter()
}
pub fn iter_mut(&mut self) -> IterMut<'_, K, IntervalValue<K, V>> {
self.tree.iter_mut()
}
pub fn len(&self) -> usize {
self.tree.len()
}
pub fn is_empty(&self) -> bool {
self.tree.is_empty()
}
}
#[cfg(all(test, feature = "std"))]
mod tests {
use std::vec;
use crate::NonOverlappingIntervalTree;
#[test]
fn it_inserts() {
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(0..5, "hello").len(), 0);
}
#[test]
fn it_looksup() {
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(1..3, "hello").len(), 0);
assert_eq!(it.insert_replace(3..5, "world").len(), 0);
assert_eq!(it.insert_replace(7..9, "foo").len(), 0);
assert_eq!(it.insert_replace(100..101, "bar").len(), 0);
let res = it.get(&1);
assert_eq!(res, Some(&"hello"));
let res = it.get(&2);
assert_eq!(res, Some(&"hello"));
let res = it.get(&10);
assert_eq!(res, None);
let res = it.get(&0);
assert_eq!(res, None);
let res = it.get(&3);
assert_eq!(res, Some(&"world"));
let res = it.get(&4);
assert_eq!(res, Some(&"world"));
let res = it.get(&5);
assert_eq!(res, None);
let res = it.get(&7);
assert_eq!(res, Some(&"foo"));
let res = it.get(&8);
assert_eq!(res, Some(&"foo"));
let res = it.get(&100);
assert_eq!(res, Some(&"bar"));
let res = it.get(&99);
assert_eq!(res, None);
let res = it.get(&101);
assert_eq!(res, None);
}
#[test]
fn it_looksup_mut() {
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(1..3, "hello").len(), 0);
assert_eq!(it.insert_replace(3..5, "world").len(), 0);
assert_eq!(it.insert_replace(7..9, "foo").len(), 0);
assert_eq!(it.insert_replace(100..101, "bar").len(), 0);
let res = it.get_mut(&1);
assert_eq!(res, Some(&mut "hello"));
let res = it.get_mut(&2);
assert_eq!(res, Some(&mut "hello"));
let res = it.get_mut(&10);
assert_eq!(res, None);
let res = it.get_mut(&0);
assert_eq!(res, None);
let res = it.get_mut(&3);
assert_eq!(res, Some(&mut "world"));
let res = it.get_mut(&4);
assert_eq!(res, Some(&mut "world"));
let res = it.get_mut(&5);
assert_eq!(res, None);
let res = it.get_mut(&7);
assert_eq!(res, Some(&mut "foo"));
let res = it.get_mut(&8);
assert_eq!(res, Some(&mut "foo"));
let res = it.get_mut(&100);
assert_eq!(res, Some(&mut "bar"));
let res = it.get_mut(&99);
assert_eq!(res, None);
let res = it.get_mut(&101);
assert_eq!(res, None);
}
#[test]
fn it_removes() {
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(1..3, "hello").len(), 0);
assert_eq!(it.get(&2), Some(&"hello"));
assert_eq!(it.remove(&2), Some("hello"));
assert_eq!(it.get(&1), None);
assert_eq!(it.get(&2), None);
assert_eq!(it.get(&3), None);
}
#[test]
fn it_does_ranges() {
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(1..3, "hello").len(), 0);
assert_eq!(it.insert_replace(4..6, "world").len(), 0);
assert_eq!(it.insert_replace(10..12, "bad").len(), 0);
let r: Vec<&str> = it.range(1..3).map(|r| *r.1.value()).collect();
assert_eq!(r, vec!["hello"]);
let r: Vec<&str> = it.range(1..5).map(|r| *r.1.value()).collect();
assert_eq!(r, vec!["hello", "world"]);
let r: Vec<&str> = it.range(2..8).map(|r| *r.1.value()).collect();
assert_eq!(r, vec!["hello", "world"]);
let r: Vec<&str> = it.range(1..80).map(|r| *r.1.value()).collect();
assert_eq!(r, vec!["hello", "world", "bad"]);
let r: Vec<&str> = it.range(11..12).map(|r| *r.1.value()).collect();
assert_eq!(r, vec!["bad"]);
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(3..5, "test").len(), 0);
assert_eq!(it.range(100..200).count(), 0);
assert_eq!(it.range_mut(100..200).count(), 0);
assert_eq!(it.range(0..3).count(), 0);
assert_eq!(it.range(0..4).count(), 1);
assert_eq!(it.range(0..5).count(), 1);
assert_eq!(it.range(0..6).count(), 1);
assert_eq!(it.range(3..5).count(), 1);
assert_eq!(it.range(3..6).count(), 1);
assert_eq!(it.range(5..6).count(), 0);
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(
it.insert_replace(34583076667392u64..34600256536576u64, "world")
.len(),
0
);
assert_eq!(it.range(67087389159424u64..67104569032704u64).count(), 0);
assert_eq!(it.range_mut(67087389159424u64..67104569032704u64).count(), 0);
}
#[test]
fn it_replaces() {
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(1..4, "hello").len(), 0);
assert_eq!(it.insert_replace(2..3, "world"), vec![(1..4, "hello")]);
assert_eq!(it.get(&1), None);
assert_eq!(it.get(&2), Some(&"world"));
assert_eq!(it.get(&3), None);
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(1..3, "hello").len(), 0);
assert_eq!(it.insert_replace(2..3, "world"), vec![(1..3, "hello")]);
assert_eq!(it.get(&1), None);
assert_eq!(it.get(&2), Some(&"world"));
assert_eq!(it.get(&3), None);
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(2..4, "hello").len(), 0);
assert_eq!(it.insert_replace(1..3, "world"), vec![(2..4, "hello")]);
assert_eq!(it.get(&1), Some(&"world"));
assert_eq!(it.get(&2), Some(&"world"));
assert_eq!(it.get(&3), None);
let mut it = NonOverlappingIntervalTree::new();
assert_eq!(it.insert_replace(2..3, "hello").len(), 0);
assert_eq!(it.insert_replace(1..4, "world"), vec![(2..3, "hello")]);
assert_eq!(it.get(&1), Some(&"world"));
assert_eq!(it.get(&2), Some(&"world"));
assert_eq!(it.get(&3), Some(&"world"));
}
}