#![no_std]
#[cfg(feature = "std")]
extern crate std;
extern crate alloc;
pub mod ix;
pub mod iter;
pub mod set;
pub mod entry;
mod tree_rm;
mod bitvec;
#[cfg(all(test, feature = "std"))]
mod tests;
use alloc::vec::Vec;
use core::{
ops::{Range, RangeFull, RangeInclusive, RangeBounds, Bound, AddAssign, Sub, Index},
fmt::{self, Debug, Display, Formatter},
cmp::Ordering,
iter::FromIterator,
};
#[cfg(feature = "dot")]
use std::io::{self, Write};
#[cfg(feature = "serde")]
use {
core::marker::PhantomData,
serde::{
Serialize, Serializer, Deserialize, Deserializer,
ser::{SerializeTuple, SerializeSeq},
de::{Visitor, SeqAccess},
},
};
use ix::IndexType;
use iter::*;
use bitvec::BitVec;
pub use ix::DefaultIx;
pub use set::IntervalSet;
pub use entry::Entry;
#[derive(Clone, Debug, PartialEq, PartialOrd)]
struct Interval<T> {
start: T,
end: T,
}
impl<T: PartialOrd + Copy> Interval<T> {
fn new(range: &Range<T>) -> Self {
check_interval(range.start, range.end);
Interval {
start: range.start,
end: range.end,
}
}
fn intersects_range(&self, range: &impl RangeBounds<T>) -> bool {
(match range.end_bound() {
Bound::Included(&value) => self.start <= value,
Bound::Excluded(&value) => self.start < value,
Bound::Unbounded => true,
})
&&
(match range.start_bound() {
Bound::Included(&value) | Bound::Excluded(&value) => self.end > value,
Bound::Unbounded => true,
})
}
fn extend(&mut self, other: &Interval<T>) {
if other.start < self.start {
self.start = other.start;
}
if other.end > self.end {
self.end = other.end;
}
}
fn contains(&self, other: &Interval<T>) -> bool {
self.start <= other.start && other.end <= self.end
}
}
impl<T: Copy> Interval<T> {
#[inline]
fn to_range(&self) -> Range<T> {
self.start..self.end
}
}
impl<T: Display> Display for Interval<T> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "{}..{}", self.start, self.end)
}
}
impl<T: PartialOrd + Copy> Ord for Interval<T> {
fn cmp(&self, other: &Self) -> Ordering {
if self.start < other.start {
Ordering::Less
} else if self.start == other.start {
if self.end < other.end {
Ordering::Less
} else if self.end == other.end {
Ordering::Equal
} else {
Ordering::Greater
}
} else {
Ordering::Greater
}
}
}
impl<T: PartialOrd + Copy> Eq for Interval<T> { }
#[cfg(feature = "serde")]
impl<T: Serialize> Serialize for Interval<T> {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
(&self.start, &self.end).serialize(serializer)
}
}
#[cfg(feature = "serde")]
impl<'de, T: Deserialize<'de>> Deserialize<'de> for Interval<T> {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let (start, end) = <(T, T)>::deserialize(deserializer)?;
Ok(Interval { start, end })
}
}
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
#[derive(Debug, Clone)]
#[repr(C)]
struct Node<T, V, Ix> {
interval: Interval<T>,
subtree_interval: Interval<T>,
value: V,
left: Ix,
right: Ix,
parent: Ix,
}
impl<T: Copy, V, Ix: IndexType> Node<T, V, Ix> {
fn new(interval: Interval<T>, value: V) -> Self {
Node {
interval: interval.clone(),
subtree_interval: interval,
value,
left: Ix::MAX,
right: Ix::MAX,
parent: Ix::MAX,
}
}
}
impl<T, V, Ix: IndexType> Node<T, V, Ix> {
fn swap_with(&mut self, other: &mut Self) {
core::mem::swap(&mut self.value, &mut other.value);
core::mem::swap(&mut self.interval, &mut other.interval);
core::mem::swap(&mut self.subtree_interval, &mut other.subtree_interval);
}
}
#[cfg(feature = "dot")]
impl<T: Display, V: Display, Ix: IndexType> Node<T, V, Ix> {
fn write_dot(&self, index: usize, is_red: bool, mut writer: impl Write) -> io::Result<()> {
writeln!(writer, " {} [label=\"i={}\\n{}: {}\\nsubtree: {}\", fillcolor={}, style=filled]",
index, index, self.interval, self.value, self.subtree_interval, if is_red { "salmon" } else { "grey65" })?;
if self.left.defined() {
writeln!(writer, " {} -> {} [label=\"L\"]", index, self.left)?;
}
if self.right.defined() {
writeln!(writer, " {} -> {} [label=\"R\"]", index, self.right)?;
}
Ok(())
}
}
#[cfg(feature = "dot")]
impl<T: Display, V, Ix: IndexType> Node<T, V, Ix> {
fn write_dot_without_values(&self, index: usize, is_red: bool, mut writer: impl Write) -> io::Result<()> {
writeln!(writer, " {} [label=\"i={}: {}\\nsubtree: {}\", fillcolor={}, style=filled]",
index, index, self.interval, self.subtree_interval, if is_red { "salmon" } else { "grey65" })?;
if self.left.defined() {
writeln!(writer, " {} -> {} [label=\"L\"]", index, self.left)?;
}
if self.right.defined() {
writeln!(writer, " {} -> {} [label=\"R\"]", index, self.right)?;
}
Ok(())
}
}
fn check_interval<T: PartialOrd + Copy>(start: T, end: T) {
if start < end {
assert!(end > start, "Interval cannot be ordered (`start < end` but not `end > start`)");
} else if end <= start {
panic!("Interval is empty (`start >= end`)");
} else {
panic!("Interval cannot be ordered (not `start < end` and not `end <= start`)");
}
}
fn check_interval_incl<T: PartialOrd + Copy>(start: T, end: T) {
if start <= end {
assert!(end >= start, "Interval cannot be ordered (`start < end` but not `end > start`)");
} else if end < start {
panic!("Interval is empty (`start > end`)");
} else {
panic!("Interval cannot be ordered (not `start <= end` and not `end < start`)");
}
}
fn check_ordered<T: PartialOrd, R: RangeBounds<T>>(range: &R) {
match (range.start_bound(), range.end_bound()) {
(_, Bound::Unbounded) | (Bound::Unbounded, _) => {},
(Bound::Included(a), Bound::Included(b)) => check_interval_incl(a, b),
(Bound::Included(a), Bound::Excluded(b))
| (Bound::Excluded(a), Bound::Included(b))
| (Bound::Excluded(a), Bound::Excluded(b)) => check_interval(a, b),
}
}
#[derive(Clone)]
pub struct IntervalMap<T, V, Ix: IndexType = DefaultIx> {
nodes: Vec<Node<T, V, Ix>>,
colors: BitVec,
root: Ix,
}
impl<T: PartialOrd + Copy, V> IntervalMap<T, V> {
pub fn new() -> Self {
Self::default()
}
}
impl<T: PartialOrd + Copy, V, Ix: IndexType> Default for IntervalMap<T, V, Ix> {
fn default() -> Self {
Self {
nodes: Vec::new(),
colors: BitVec::new(),
root: Ix::MAX,
}
}
}
impl<T: PartialOrd + Copy, V, Ix: IndexType> IntervalMap<T, V, Ix> {
pub fn with_capacity(capacity: usize) -> Self {
Self {
nodes: Vec::with_capacity(capacity),
colors: BitVec::with_capacity(capacity),
root: Ix::MAX,
}
}
fn init_from_sorted(&mut self, start: usize, end: usize, rev_depth: u16) -> Ix {
debug_assert!(start < end);
if start + 1 == end {
if rev_depth == 1 {
self.colors.set1(start);
}
return Ix::new(start).unwrap();
}
let center = (start + end) / 2;
let center_ix = Ix::new(center).unwrap();
if start < center {
let left_ix = self.init_from_sorted(start, center, rev_depth - 1);
self.nodes[center].left = left_ix;
self.nodes[left_ix.get()].parent = center_ix;
}
if center + 1 < end {
let right_ix = self.init_from_sorted(center + 1, end, rev_depth - 1);
self.nodes[center].right = right_ix;
self.nodes[right_ix.get()].parent = center_ix;
}
self.update_subtree_interval(center_ix);
center_ix
}
pub fn from_sorted(iter: impl IntoIterator<Item = (Range<T>, V)>) -> Self {
let nodes: Vec<_> = iter.into_iter().map(|(range, value)| Node::new(Interval::new(&range), value)).collect();
let n = nodes.len();
let mut map = Self {
nodes,
colors: BitVec::from_elem(n, false), root: Ix::MAX,
};
for (i, consec_nodes) in map.nodes.windows(2).enumerate() {
assert!(consec_nodes[0].interval < consec_nodes[1].interval,
"Cannot construct interval map from sorted nodes: intervals at positions {} and {} are unordered!",
i, i + 1);
}
if n > 0 {
let max_depth = (usize::BITS - n.leading_zeros()) as u16;
map.root = map.init_from_sorted(0, n, max_depth);
map.set_black(map.root);
}
map
}
#[inline]
pub fn len(&self) -> usize {
self.nodes.len()
}
#[inline]
pub fn is_empty(&self) -> bool {
self.nodes.is_empty()
}
pub fn clear(&mut self) {
self.nodes.clear();
self.colors.clear();
self.root = Ix::MAX;
}
pub fn shrink_to_fit(&mut self) {
self.nodes.shrink_to_fit();
self.colors.shrink_to_fit();
}
#[inline]
fn is_red(&self, ix: Ix) -> bool {
self.colors.get(ix.get())
}
#[inline]
fn is_black(&self, ix: Ix) -> bool {
!self.colors.get(ix.get())
}
#[inline]
fn is_black_or_nil(&self, ix: Ix) -> bool {
!ix.defined() || !self.colors.get(ix.get())
}
#[inline]
fn set_red(&mut self, ix: Ix) {
self.colors.set1(ix.get());
}
#[inline]
fn set_black(&mut self, ix: Ix) {
self.colors.set0(ix.get());
}
fn update_subtree_interval(&mut self, index: Ix) {
let node = &self.nodes[index.get()];
let mut subtree_interval = node.interval.clone();
if node.left.defined() {
subtree_interval.extend(&self.nodes[node.left.get()].subtree_interval);
}
if node.right.defined() {
subtree_interval.extend(&self.nodes[node.right.get()].subtree_interval);
}
self.nodes[index.get()].subtree_interval = subtree_interval;
}
fn sibling(&self, index: Ix) -> Ix {
let parent = self.nodes[index.get()].parent;
if !parent.defined() {
Ix::MAX
} else if self.nodes[parent.get()].left == index {
self.nodes[parent.get()].right
} else {
self.nodes[parent.get()].left
}
}
fn rotate_left(&mut self, index: Ix) {
let prev_parent = self.nodes[index.get()].parent;
let prev_right = self.nodes[index.get()].right;
debug_assert!(prev_right.defined());
let new_right = self.nodes[prev_right.get()].left;
self.nodes[index.get()].right = new_right;
if new_right.defined() {
self.nodes[new_right.get()].parent = index;
}
self.update_subtree_interval(index);
self.nodes[prev_right.get()].left = index;
self.nodes[index.get()].parent = prev_right;
self.update_subtree_interval(prev_right);
if prev_parent.defined() {
if self.nodes[prev_parent.get()].left == index {
self.nodes[prev_parent.get()].left = prev_right;
} else {
self.nodes[prev_parent.get()].right = prev_right;
}
self.nodes[prev_right.get()].parent = prev_parent;
self.update_subtree_interval(prev_parent);
} else {
self.root = prev_right;
self.nodes[prev_right.get()].parent = Ix::MAX;
}
}
fn rotate_right(&mut self, index: Ix) {
let prev_parent = self.nodes[index.get()].parent;
let prev_left = self.nodes[index.get()].left;
debug_assert!(prev_left.defined());
let new_left = self.nodes[prev_left.get()].right;
self.nodes[index.get()].left = new_left;
if new_left.defined() {
self.nodes[new_left.get()].parent = index;
}
self.update_subtree_interval(index);
self.nodes[prev_left.get()].right = index;
self.nodes[index.get()].parent = prev_left;
self.update_subtree_interval(prev_left);
if prev_parent.defined() {
if self.nodes[prev_parent.get()].right == index {
self.nodes[prev_parent.get()].right = prev_left;
} else {
self.nodes[prev_parent.get()].left = prev_left;
}
self.nodes[prev_left.get()].parent = prev_parent;
self.update_subtree_interval(prev_parent);
} else {
self.root = prev_left;
self.nodes[prev_left.get()].parent = Ix::MAX;
}
}
fn insert_repair(&mut self, mut index: Ix) {
loop {
debug_assert!(self.is_red(index));
if index == self.root {
self.set_black(index);
return;
}
let parent = self.nodes[index.get()].parent;
if self.is_black(parent) {
return;
}
let grandparent = self.nodes[parent.get()].parent;
debug_assert!(grandparent.defined(), "Red parent and grandparent does not exist");
let uncle = self.sibling(parent);
if uncle.defined() && self.is_red(uncle) {
self.set_black(parent);
self.set_black(uncle);
self.set_red(grandparent);
index = grandparent;
continue;
}
if index == self.nodes[parent.get()].right && parent == self.nodes[grandparent.get()].left {
self.rotate_left(parent);
index = self.nodes[index.get()].left;
} else if index == self.nodes[parent.get()].left && parent == self.nodes[grandparent.get()].right {
self.rotate_right(parent);
index = self.nodes[index.get()].right;
}
let parent = self.nodes[index.get()].parent;
let grandparent = self.nodes[parent.get()].parent;
if index == self.nodes[parent.get()].left {
self.rotate_right(grandparent);
} else {
self.rotate_left(grandparent);
}
self.set_black(parent);
self.set_red(grandparent);
return;
}
}
fn fix_intervals_up(&mut self, mut ix: Ix) {
while ix.defined() {
self.update_subtree_interval(ix);
ix = self.nodes[ix.get()].parent;
}
}
fn insert_at(&mut self, parent: Ix, left_child: bool, interval: Interval<T>, value: V) -> &mut V {
let mut new_node = Node::new(interval, value);
let new_index = Ix::new(self.nodes.len()).unwrap();
if !parent.defined() {
assert!(self.nodes.is_empty());
self.nodes.push(new_node);
self.colors.push(false);
self.root = new_index;
return &mut self.nodes[new_index.get()].value;
}
new_node.parent = parent;
self.nodes.push(new_node);
if left_child {
self.nodes[parent.get()].left = new_index;
} else {
self.nodes[parent.get()].right = new_index;
}
self.colors.push(true);
self.fix_intervals_up(parent);
self.insert_repair(new_index);
&mut self.nodes[new_index.get()].value
}
fn insert_inner(&mut self, interval: Range<T>, value: V, replace: bool) -> Option<V> {
let interval = Interval::new(&interval);
let mut current = self.root;
if !current.defined() {
self.insert_at(current, true, interval, value);
return None;
}
loop {
let node = &mut self.nodes[current.get()];
let (child, left_side) = match interval.cmp(&node.interval) {
Ordering::Less => (node.left, true),
Ordering::Equal if replace => return Some(core::mem::replace(&mut node.value, value)),
Ordering::Equal | Ordering::Greater => (node.right, false),
};
if child.defined() {
current = child;
} else {
self.insert_at(current, left_side, interval, value);
return None;
}
}
}
pub fn entry(&mut self, interval: Range<T>) -> Entry<'_, T, V, Ix> {
let interval = Interval::new(&interval);
let mut current = self.root;
if !current.defined() {
return Entry::Vacant(entry::VacantEntry::new(self, current, true, interval));
}
loop {
let node = &mut self.nodes[current.get()];
let (child, left_side) = match interval.cmp(&node.interval) {
Ordering::Less => (node.left, true),
Ordering::Greater => (node.right, false),
Ordering::Equal => return Entry::Occupied(entry::OccupiedEntry::new(self, current)),
};
if child.defined() {
current = child;
} else {
return Entry::Vacant(entry::VacantEntry::new(self, current, left_side, interval));
}
}
}
pub fn insert(&mut self, interval: Range<T>, value: V) -> Option<V> {
self.insert_inner(interval, value, true)
}
pub fn force_insert(&mut self, interval: Range<T>, value: V) {
assert!(self.insert_inner(interval, value, false).is_none(), "Force insert should always return None");
}
fn find_index(&self, interval: &Interval<T>) -> Ix {
let mut index = self.root;
while index.defined() {
let node = &self.nodes[index.get()];
match interval.cmp(&node.interval) {
Ordering::Less => index = node.left,
Ordering::Greater => index = node.right,
Ordering::Equal => return index,
}
}
index
}
pub fn contains(&self, interval: Range<T>) -> bool {
self.find_index(&Interval::new(&interval)).defined()
}
pub fn get(&self, interval: Range<T>) -> Option<&V> {
let index = self.find_index(&Interval::new(&interval));
if index.defined() {
Some(&self.nodes[index.get()].value)
} else {
None
}
}
pub fn get_mut(&mut self, interval: Range<T>) -> Option<&mut V> {
let index = self.find_index(&Interval::new(&interval));
if index.defined() {
Some(&mut self.nodes[index.get()].value)
} else {
None
}
}
pub fn remove(&mut self, interval: Range<T>) -> Option<V> {
self.remove_at(self.find_index(&Interval::new(&interval)))
}
pub fn remove_where(&mut self, interval: Range<T>, mut predicate: impl FnMut(&V) -> bool) -> Option<V> {
let mut values_it = self.values_at(interval);
while let Some(val) = values_it.next() {
if predicate(val) {
return self.remove_at(values_it.index);
}
}
None
}
pub fn range(&self) -> Option<Range<T>> {
if self.root.defined() {
Some(self.nodes[self.root.get()].subtree_interval.to_range())
} else {
None
}
}
fn smallest_index(&self) -> Ix {
let mut index = self.root;
while self.nodes[index.get()].left.defined() {
index = self.nodes[index.get()].left;
}
index
}
fn largest_index(&self) -> Ix {
let mut index = self.root;
while self.nodes[index.get()].right.defined() {
index = self.nodes[index.get()].right;
}
index
}
pub fn smallest(&self) -> Option<(Range<T>, &V)> {
if !self.root.defined() {
None
} else {
let node = &self.nodes[self.smallest_index().get()];
Some((node.interval.to_range(), &node.value))
}
}
pub fn smallest_mut(&mut self) -> Option<(Range<T>, &mut V)> {
if !self.root.defined() {
None
} else {
let index = self.smallest_index();
let node = &mut self.nodes[index.get()];
Some((node.interval.to_range(), &mut node.value))
}
}
pub fn remove_smallest(&mut self) -> Option<(Range<T>, V)> {
if !self.root.defined() {
None
} else {
let index = self.smallest_index();
let range = self.nodes[index.get()].interval.to_range();
Some((range, self.remove_at(index).unwrap()))
}
}
pub fn largest(&self) -> Option<(Range<T>, &V)> {
if !self.root.defined() {
None
} else {
let node = &self.nodes[self.largest_index().get()];
Some((node.interval.to_range(), &node.value))
}
}
pub fn largest_mut(&mut self) -> Option<(Range<T>, &mut V)> {
if !self.root.defined() {
None
} else {
let index = self.largest_index();
let node = &mut self.nodes[index.get()];
Some((node.interval.to_range(), &mut node.value))
}
}
pub fn remove_largest(&mut self) -> Option<(Range<T>, V)> {
if !self.root.defined() {
None
} else {
let index = self.largest_index();
let range = self.nodes[index.get()].interval.to_range();
Some((range, self.remove_at(index).unwrap()))
}
}
pub fn has_overlap(&self, query: impl RangeBounds<T>) -> bool {
check_ordered(&query);
if !self.root.defined() {
return false;
}
let mut queue = Vec::new();
queue.push(self.root);
while let Some(index) = queue.pop() {
let node = &self.nodes[index.get()];
let subtree_start = node.subtree_interval.start;
let subtree_end = node.subtree_interval.end;
let q_start_lt_start = match query.start_bound() {
Bound::Unbounded => true,
Bound::Included(&q_start) => {
if q_start < subtree_start {
true
} else if q_start == subtree_start {
return true;
} else if q_start < subtree_end {
false
} else {
continue;
}
},
Bound::Excluded(&q_start) => {
if q_start <= subtree_start {
true
} else if q_start < subtree_end {
false
} else {
continue;
}
},
};
let q_end_gt_end = match query.end_bound() {
Bound::Unbounded => true,
Bound::Included(&q_end) => {
if q_end < subtree_start {
continue;
} else if q_end == subtree_start {
return true;
} else {
q_end > subtree_end
}
},
Bound::Excluded(&q_end) => {
if q_end <= subtree_start {
continue;
} else {
q_end > subtree_end
}
},
};
if q_start_lt_start || q_end_gt_end || node.interval.intersects_range(&query) {
return true;
}
if node.left.defined() {
queue.push(node.left);
}
if node.right.defined() {
queue.push(node.right);
}
}
false
}
pub fn iter<R>(&self, query: R) -> Iter<'_, T, V, R, Ix>
where R: RangeBounds<T>,
{
Iter::new(self, query)
}
pub fn intervals<R>(&self, query: R) -> Intervals<'_, T, V, R, Ix>
where R: RangeBounds<T>,
{
Intervals::new(self, query)
}
pub fn values<R>(&self, query: R) -> Values<'_, T, V, R, Ix>
where R: RangeBounds<T>,
{
Values::new(self, query)
}
pub fn iter_mut<R>(&mut self, query: R) -> IterMut<'_, T, V, R, Ix>
where R: RangeBounds<T>,
{
IterMut::new(self, query)
}
pub fn values_mut<R>(&mut self, query: R) -> ValuesMut<'_, T, V, R, Ix>
where R: RangeBounds<T>,
{
ValuesMut::new(self, query)
}
pub fn into_iter<R>(self, query: R) -> IntoIter<T, V, R, Ix>
where R: RangeBounds<T>,
{
IntoIter::new(self, query)
}
pub fn into_intervals<R>(self, query: R) -> IntoIntervals<T, V, R, Ix>
where R: RangeBounds<T>,
{
IntoIntervals::new(self, query)
}
pub fn into_values<R>(self, query: R) -> IntoValues<T, V, R, Ix>
where R: RangeBounds<T>,
{
IntoValues::new(self, query)
}
#[inline]
pub fn overlap(&self, point: T) -> Iter<'_, T, V, RangeInclusive<T>, Ix> {
Iter::new(self, point..=point)
}
#[inline]
pub fn intervals_overlap(&self, point: T) -> Intervals<'_, T, V, RangeInclusive<T>, Ix> {
Intervals::new(self, point..=point)
}
#[inline]
pub fn values_overlap(&self, point: T) -> Values<'_, T, V, RangeInclusive<T>, Ix> {
Values::new(self, point..=point)
}
#[inline]
pub fn overlap_mut(&mut self, point: T) -> IterMut<'_, T, V, RangeInclusive<T>, Ix> {
IterMut::new(self, point..=point)
}
#[inline]
pub fn values_overlap_mut(&mut self, point: T) -> ValuesMut<'_, T, V, RangeInclusive<T>, Ix> {
ValuesMut::new(self, point..=point)
}
pub fn values_at(&self, query: Range<T>) -> ValuesExact<'_, T, V, Ix> {
ValuesExact::new(self, Interval::new(&query))
}
pub fn values_mut_at(&mut self, query: Range<T>) -> ValuesExactMut<'_, T, V, Ix> {
ValuesExactMut::new(self, Interval::new(&query))
}
pub fn unsorted_iter(&self) -> UnsIter<'_, T, V, Ix> {
UnsIter::new(self)
}
pub fn unsorted_intervals(&self) -> UnsIntervals<'_, T, V, Ix> {
UnsIntervals::new(self)
}
pub fn unsorted_values(&self) -> UnsValues<'_, T, V, Ix> {
UnsValues::new(self)
}
pub fn unsorted_iter_mut(&mut self) -> UnsIterMut<'_, T, V, Ix> {
UnsIterMut::new(self)
}
pub fn unsorted_values_mut(&mut self) -> UnsValuesMut<'_, T, V, Ix> {
UnsValuesMut::new(self)
}
pub fn unsorted_into_iter(self) -> UnsIntoIter<T, V, Ix> {
UnsIntoIter::new(self)
}
pub fn unsorted_into_intervals(self) -> UnsIntoIntervals<T, V, Ix> {
UnsIntoIntervals::new(self)
}
pub fn unsorted_into_values(self) -> UnsIntoValues<T, V, Ix> {
UnsIntoValues::new(self)
}
}
impl<T: PartialOrd + Copy, V, Ix: IndexType> IntoIterator for IntervalMap<T, V, Ix> {
type IntoIter = IntoIter<T, V, RangeFull, Ix>;
type Item = (Range<T>, V);
fn into_iter(self) -> Self::IntoIter {
IntoIter::new(self, ..)
}
}
impl<T: PartialOrd + Copy, V> FromIterator<(Range<T>, V)> for IntervalMap<T, V> {
fn from_iter<I>(iter: I) -> Self
where I: IntoIterator<Item = (Range<T>, V)>
{
let mut map = IntervalMap::new();
for (range, value) in iter {
assert!(map.insert(range, value).is_none(), "Cannot collect IntervalMap with duplicate intervals!");
}
map
}
}
impl<T: PartialOrd + Copy, V, Ix: IndexType> Index<Range<T>> for IntervalMap<T, V, Ix> {
type Output = V;
fn index(&self, range: Range<T>) -> &Self::Output {
self.get(range).expect("No entry found for range")
}
}
impl<T, V, Ix> IntervalMap<T, V, Ix>
where T: PartialOrd + Copy + Default + AddAssign + Sub<Output = T>,
Ix: IndexType,
{
pub fn covered_len(&self, query: impl RangeBounds<T>) -> T {
let mut res = T::default();
let start_bound = query.start_bound().cloned();
let end_bound = query.end_bound().cloned();
let mut started = false;
let mut curr_start = res; let mut curr_end = res;
for interval in self.intervals(query) {
let start = match start_bound {
Bound::Included(a) | Bound::Excluded(a) if a >= interval.start => a,
_ => interval.start,
};
let end = match end_bound {
Bound::Included(b) | Bound::Excluded(b) if b <= interval.end => b,
_ => interval.end,
};
debug_assert!(end >= start);
if started {
if start > curr_end {
res += curr_end - curr_start;
curr_start = start;
curr_end = end;
} else if end > curr_end {
curr_end = end;
}
} else {
curr_start = start;
curr_end = end;
started = true;
}
}
if started {
res += curr_end - curr_start;
}
res
}
}
#[cfg(feature = "dot")]
impl<T: PartialOrd + Copy + Display, V: Display, Ix: IndexType> IntervalMap<T, V, Ix> {
pub fn write_dot(&self, mut writer: impl Write) -> io::Result<()> {
writeln!(writer, "digraph {{")?;
for (i, node) in self.nodes.iter().enumerate() {
node.write_dot(i, self.colors.get(i), &mut writer)?;
}
writeln!(writer, "}}")
}
}
#[cfg(feature = "dot")]
impl<T: PartialOrd + Copy + Display, V, Ix: IndexType> IntervalMap<T, V, Ix> {
pub fn write_dot_without_values(&self, mut writer: impl Write) -> io::Result<()> {
writeln!(writer, "digraph {{")?;
for (i, node) in self.nodes.iter().enumerate() {
node.write_dot_without_values(i, self.colors.get(i), &mut writer)?;
}
writeln!(writer, "}}")
}
}
impl<T: PartialOrd + Copy + Debug, V: Debug, Ix: IndexType> Debug for IntervalMap<T, V, Ix> {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
write!(f, "{{")?;
let mut need_comma = false;
for (interval, value) in self.iter(..) {
if need_comma {
write!(f, ", ")?;
} else {
need_comma = true;
}
write!(f, "{:?} => {:?}", interval, value)?;
}
write!(f, "}}")
}
}
#[cfg(feature = "serde")]
impl<T, V, Ix> Serialize for IntervalMap<T, V, Ix>
where
T: PartialOrd + Copy + Serialize,
V: Serialize,
Ix: IndexType + Serialize,
{
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
struct NodeVecSer<'a, T, V, Ix>(&'a Vec<Node<T, V, Ix>>)
where
T: PartialOrd + Copy + Serialize,
V: Serialize,
Ix: IndexType + Serialize;
impl<'a, T, V, Ix> Serialize for NodeVecSer<'a, T, V, Ix>
where
T: PartialOrd + Copy + Serialize,
V: Serialize,
Ix: IndexType + Serialize,
{
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
for node in self.0.iter() {
seq.serialize_element(node)?;
}
seq.end()
}
}
let mut tup = serializer.serialize_tuple(2)?;
tup.serialize_element(&NodeVecSer(&self.nodes))?;
tup.serialize_element(&self.colors)?;
tup.serialize_element(&self.root)?;
tup.end()
}
}
#[cfg(feature = "serde")]
struct NodeVecDe<T: PartialOrd + Copy, V, Ix: IndexType>(Vec<Node<T, V, Ix>>);
#[cfg(feature = "serde")]
impl<'de, T, V, Ix> Deserialize<'de> for NodeVecDe<T, V, Ix>
where
T: PartialOrd + Copy + Deserialize<'de>,
V: Deserialize<'de>,
Ix: IndexType + Deserialize<'de>,
{
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
struct NodeVecVisitor<T: PartialOrd + Copy, V, Ix: IndexType> {
marker: PhantomData<(T, V, Ix)>,
}
impl<'de, T, V, Ix> Visitor<'de> for NodeVecVisitor<T, V, Ix>
where
T: PartialOrd + Copy + Deserialize<'de>,
V: Deserialize<'de>,
Ix: IndexType + Deserialize<'de>,
{
type Value = NodeVecDe<T, V, Ix>;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("a sequence of Node<T, V, Ix>")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Self::Value, A::Error> {
let mut nodes = Vec::new();
while let Some(node) = seq.next_element()? {
nodes.push(node);
}
Ok(NodeVecDe(nodes))
}
}
let visitor = NodeVecVisitor {
marker: PhantomData,
};
deserializer.deserialize_seq(visitor)
}
}
#[cfg(feature = "serde")]
impl<'de, T, V, Ix> Deserialize<'de> for IntervalMap<T, V, Ix>
where
T: PartialOrd + Copy + Deserialize<'de>,
V: Deserialize<'de>,
Ix: IndexType + Deserialize<'de>,
{
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let (node_vec, colors, root) = <(NodeVecDe<T, V, Ix>, BitVec, Ix)>::deserialize(deserializer)?;
Ok(IntervalMap {
nodes: node_vec.0,
colors,
root,
})
}
}
#[macro_export]
macro_rules! interval_map {
( [$ix:ty] $(,)? ) => ( $crate::IntervalMap::<_, _, $ix>::default() );
( () ) => ( $crate::IntervalMap::new() );
( [$ix:ty] $(,)? $( $k:expr => $v:expr ),* $(,)? ) => {
{
let mut _temp_map = $crate::IntervalMap::<_, _, $ix>::default();
$(
assert!(_temp_map.insert($k, $v).is_none(),
"Cannot use interval_map!{{ ... }} with duplicate intervals");
)*
_temp_map
}
};
( $( $k:expr => $v:expr ),* $(,)? ) => {
{
let mut _temp_map = $crate::IntervalMap::new();
$(
assert!(_temp_map.insert($k, $v).is_none(),
"Cannot use interval_map!{{ ... }} with duplicate intervals");
)*
_temp_map
}
};
}
#[macro_export]
macro_rules! interval_set {
( [$ix:ty] $(,)? ) => ( $crate::IntervalSet::<_, $ix>::default() );
( () ) => ( $crate::IntervalSet::new() );
( [$ix:ty] $(,)? $( $k:expr ),* $(,)? ) => {
{
let mut _temp_set = $crate::IntervalSet::<_, $ix>::default();
$(
_temp_set.insert($k);
)*
_temp_set
}
};
( $( $k:expr ),* $(,)? ) => {
{
let mut _temp_set = $crate::IntervalSet::new();
$(
_temp_set.insert($k);
)*
_temp_set
}
};
}