1use crate::{Value, ValueExt, ValueRef};
2use bytes::{Bytes, BytesMut};
3use core::ops::{Deref, DerefMut};
4
5#[derive(Default, Debug, Eq, PartialEq, Ord, PartialOrd, Clone, Hash)]
23#[repr(C)]
24pub struct ValueMut {
25 pub(crate) meta: u8,
26 pub(crate) user_meta: u8,
27 pub(crate) expires_at: u64,
28 pub(crate) version: u64, pub(crate) value: BytesMut,
30}
31
32impl ValueMut {
33 #[inline]
35 pub fn freeze(self) -> Value {
36 Value {
37 meta: self.meta,
38 user_meta: self.user_meta,
39 expires_at: self.expires_at,
40 version: self.version,
41 value: self.value.freeze(),
42 }
43 }
44}
45
46impl Deref for ValueMut {
47 type Target = BytesMut;
48
49 fn deref(&self) -> &Self::Target {
50 &self.value
51 }
52}
53
54impl DerefMut for ValueMut {
55 fn deref_mut(&mut self) -> &mut Self::Target {
56 &mut self.value
57 }
58}
59
60impl ValueExt for ValueMut {
61 #[inline]
62 fn as_value_ref(&self) -> ValueRef {
63 ValueRef {
64 meta: self.meta,
65 user_meta: self.user_meta,
66 expires_at: self.expires_at,
67 version: self.version,
68 val: self.parse_value(),
69 }
70 }
71
72 #[inline]
73 fn parse_value(&self) -> &[u8] {
74 self.value.as_ref()
75 }
76
77 #[inline]
80 fn parse_value_to_bytes(&self) -> Bytes {
81 Bytes::copy_from_slice(self.value.as_ref())
82 }
83
84 #[inline]
85 fn get_meta(&self) -> u8 {
86 self.meta
87 }
88
89 #[inline]
90 fn get_user_meta(&self) -> u8 {
91 self.user_meta
92 }
93
94 #[inline]
95 fn get_expires_at(&self) -> u64 {
96 self.expires_at
97 }
98}
99
100impl ValueMutExt for ValueMut {
101 #[inline]
102 fn parse_value_mut(&mut self) -> &mut [u8] {
103 self.value.as_mut()
104 }
105
106 #[inline]
107 fn set_meta(&mut self, meta: u8) {
108 self.meta = meta
109 }
110
111 #[inline]
112 fn set_user_meta(&mut self, user_meta: u8) {
113 self.user_meta = user_meta
114 }
115
116 #[inline]
117 fn set_expires_at(&mut self, expires_at: u64) {
118 self.expires_at = expires_at
119 }
120}
121
122pub trait ValueMutExt {
124 fn parse_value_mut(&mut self) -> &mut [u8];
126
127 fn set_meta(&mut self, meta: u8);
129
130 fn set_user_meta(&mut self, user_meta: u8);
132
133 fn set_expires_at(&mut self, expires_at: u64);
135}