#![doc = include_str!("./lib.md")]
#![cfg_attr(docsrs, feature(doc_cfg))]
#![no_std]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
#[cfg(feature = "derive")]
pub use get_size_derive2::*;
mod impls;
mod tracker;
pub use tracker::*;
#[cfg(all(test, feature = "std"))]
mod tests;
pub fn heap_size<T: GetSize>(value: &T) -> usize {
value.get_heap_size()
}
#[cfg(feature = "alloc")]
pub type DefaultTracker = StandardTracker;
#[cfg(not(feature = "alloc"))]
pub type DefaultTracker = NoTracker;
#[cfg(feature = "alloc")]
#[must_use]
pub fn default_tracker() -> DefaultTracker {
StandardTracker::new()
}
#[cfg(not(feature = "alloc"))]
#[must_use]
pub const fn default_tracker() -> DefaultTracker {
NoTracker::new(true)
}
pub trait GetSize: Sized {
#[must_use]
fn get_stack_size() -> usize {
core::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)
}
}