use super::{CcBoxData, Color};
use trace::Trace;
use std::ptr::NonNull;
pub trait CcBoxPtr: Trace {
fn data(&self) -> &CcBoxData;
#[inline]
fn color(&self) -> Color { self.data().color.get() }
#[inline]
fn buffered(&self) -> bool { self.data().buffered.get() }
#[inline]
fn strong(&self) -> usize { self.data().strong.get() }
#[inline]
fn inc_strong(&self) {
self.data().strong.set(self.strong() + 1);
self.data().color.set(Color::Black);
}
#[inline]
fn dec_strong(&self) { self.data().strong.set(self.strong() - 1); }
#[inline]
fn weak(&self) -> usize { self.data().weak.get() }
#[inline]
fn inc_weak(&self) { self.data().weak.set(self.weak() + 1); }
#[inline]
fn dec_weak(&self) { self.data().weak.set(self.weak() - 1); }
}
pub unsafe fn free(mut s: NonNull<dyn CcBoxPtr>) {
debug_assert!(s.as_mut().strong() == 0);
debug_assert!(!s.as_mut().buffered());
crate::drop_value(s);
s.as_mut().dec_weak();
if s.as_mut().weak() == 0 {
crate::deallocate(s);
}
}