use crate::depot::{
arena::slab::{self, key},
capacity,
queue::{
links,
round::{self, set},
},
raw::Live,
};
#[derive(Debug)]
pub struct Idle;
impl<'a, T, Tag, const MAX: u32, const ROOT: bool, B>
set::Occupied<'a, T, Tag, MAX, ROOT, B, Idle>
{
pub fn insert(self) -> set::Occupied<'a, T, Tag, MAX, ROOT, B, set::Ready> {
let entry = self;
unsafe { entry.order.ring().push(entry.order, entry.index) };
entry.phase()
}
pub fn discard(self) {
self.entry.discard();
}
}
impl<'a, 'h, T, Tag, const MAX: u32>
set::Occupied<'a, T, Tag, MAX, true, capacity::Domain<'h>, Idle>
{
pub fn from_live<C>(live: Admission<'a, 'h, T, Tag, MAX, C, Self>) -> (Self, C) {
let ((source, context), key) = live.into_inner();
let index = unsafe { links::Index::new_usize(key.as_inner().index() as usize) };
let live = unsafe { crate::depot::raw::Proof::new(((&mut source.values, context), index)) };
let (entry, context) = slab::Occupied::from_live(live);
(Self::new(entry, &source.order), context)
}
}
type Admission<'a, 'h, T, Tag, const MAX: u32, C, P> = Live<
(&'a mut round::Set<T, Tag, MAX, capacity::Domain<'h>>, C),
capacity::Key<'h, key::Handle<Tag, MAX>>,
P,
>;