1use std::{convert::AsRef, fmt::Debug, io::Write};
8
9use serde::Serialize;
10use tuwunel_core::{arrayvec::ArrayVec, implement};
11
12use crate::{
13 keyval::{KeyBuf, ValBuf},
14 ser,
15};
16
17#[implement(super::Map)]
22#[inline]
23pub fn put<K, V>(&self, key: K, val: V)
24where
25 K: Serialize + Debug,
26 V: Serialize,
27{
28 let mut key_buf = KeyBuf::new();
29 let mut val_buf = ValBuf::new();
30 self.bput(key, val, (&mut key_buf, &mut val_buf));
31}
32
33#[implement(super::Map)]
38#[inline]
39pub fn put_raw<K, V>(&self, key: K, val: V)
40where
41 K: Serialize + Debug,
42 V: AsRef<[u8]>,
43{
44 let mut key_buf = KeyBuf::new();
45 self.bput_raw(key, val, &mut key_buf);
46}
47
48#[implement(super::Map)]
53#[inline]
54pub fn raw_put<K, V>(&self, key: K, val: V)
55where
56 K: AsRef<[u8]>,
57 V: Serialize,
58{
59 let mut val_buf = ValBuf::new();
60 self.raw_bput(key, val, &mut val_buf);
61}
62
63#[implement(super::Map)]
68#[inline]
69pub fn put_aput<const VMAX: usize, K, V>(&self, key: K, val: V)
70where
71 K: Serialize + Debug,
72 V: Serialize,
73{
74 let mut key_buf = KeyBuf::new();
75 let mut val_buf = ArrayVec::<u8, VMAX>::new();
76 self.bput(key, val, (&mut key_buf, &mut val_buf));
77}
78
79#[implement(super::Map)]
84#[inline]
85pub fn aput_put<const KMAX: usize, K, V>(&self, key: K, val: V)
86where
87 K: Serialize + Debug,
88 V: Serialize,
89{
90 let mut key_buf = ArrayVec::<u8, KMAX>::new();
91 let mut val_buf = ValBuf::new();
92 self.bput(key, val, (&mut key_buf, &mut val_buf));
93}
94
95#[implement(super::Map)]
100#[inline]
101pub fn aput<const KMAX: usize, const VMAX: usize, K, V>(&self, key: K, val: V)
102where
103 K: Serialize + Debug,
104 V: Serialize,
105{
106 let mut key_buf = ArrayVec::<u8, KMAX>::new();
107 let mut val_buf = ArrayVec::<u8, VMAX>::new();
108 self.bput(key, val, (&mut key_buf, &mut val_buf));
109}
110
111#[implement(super::Map)]
116#[inline]
117pub fn aput_raw<const KMAX: usize, K, V>(&self, key: K, val: V)
118where
119 K: Serialize + Debug,
120 V: AsRef<[u8]>,
121{
122 let mut key_buf = ArrayVec::<u8, KMAX>::new();
123 self.bput_raw(key, val, &mut key_buf);
124}
125
126#[implement(super::Map)]
131#[inline]
132pub fn raw_aput<const VMAX: usize, K, V>(&self, key: K, val: V)
133where
134 K: AsRef<[u8]>,
135 V: Serialize,
136{
137 let mut val_buf = ArrayVec::<u8, VMAX>::new();
138 self.raw_bput(key, val, &mut val_buf);
139}
140
141#[implement(super::Map)]
146pub fn bput<K, V, Bk, Bv>(&self, key: K, val: V, mut buf: (Bk, Bv))
147where
148 K: Serialize + Debug,
149 V: Serialize,
150 Bk: Write + AsRef<[u8]>,
151 Bv: Write + AsRef<[u8]>,
152{
153 let val = ser::serialize(&mut buf.1, val).expect("failed to serialize insertion val");
154 self.bput_raw(key, val, &mut buf.0);
155}
156
157#[implement(super::Map)]
162#[tracing::instrument(skip(self, val, buf), level = "trace")]
163pub fn bput_raw<K, V, Bk>(&self, key: K, val: V, mut buf: Bk)
164where
165 K: Serialize + Debug,
166 V: AsRef<[u8]>,
167 Bk: Write + AsRef<[u8]>,
168{
169 let key = ser::serialize(&mut buf, key).expect("failed to serialize insertion key");
170 self.insert(&key, val);
171}
172
173#[implement(super::Map)]
178pub fn raw_bput<K, V, Bv>(&self, key: K, val: V, mut buf: Bv)
179where
180 K: AsRef<[u8]>,
181 V: Serialize,
182 Bv: Write + AsRef<[u8]>,
183{
184 let val = ser::serialize(&mut buf, val).expect("failed to serialize insertion val");
185 self.insert(&key, val);
186}