use crossync::sync::RwLock;
use std::any::{Any, TypeId};
use std::sync::atomic::AtomicUsize;
pub(crate) const MAX_REFCOUNT: usize = isize::MAX as usize;
#[repr(C)]
pub(crate) struct AnyRefInner {
pub(crate) strong: AtomicUsize,
pub(crate) weak: AtomicUsize,
pub(crate) type_id: TypeId,
pub(crate) type_name: &'static str,
pub(crate) data: RwLock<Box<dyn Any>>,
}
impl AnyRefInner {
pub(crate) fn new<T>(value: T) -> Self
where
T: Any + Sized,
{
Self::from_box(Box::new(value))
}
pub(crate) fn from_box<T>(src: Box<T>) -> Self
where
T: Any + Sized,
{
Self {
strong: AtomicUsize::new(1),
weak: AtomicUsize::new(1),
type_id: TypeId::of::<T>(),
type_name: std::any::type_name::<T>(),
data: RwLock::new(src as Box<dyn Any>),
}
}
}
impl Default for AnyRefInner {
fn default() -> Self {
Self::from_box(Box::new(()))
}
}