use std::{mem, time::Instant};
use typesize::TypeSize;
use crate::{
StatusRef,
object::{Object, ObjectSize},
policy::PaperPolicy,
};
pub struct OverheadManager {
status: StatusRef,
}
impl OverheadManager {
pub fn new(status: &StatusRef) -> Self {
OverheadManager {
status: status.clone(),
}
}
pub fn base_size<K, V>(&self, object: &Object<K, V>) -> ObjectSize
where
K: TypeSize,
V: TypeSize,
{
let mut total_size = object.total_size();
if object.expiry().is_some() {
total_size += get_ttl_overhead();
}
total_size
}
pub fn total_size<K, V>(&self, object: &Object<K, V>) -> ObjectSize
where
K: TypeSize,
V: TypeSize,
{
let policy = self.status.policy();
self.base_size(object) + get_policy_overhead(&policy)
}
}
pub fn get_policy_overhead(policy: &PaperPolicy) -> ObjectSize {
match policy {
PaperPolicy::Auto => 0,
PaperPolicy::Lfu => 24 + 48 + 8 + 4,
PaperPolicy::Fifo => 48 + 8,
PaperPolicy::Clock => 48 + 8 + 1,
PaperPolicy::Sieve => 48 + 8 + 1,
PaperPolicy::Lru => 48 + 8,
PaperPolicy::Mru => 48 + 8,
PaperPolicy::TwoQ(_, _) => 48 + 8 + 4,
PaperPolicy::Arc => 48 + 8 + 4,
PaperPolicy::SThreeFifo(_) => 48 + 8 + 4 + 1,
}
}
pub fn get_ttl_overhead() -> ObjectSize {
mem::size_of::<Option<Instant>>() as ObjectSize + 48
}