use crate::index::{IndexType, NodeIndex};
use crate::interval::Interval;
use crate::intervalmap::IntervalMap;
use crate::node::Node;
#[derive(Debug)]
pub enum Entry<'a, T, V, Ix> {
Occupied(OccupiedEntry<'a, T, V, Ix>),
Vacant(VacantEntry<'a, T, V, Ix>),
}
#[derive(Debug)]
pub struct OccupiedEntry<'a, T, V, Ix> {
pub map_ref: &'a mut IntervalMap<T, V, Ix>,
pub node_idx: NodeIndex<Ix>,
}
#[derive(Debug)]
pub struct VacantEntry<'a, T, V, Ix> {
pub map_ref: &'a mut IntervalMap<T, V, Ix>,
pub interval: Interval<T>,
}
impl<'a, T, V, Ix> Entry<'a, T, V, Ix>
where
T: Ord,
Ix: IndexType,
{
#[inline]
pub fn or_insert(self, default: V) -> &'a mut V {
match self {
Entry::Occupied(entry) => entry.map_ref.node_mut(entry.node_idx, Node::value_mut),
Entry::Vacant(entry) => {
let entry_idx = NodeIndex::new(entry.map_ref.nodes.len());
let _ignore = entry.map_ref.insert(entry.interval, default);
entry.map_ref.node_mut(entry_idx, Node::value_mut)
}
}
}
#[inline]
#[must_use]
pub fn and_modify<F>(self, f: F) -> Self
where
F: FnOnce(&mut V),
{
match self {
Entry::Occupied(entry) => {
f(entry.map_ref.node_mut(entry.node_idx, Node::value_mut));
Self::Occupied(entry)
}
Entry::Vacant(entry) => Self::Vacant(entry),
}
}
}