fast_cache/storage/embedded_store_shared/
guards.rs1use super::*;
2
3pub struct Ref<'a> {
18 pub(super) guard: SharedReadGuard<'a, EmbeddedShard>,
19 pub(super) value: *const [u8],
20 pub(super) _not_send: PhantomData<*const ()>,
21}
22
23impl Ref<'_> {
24 #[inline(always)]
26 pub fn value(&self) -> &[u8] {
27 let _guard = &self.guard;
28 unsafe { &*self.value }
31 }
32}
33
34impl Deref for Ref<'_> {
35 type Target = [u8];
36
37 #[inline(always)]
38 fn deref(&self) -> &Self::Target {
39 self.value()
40 }
41}
42
43pub struct RefMut<'a> {
45 pub(super) guard: SharedWriteGuard<'a, EmbeddedShard>,
46 pub(super) route_mode: EmbeddedRouteMode,
47 pub(super) key: SharedBytes,
48 pub(super) key_hash: u64,
49 pub(super) _not_send: PhantomData<*const ()>,
50}
51
52impl RefMut<'_> {
53 #[inline(always)]
55 pub fn value(&self) -> Option<&[u8]> {
56 self.guard
57 .get_ref_hashed_shared_no_ttl(self.key_hash, self.key.as_ref())
58 }
59
60 #[inline(always)]
62 pub fn set(&mut self, value: SharedBytes) {
63 self.guard.set_value_bytes_hashed_no_ttl(
64 self.route_mode,
65 self.key_hash,
66 self.key.as_ref(),
67 value,
68 );
69 }
70
71 #[inline(always)]
73 pub fn remove(mut self) -> Option<SharedBytes> {
74 self.guard
75 .remove_value_hashed_no_ttl(self.key_hash, self.key.as_ref())
76 }
77}
78
79pub enum Entry<'a> {
81 Occupied(RefMut<'a>),
83 Vacant(VacantEntry<'a>),
85}
86
87impl<'a> Entry<'a> {
88 #[inline(always)]
90 pub fn or_insert(self, value: SharedBytes) -> RefMut<'a> {
91 match self {
92 Self::Occupied(entry) => entry,
93 Self::Vacant(entry) => entry.insert(value),
94 }
95 }
96}
97
98pub struct VacantEntry<'a> {
100 pub(super) guard: SharedWriteGuard<'a, EmbeddedShard>,
101 pub(super) route_mode: EmbeddedRouteMode,
102 pub(super) key: SharedBytes,
103 pub(super) key_hash: u64,
104 pub(super) _not_send: PhantomData<*const ()>,
105}
106
107impl<'a> VacantEntry<'a> {
108 #[inline(always)]
110 pub fn insert(mut self, value: SharedBytes) -> RefMut<'a> {
111 self.guard.set_value_bytes_hashed_no_ttl(
112 self.route_mode,
113 self.key_hash,
114 self.key.as_ref(),
115 value,
116 );
117 RefMut {
118 guard: self.guard,
119 route_mode: self.route_mode,
120 key: self.key,
121 key_hash: self.key_hash,
122 _not_send: PhantomData,
123 }
124 }
125}