use std::sync::Arc;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum EvictionPolicy {
Lru,
Lfu,
Random,
Ttl,
Arc,
#[default]
Manual,
}
pub trait MemSize {
fn mem_size(&self) -> usize;
}
impl MemSize for u8 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for u16 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for u32 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for u64 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for i8 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for i16 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for i32 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for i64 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for f32 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for f64 {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>()
}
}
impl MemSize for String {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>() + self.capacity()
}
}
impl<T> MemSize for Vec<T>
where
T: MemSize,
{
fn mem_size(&self) -> usize {
let mut total = std::mem::size_of::<Self>() + (self.capacity() * std::mem::size_of::<T>());
if std::mem::size_of::<T>() > 0 {
total += self.iter().map(MemSize::mem_size).sum::<usize>()
- (self.len() * std::mem::size_of::<T>());
}
total
}
}
impl<T: ?Sized + MemSize> MemSize for Arc<T> {
fn mem_size(&self) -> usize {
self.as_ref().mem_size()
}
}
impl<T: MemSize> MemSize for Option<T> {
fn mem_size(&self) -> usize {
std::mem::size_of::<Self>() + self.as_ref().map_or(0, MemSize::mem_size)
}
}