use crate::mem::{self, rc};
#[derive(Clone, Copy, Debug)]
#[repr(transparent)]
pub(crate) struct Live<W: mem::raw::Counter = u32>(W::NonZero);
impl<W: mem::raw::Counter> Live<W> {
pub(crate) const ONE: Self = Self(W::LIVE);
pub(in crate::mem::raw) unsafe fn new(value: W) -> Self {
Self(unsafe { value.nonzero() })
}
pub(in crate::mem::raw) fn get(self) -> W {
W::get(self.0)
}
pub(crate) fn try_retain(self) -> Result<Self, rc::Error> {
let value = self.get().checked_add(W::ONE).ok_or(rc::Error::Exhausted)?;
Ok(unsafe { Self::new(value) })
}
pub(crate) fn release(self) -> Option<Self> {
let value = self.get().wrapping_sub(W::ONE);
if value == W::ZERO {
None
} else {
Some(unsafe { Self::new(value) })
}
}
}
const _: () = {
assert!(size_of::<Live>() == size_of::<u32>());
assert!(size_of::<Option<Live>>() == size_of::<Live>());
assert!(size_of::<Live<usize>>() == size_of::<usize>());
assert!(size_of::<Option<Live<usize>>>() == size_of::<usize>());
};