use crate::depot::{
arena::slab::key,
capacity,
queue::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, key) = live.into_inner();
let (entry, context): (
set::Occupied<'a, T, Tag, MAX, true, capacity::Domain<'h>>,
C,
) = unsafe { crate::depot::raw::Proof::new((source, key)) }.into();
(entry.phase(), 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,
>;