use super::ImageCachePolicy;
const DEFAULT_CACHE_BYTES: usize = 64 * 1024 * 1024;
#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MemoryBudget {
pub cache_bytes: usize,
pub persistent_bytes: u64,
}
impl MemoryBudget {
pub const fn new(cache_bytes: usize) -> Self {
Self {
cache_bytes,
persistent_bytes: 0,
}
}
pub const fn with_persistent(cache_bytes: usize, persistent_bytes: u64) -> Self {
Self {
cache_bytes,
persistent_bytes,
}
}
}
impl Default for MemoryBudget {
fn default() -> Self {
Self::new(DEFAULT_CACHE_BYTES)
}
}
#[cfg_attr(feature = "diagnostics-serde", derive(serde::Serialize))]
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct MemoryOptions {
pub budget: MemoryBudget,
pub default_image_cache_policy: ImageCachePolicy,
pub persistent_cache_enabled: bool,
}
impl MemoryOptions {
pub const fn new(
budget: MemoryBudget,
default_image_cache_policy: ImageCachePolicy,
persistent_cache_enabled: bool,
) -> Self {
Self {
budget,
default_image_cache_policy,
persistent_cache_enabled,
}
}
pub const fn cache_budget(cache_bytes: usize) -> Self {
Self::new(
MemoryBudget::new(cache_bytes),
ImageCachePolicy::WhileVisible,
false,
)
}
pub const fn unbounded(
default_image_cache_policy: ImageCachePolicy,
persistent_cache_enabled: bool,
) -> Self {
Self::new(
MemoryBudget {
cache_bytes: usize::MAX,
persistent_bytes: u64::MAX,
},
default_image_cache_policy,
persistent_cache_enabled,
)
}
pub const fn persistent_cache(mut self, enabled: bool) -> Self {
self.persistent_cache_enabled = enabled;
self
}
pub const fn persistent_budget(mut self, bytes: u64) -> Self {
self.budget.persistent_bytes = bytes;
self
}
pub fn validate(self) -> Result<(), &'static str> {
if self.default_image_cache_policy == ImageCachePolicy::ApplicationDefault {
return Err("application default image policy must be concrete");
}
Ok(())
}
}
impl Default for MemoryOptions {
fn default() -> Self {
Self::cache_budget(DEFAULT_CACHE_BYTES)
}
}