use super::*;
pub struct Ref<'a> {
pub(super) guard: SharedReadGuard<'a, EmbeddedShard>,
pub(super) value: *const [u8],
pub(super) _not_send: PhantomData<*const ()>,
}
impl Ref<'_> {
#[inline(always)]
pub fn value(&self) -> &[u8] {
let _guard = &self.guard;
unsafe { &*self.value }
}
}
impl Deref for Ref<'_> {
type Target = [u8];
#[inline(always)]
fn deref(&self) -> &Self::Target {
self.value()
}
}
pub struct RefMut<'a> {
pub(super) guard: SharedWriteGuard<'a, EmbeddedShard>,
pub(super) route_mode: EmbeddedRouteMode,
pub(super) key: SharedBytes,
pub(super) key_hash: u64,
pub(super) _not_send: PhantomData<*const ()>,
}
impl RefMut<'_> {
#[inline(always)]
pub fn value(&self) -> Option<&[u8]> {
self.guard
.get_ref_hashed_shared_no_ttl(self.key_hash, self.key.as_ref())
}
#[inline(always)]
pub fn set(&mut self, value: SharedBytes) {
self.guard.set_value_bytes_hashed_no_ttl(
self.route_mode,
self.key_hash,
self.key.as_ref(),
value,
);
}
#[inline(always)]
pub fn remove(mut self) -> Option<SharedBytes> {
self.guard
.remove_value_hashed_no_ttl(self.key_hash, self.key.as_ref())
}
}
pub enum Entry<'a> {
Occupied(RefMut<'a>),
Vacant(VacantEntry<'a>),
}
impl<'a> Entry<'a> {
#[inline(always)]
pub fn or_insert(self, value: SharedBytes) -> RefMut<'a> {
match self {
Self::Occupied(entry) => entry,
Self::Vacant(entry) => entry.insert(value),
}
}
}
pub struct VacantEntry<'a> {
pub(super) guard: SharedWriteGuard<'a, EmbeddedShard>,
pub(super) route_mode: EmbeddedRouteMode,
pub(super) key: SharedBytes,
pub(super) key_hash: u64,
pub(super) _not_send: PhantomData<*const ()>,
}
impl<'a> VacantEntry<'a> {
#[inline(always)]
pub fn insert(mut self, value: SharedBytes) -> RefMut<'a> {
self.guard.set_value_bytes_hashed_no_ttl(
self.route_mode,
self.key_hash,
self.key.as_ref(),
value,
);
RefMut {
guard: self.guard,
route_mode: self.route_mode,
key: self.key,
key_hash: self.key_hash,
_not_send: PhantomData,
}
}
}