#![doc = include_str!("./lib.md")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#[cfg(feature = "derive")]
#[cfg_attr(docsrs, doc(cfg(feature = "derive")))]
pub use get_size_derive2::*;
mod impls;
mod tracker;
pub use tracker::*;
#[cfg(test)]
mod tests;
pub fn heap_size<T: GetSize>(value: &T) -> usize {
value.get_heap_size()
}
pub trait GetSize: Sized {
#[must_use]
fn get_stack_size() -> usize {
std::mem::size_of::<Self>()
}
fn get_heap_size(&self) -> usize {
let tracker = NoTracker::new(true);
Self::get_heap_size_with_tracker(self, tracker).0
}
fn get_heap_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
(0, tracker)
}
fn get_size(&self) -> usize {
Self::get_stack_size() + GetSize::get_heap_size(self)
}
fn get_size_with_tracker<T: GetSizeTracker>(&self, tracker: T) -> (usize, T) {
let stack_size = Self::get_stack_size();
let (heap_size, tracker) = Self::get_heap_size_with_tracker(self, tracker);
(stack_size + heap_size, tracker)
}
}