use crate::eviction_policies::{common::EvictionPolicy, fifo::FIFO, lfu::LFU, lru::LRU, noevicton::NoEviction};
pub enum EvictionPolicyEnum <K> {
NoEviction,
LRU,
LFU,
FIFO,
Custom(Box<dyn EvictionPolicy<K> + Send>)
}
impl<K: std::hash::Hash + Eq + PartialEq + Eq + Send + Sync + Clone + core::fmt::Debug + 'static,> EvictionPolicyEnum<K> {
pub fn create_policy(
self,
) -> Box<dyn EvictionPolicy<K> + Send> {
match self {
Self::FIFO => Box::new(FIFO::new()),
Self::LFU => Box::new(LFU::new()),
Self::LRU => Box::new(LRU::new()),
Self::NoEviction => Box::new(NoEviction::new()),
Self::Custom(e) => e
}
}
}
pub struct CacheConfig {
pub max_size: usize,
}
pub struct CustomCacheConfig<K> {
pub max_size: usize,
pub policy: Box<dyn EvictionPolicy<K> + Send>
}
pub enum CacheSyncConfig<K> {
NoEviction,
LRU(CacheConfig),
LFU(CacheConfig),
FIFO(CacheConfig),
Custom(CustomCacheConfig<K>)
}
impl<K> CacheSyncConfig<K> {
pub fn get_config(&self) -> CacheConfig {
match self {
Self::NoEviction => CacheConfig { max_size: 0 }, Self::FIFO(v) => CacheConfig {
max_size: v.max_size
},
Self::LRU(v) => CacheConfig {
max_size: v.max_size
},
Self::LFU(v) => CacheConfig {
max_size: v.max_size
},
Self::Custom(v) => CacheConfig {
max_size: v.max_size
}
}
}
pub fn get_policy_type(self) -> EvictionPolicyEnum<K> {
match self {
Self::NoEviction => EvictionPolicyEnum::NoEviction,
Self::FIFO(_) => EvictionPolicyEnum::FIFO,
Self::LRU(_) => EvictionPolicyEnum::LRU,
Self::LFU(_) => EvictionPolicyEnum::LFU,
Self::Custom(v) => EvictionPolicyEnum::Custom(v.policy)
}
}
}
pub struct NoEvictionAOFConfig {
pub folder: String, pub cache_name: String, pub flush_time: Option<u32>, pub persist_read_ops: bool, }
pub struct NoEvictionAsyncConfig {
pub aof_config: Option<NoEvictionAOFConfig>,
}
pub struct EvictionAOFConfig {
pub folder: String, pub cache_name: String, pub flush_time: Option<u32>, }
pub struct EvictionAsyncConfig {
pub max_size: usize, pub aof_config: Option<EvictionAOFConfig>,
}
pub struct CustomEvictionAOFConfig {
pub folder: String, pub cache_name: String, pub flush_time: Option<u32>, pub persist_read_ops: bool, }
pub struct CustomEvictionAsyncConfig<K> {
pub max_size: usize, pub aof_config: Option<CustomEvictionAOFConfig>,
pub policy: Box<dyn EvictionPolicy<K> + Send>
}
pub enum AsyncCacheConfig<K> {
NoEviction(NoEvictionAsyncConfig),
LFU(EvictionAsyncConfig),
LRU(EvictionAsyncConfig),
FIFO(EvictionAsyncConfig),
Custom(CustomEvictionAsyncConfig<K>)
}
impl<K> AsyncCacheConfig<K> {
pub fn get_sync_config(self) -> CacheSyncConfig<K> {
match self {
Self::NoEviction(_) => CacheSyncConfig::NoEviction,
Self::FIFO(v) => CacheSyncConfig::FIFO(CacheConfig {
max_size: v.max_size,
}),
Self::LFU(v) => CacheSyncConfig::LFU(CacheConfig {
max_size: v.max_size,
}),
Self::LRU(v) => CacheSyncConfig::LRU(CacheConfig {
max_size: v.max_size,
}),
Self::Custom(v) => CacheSyncConfig::Custom(CustomCacheConfig {
max_size: v.max_size,
policy: v.policy
})
}
}
pub fn persist_read_ops(&self) -> Option<bool> {
match self {
Self::NoEviction(v) => v.aof_config.as_ref().map(|x| x.persist_read_ops),
Self::Custom(v) => v.aof_config.as_ref().map(|x| x.persist_read_ops),
_ => Some(true),
}
}
pub fn get_aof_config(&self) -> Option<(String, String, Option<u32>)> {
match self {
Self::NoEviction(v) => v.aof_config.as_ref().map(|x| (x.folder.clone(), x.cache_name.clone(), x.flush_time)),
Self::FIFO(v) => v.aof_config.as_ref().map(|x| (x.folder.clone(), x.cache_name.clone(), x.flush_time)),
Self::LFU(v) => v.aof_config.as_ref().map(|x| (x.folder.clone(), x.cache_name.clone(), x.flush_time)),
Self::LRU(v) => v.aof_config.as_ref().map(|x| (x.folder.clone(), x.cache_name.clone(), x.flush_time)),
Self::Custom(v) => v.aof_config.as_ref().map(|x| (x.folder.clone(), x.cache_name.clone(), x.flush_time)),
}
}
pub fn get_policy_type(self) -> EvictionPolicyEnum<K> {
match self {
Self::NoEviction(_) => EvictionPolicyEnum::NoEviction,
Self::FIFO(_) => EvictionPolicyEnum::FIFO,
Self::LRU(_) => EvictionPolicyEnum::LRU,
Self::LFU(_) => EvictionPolicyEnum::LFU,
Self::Custom(v) => EvictionPolicyEnum::Custom(v.policy)
}
}
}