use std::sync::atomic::{AtomicUsize, Ordering::Relaxed};
pub trait CachedVecBudget: Send + Sync {
fn admit(&self, cache_worthy: bool) -> bool {
cache_worthy
}
fn record_access(&self) -> u64 {
0
}
fn try_reserve(&self, bytes: usize) -> bool;
fn release(&self, bytes: usize);
}
impl CachedVecBudget for AtomicUsize {
#[inline]
fn try_reserve(&self, bytes: usize) -> bool {
self.fetch_update(Relaxed, Relaxed, |n| n.checked_sub(bytes))
.is_ok()
}
#[inline]
fn release(&self, bytes: usize) {
self.fetch_add(bytes, Relaxed);
}
}
pub struct NoBudget;
impl CachedVecBudget for NoBudget {
#[inline]
fn admit(&self, _: bool) -> bool {
true
}
#[inline]
fn try_reserve(&self, _: usize) -> bool {
true
}
#[inline]
fn release(&self, _: usize) {}
}