use super::VecSet;
pub enum Entry<'a, T> {
Occupied(OccupiedEntry<'a, T>),
Vacant(VacantEntry<'a, T>),
}
impl<'a, T> Entry<'a, T>
where
T: Ord,
{
pub fn or_insert(self) -> &'a T {
match self {
Entry::Occupied(e) => &e.set.base.base[e.index],
Entry::Vacant(e) => {
let index = e.index;
e.set.base.base.insert(index, e.value);
&e.set.base.base[index]
}
}
}
pub fn or_insert_full(self) -> (usize, bool) {
match self {
Entry::Occupied(e) => (e.index, false),
Entry::Vacant(e) => {
let index = e.index;
e.set.base.base.insert(index, e.value);
(index, true)
}
}
}
pub fn index(&self) -> usize {
match self {
Entry::Occupied(e) => e.index(),
Entry::Vacant(e) => e.index(),
}
}
}
pub struct OccupiedEntry<'a, T> {
set: &'a mut VecSet<T>,
index: usize,
}
impl<'a, T> OccupiedEntry<'a, T> {
pub(super) fn new(set: &'a mut VecSet<T>, index: usize) -> Self {
OccupiedEntry { set, index }
}
pub fn get(&self) -> &T {
&self.set.base.base[self.index]
}
pub fn index(&self) -> usize {
self.index
}
pub fn remove(self) -> T {
self.set.base.remove_index(self.index)
}
}
pub struct VacantEntry<'a, T> {
set: &'a mut VecSet<T>,
value: T,
index: usize,
}
impl<'a, T> VacantEntry<'a, T>
where
T: Ord,
{
pub(super) fn new(set: &'a mut VecSet<T>, value: T, index: usize) -> Self {
VacantEntry { set, value, index }
}
pub fn index(&self) -> usize {
self.index
}
pub fn into_value(self) -> T {
self.value
}
pub fn insert(self) {
self.set.base.base.insert(self.index, self.value);
}
pub fn insert_entry(self) -> OccupiedEntry<'a, T> {
let index = self.index;
self.set.base.base.insert(index, self.value);
OccupiedEntry::new(self.set, index)
}
}