use half::f16;
use std::mem;
pub trait SpaceUsage {
fn space_usage_byte(&self) -> usize;
#[allow(non_snake_case)]
fn space_usage_KiB(&self) -> f64 {
let bytes = self.space_usage_byte();
(bytes as f64) / (1024_f64)
}
#[allow(non_snake_case)]
fn space_usage_MiB(&self) -> f64 {
let bytes = self.space_usage_byte();
(bytes as f64) / ((1024 * 1024) as f64)
}
#[allow(non_snake_case)]
fn space_usage_GiB(&self) -> f64 {
let bytes = self.space_usage_byte();
(bytes as f64) / ((1024 * 1024 * 1024) as f64)
}
}
impl<T> SpaceUsage for Vec<T>
where
T: Copy,
{
fn space_usage_byte(&self) -> usize {
mem::size_of::<Self>() + mem::size_of::<T>() * self.capacity()
}
}
impl<T> SpaceUsage for Box<[T]>
where
T: SpaceUsage + Copy,
{
fn space_usage_byte(&self) -> usize {
if !self.is_empty() {
mem::size_of::<Self>() + self.first().unwrap().space_usage_byte() * self.len()
} else {
mem::size_of::<Self>()
}
}
}
macro_rules! impl_space_usage {
($($t:ty),*) => {
$(impl SpaceUsage for $t {
fn space_usage_byte(&self) -> usize {
mem::size_of::<Self>()
}
})*
}
}
impl_space_usage![
bool, i8, u8, i16, u16, i32, u32, i64, u64, i128, u128, isize, usize, f32, f64, f16
];