use std::any::Any;
use std::pin::Pin;
use std::sync::Arc;
use async_trait::async_trait;
use futures::Future;
use crate::Result;
use crate::deepsize::Context;
use super::{CacheCodec, InternalCacheKey};
pub type CacheEntry = Arc<dyn Any + Send + Sync>;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum CacheTier {
Resident,
Local,
Absent,
}
#[async_trait]
pub trait CacheBackend: Send + Sync + std::fmt::Debug {
async fn get_resident(&self, _key: &InternalCacheKey) -> Option<CacheEntry> {
None
}
async fn peek_resident(&self, key: &InternalCacheKey) -> bool {
self.get_resident(key).await.is_some()
}
async fn peek_tier(&self, key: &InternalCacheKey) -> CacheTier {
if self.peek_resident(key).await {
CacheTier::Resident
} else {
CacheTier::Absent
}
}
fn plane_admission_gated(&self) -> bool {
true
}
async fn get_without_promotion(
&self,
key: &InternalCacheKey,
_codec: Option<CacheCodec>,
) -> Option<CacheEntry> {
self.get_resident(key).await
}
async fn get_rows(
&self,
_key: &InternalCacheKey,
_rows: &[u32],
_codec: Option<CacheCodec>,
) -> Option<CacheEntry> {
None
}
async fn get(&self, key: &InternalCacheKey, codec: Option<CacheCodec>) -> Option<CacheEntry>;
async fn insert(
&self,
key: &InternalCacheKey,
entry: CacheEntry,
size_bytes: usize,
codec: Option<CacheCodec>,
);
async fn get_or_insert<'a>(
&self,
key: &InternalCacheKey,
loader: Pin<Box<dyn Future<Output = Result<(CacheEntry, usize)>> + Send + 'a>>,
codec: Option<CacheCodec>,
) -> Result<(CacheEntry, bool)>;
async fn clear(&self);
async fn num_entries(&self) -> usize;
async fn size_bytes(&self) -> usize;
fn approx_num_entries(&self) -> usize {
0
}
fn approx_size_bytes(&self) -> usize {
0
}
fn capacity_bytes(&self) -> Option<usize> {
None
}
fn deep_size_of_entries(
&self,
_context: &mut Context,
_size_of_entry: &dyn Fn(&CacheEntry, &mut Context) -> Option<usize>,
) -> Option<usize> {
None
}
}