use super::alloc_core::LargeCacheMode;
pub(crate) const DEFAULT_HEADROOM_BYTES: usize = 256 * 1024 * 1024;
pub(crate) const DEFAULT_DECAY_INTERVAL_MS: u64 = 1000;
pub(crate) const DEFAULT_DECAY_RATE_PERCENT: u32 = 10;
#[cfg(feature = "alloc-decommit")]
#[derive(Copy, Clone, Debug)]
pub struct LargeCacheConfig {
pub(crate) budget_bytes: Option<usize>,
pub(crate) headroom_bytes: Option<usize>,
pub(crate) decay_interval_ms: Option<u32>,
pub(crate) decay_rate_percent: Option<u32>,
pub(crate) mode: Option<LargeCacheMode>,
}
#[cfg(feature = "alloc-decommit")]
impl Default for LargeCacheConfig {
fn default() -> Self {
Self::DEFAULT
}
}
#[cfg(feature = "alloc-decommit")]
impl LargeCacheConfig {
pub const DEFAULT: Self = Self::new();
#[must_use]
pub const fn new() -> Self {
Self {
budget_bytes: None,
headroom_bytes: None,
decay_interval_ms: None,
decay_rate_percent: None,
mode: None,
}
}
#[must_use]
pub const fn budget_bytes(mut self, bytes: usize) -> Self {
self.budget_bytes = if bytes == 0 { None } else { Some(bytes) };
self
}
#[must_use]
pub const fn headroom_bytes(mut self, bytes: usize) -> Self {
self.headroom_bytes = Some(bytes);
self
}
#[must_use]
pub const fn decay_interval_ms(mut self, ms: u32) -> Self {
self.decay_interval_ms = Some(ms);
self
}
#[must_use]
pub const fn decay_rate_percent(mut self, pct: u32) -> Self {
self.decay_rate_percent = Some(pct);
self
}
#[must_use]
pub const fn mode(mut self, m: LargeCacheMode) -> Self {
self.mode = Some(m);
self
}
#[must_use]
pub(crate) const fn resolved_budget_bytes(&self) -> Option<usize> {
self.budget_bytes
}
#[must_use]
pub(crate) const fn resolved_headroom_bytes(&self) -> usize {
match self.headroom_bytes {
Some(v) => v,
None => DEFAULT_HEADROOM_BYTES,
}
}
#[must_use]
pub(crate) fn resolved_decay_interval(&self) -> core::time::Duration {
let ms = match self.decay_interval_ms {
Some(v) => v as u64,
None => DEFAULT_DECAY_INTERVAL_MS,
};
core::time::Duration::from_millis(ms)
}
#[must_use]
pub(crate) const fn resolved_decay_rate_bp(&self) -> u32 {
let pct = match self.decay_rate_percent {
Some(p) => p,
None => DEFAULT_DECAY_RATE_PERCENT,
};
let clamped = if pct < 1 {
1
} else if pct > 100 {
100
} else {
pct
};
clamped * 100 }
#[must_use]
pub(crate) const fn resolved_mode(&self) -> LargeCacheMode {
match self.mode {
Some(m) => m,
None => LargeCacheMode::Lazy,
}
}
}