mod builder;
mod lru;
mod s3_fifo;
mod thread_type;
use std::any::Any;
use std::sync::Arc;
pub use builder::BufferCacheBuilder;
use feldera_types::config::dev_tweaks::BufferCacheStrategy;
pub use lru::LruCache;
pub use s3_fifo::S3FifoCache;
pub use thread_type::ThreadType;
pub trait CacheEntry: Any + Send + Sync {
fn cost(&self) -> usize;
}
impl<T> CacheEntry for Arc<T>
where
T: CacheEntry + ?Sized + 'static,
{
fn cost(&self) -> usize {
(**self).cost()
}
}
impl dyn CacheEntry {
pub fn downcast<T>(self: Arc<Self>) -> Option<Arc<T>>
where
T: Send + Sync + 'static,
{
(self as Arc<dyn Any + Send + Sync>).downcast().ok()
}
}
pub type SharedBufferCache<K, V> = Arc<dyn BufferCache<K, V>>;
pub trait BufferCache<K, V>: Any + Send + Sync {
fn as_any(&self) -> &dyn Any;
fn strategy(&self) -> BufferCacheStrategy;
fn insert(&self, key: K, value: V);
fn get(&self, key: K) -> Option<V>;
fn remove(&self, key: &K) -> Option<V>;
fn remove_if(&self, predicate: &dyn Fn(&K) -> bool);
fn contains_key(&self, key: &K) -> bool;
fn len(&self) -> usize;
fn is_empty(&self) -> bool {
self.len() == 0
}
fn total_charge(&self) -> usize;
fn total_capacity(&self) -> usize;
fn shard_count(&self) -> usize;
#[cfg(test)]
fn shard_usage(&self, idx: usize) -> (usize, usize);
}
#[cfg(test)]
mod tests;