#![allow(clippy::module_name_repetitions)]
use std::{cell::Cell, marker::PhantomData, rc::Rc};
use crate::TypeSize;
use super::{sealed::ShouldCountInner, Borrowed, Owned};
pub struct SizableRc<T, SC: ShouldCountInner>(pub Rc<T>, PhantomData<SC>);
impl<T, SC: ShouldCountInner> From<Rc<T>> for SizableRc<T, SC> {
fn from(value: Rc<T>) -> Self {
SizableRc(value, PhantomData)
}
}
impl<T, SC: ShouldCountInner> std::ops::Deref for SizableRc<T, SC> {
type Target = Rc<T>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl<T: std::fmt::Debug, SC: ShouldCountInner> std::fmt::Debug for SizableRc<T, SC> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
impl<T> TypeSize for SizableRc<T, Borrowed> {}
impl<T: TypeSize> TypeSize for SizableRc<T, Owned> {
fn extra_size(&self) -> usize {
T::get_size(&self.0) + (std::mem::size_of::<Cell<usize>>() * 2)
}
#[cfg(feature = "details")]
fn get_collection_item_count(&self) -> Option<usize> {
T::get_collection_item_count(&self.0)
}
}