use crate::{EvictionCandidates, Hash};
use std::collections::HashMap;
pub mod lru;
pub mod sketch;
pub mod tinylfu;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Segment {
Probation,
Main,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AdmissionDecision {
Store {
segment: Segment,
},
PassThrough,
}
#[derive(Debug, Clone)]
pub struct AdmissionContext {
pub hash: Hash,
pub known_size: Option<u64>,
}
pub trait AdmissionPolicy: Send + Sync + std::fmt::Debug {
fn admit(&self, ctx: &AdmissionContext) -> AdmissionDecision;
}
#[derive(Debug)]
pub struct EvictionContext<'a> {
pub candidates: &'a EvictionCandidates,
pub sizes: &'a HashMap<Hash, u64>,
pub segments: &'a HashMap<Hash, Segment>,
pub total_bytes: u64,
pub target_bytes: u64,
pub budget: u64,
pub cache_bytes: u64,
}
#[derive(Debug, Default)]
pub struct EvictionPlan {
pub evict: Vec<Hash>,
pub promote: Vec<(Hash, Segment)>,
}
pub trait EvictionPolicy: Send + Sync + std::fmt::Debug {
fn plan(&self, ctx: &EvictionContext<'_>) -> EvictionPlan;
}
pub trait FrequencyEstimator: Send + Sync + std::fmt::Debug {
fn observe(&self, hash: Hash);
fn estimate(&self, hash: Hash) -> u32;
}
pub use lru::{AlwaysAdmit, LruEviction};
pub use tinylfu::{ProbationAdmission, TinyLfuEstimator, TinyLfuEviction};