musli_tests/utils/
extra.rs1#[cfg(feature = "dlhn")]
4pub mod serde_dlhn {
5 use alloc::vec::Vec;
6
7 use dlhn::de::Deserializer;
8 use dlhn::ser::Serializer;
9 use serde::{Deserialize, Serialize};
10
11 benchmarker! {
12 'buf
13
14 pub fn buffer() -> Vec<u8> {
15 Vec::with_capacity(4096)
16 }
17
18 pub fn reset<T>(&mut self, _: usize, _: &T) {
19 self.buffer.clear();
20 }
21
22 pub fn encode<T>(&mut self, value: &T) -> Result<&'buf [u8], dlhn::ser::Error>
23 where
24 T: Serialize,
25 {
26 let mut serializer = Serializer::new(&mut *self.buffer);
27 value.serialize(&mut serializer)?;
28 Ok(self.buffer.as_slice())
29 }
30
31 pub fn decode<T>(&self) -> Result<T, dlhn::de::Error>
32 where
33 for<'de> T: Deserialize<'de>,
34 {
35 let mut buffer = &self.buffer[..];
36 let mut deserializer = Deserializer::new(&mut buffer);
37 T::deserialize(&mut deserializer)
38 }
39 }
40}
41
42#[cfg(feature = "rkyv")]
47pub mod rkyv {
48 use rkyv::ser::serializers::{AlignedSerializer, BufferScratch, CompositeSerializer};
49 use rkyv::ser::Serializer;
50 use rkyv::validation::validators::DefaultValidator;
51 use rkyv::validation::CheckTypeError;
52 use rkyv::{AlignedVec, Archive, CheckBytes, Fallible, Infallible, Serialize};
53
54 const BUFFER_LEN: usize = 10_000_000;
55 const SCRATCH_LEN: usize = 512_000;
56
57 pub struct Benchmarker {
58 serialize_buffer: AlignedVec,
59 serialize_scratch: AlignedVec,
60 }
61
62 pub fn new() -> Benchmarker {
63 let serialize_buffer = AlignedVec::with_capacity(BUFFER_LEN);
64 let mut serialize_scratch = AlignedVec::with_capacity(SCRATCH_LEN);
65
66 unsafe {
68 serialize_scratch.set_len(SCRATCH_LEN);
69 }
70
71 Benchmarker {
72 serialize_buffer,
73 serialize_scratch,
74 }
75 }
76
77 type S<'buf> = CompositeSerializer<
78 AlignedSerializer<&'buf mut AlignedVec>,
79 BufferScratch<&'buf mut AlignedVec>,
80 Infallible,
81 >;
82
83 pub struct State<'buf, 'scratch> {
84 serialize_buffer: &'buf mut AlignedVec,
85 serialize_scratch: &'scratch mut AlignedVec,
86 }
87
88 impl Benchmarker {
89 pub fn with<T, O>(&mut self, runner: T) -> O
90 where
91 T: FnOnce(State<'_, '_>) -> O,
92 {
93 runner(State {
94 serialize_buffer: &mut self.serialize_buffer,
95 serialize_scratch: &mut self.serialize_scratch,
96 })
97 }
98 }
99
100 pub struct DecodeState<'buf> {
101 bytes: &'buf [u8],
102 }
103
104 #[inline(always)]
105 pub fn decode<'de, T>(
106 bytes: &'de [u8],
107 ) -> Result<&'de T::Archived, CheckTypeError<T::Archived, DefaultValidator<'de>>>
108 where
109 T: Archive,
110 T::Archived: CheckBytes<DefaultValidator<'de>>,
111 {
112 rkyv::check_archived_root::<T>(bytes)
113 }
114
115 impl<'de> DecodeState<'de> {
116 #[inline(always)]
117 pub fn len(&self) -> usize {
118 self.bytes.len()
119 }
120
121 #[inline(always)]
122 pub fn decode<T>(
123 &self,
124 ) -> Result<&'de T::Archived, CheckTypeError<T::Archived, DefaultValidator<'de>>>
125 where
126 T: Archive,
127 T::Archived: CheckBytes<DefaultValidator<'de>>,
128 {
129 self::decode::<T>(self.bytes)
130 }
131 }
132
133 impl<'buf, 'scratch> State<'buf, 'scratch> {
134 pub fn reset<T>(&mut self, _: usize, _: &T) {
135 self.serialize_buffer.clear();
136 }
137
138 #[inline(always)]
139 pub fn encode<T>(
140 &mut self,
141 value: &T,
142 ) -> Result<DecodeState<'_>, <S<'buf> as Fallible>::Error>
143 where
144 T: for<'value> Serialize<S<'value>>,
145 {
146 let mut serializer = CompositeSerializer::new(
147 AlignedSerializer::new(&mut *self.serialize_buffer),
148 BufferScratch::new(&mut *self.serialize_scratch),
149 Infallible,
150 );
151
152 serializer.serialize_value(value)?;
153 let bytes = serializer.into_serializer().into_inner();
154 Ok(DecodeState { bytes })
155 }
156 }
157}
158
159#[cfg(feature = "rmp-serde")]
161pub mod serde_rmp {
162 use alloc::vec::Vec;
163
164 use serde::{Deserialize, Serialize};
165
166 benchmarker! {
167 'buf
168
169 pub fn buffer() -> Vec<u8> {
170 Vec::with_capacity(4096)
171 }
172
173 pub fn reset<T>(&mut self, _: usize, _: &T) {
174 self.buffer.clear();
175 }
176
177 pub fn encode<T>(&mut self, value: &T) -> Result<&'buf [u8], rmp_serde::encode::Error>
178 where
179 T: Serialize,
180 {
181 rmp_serde::encode::write(&mut *self.buffer, value)?;
182 Ok(self.buffer.as_slice())
183 }
184
185 pub fn decode<T>(&self) -> Result<T, rmp_serde::decode::Error>
186 where
187 T: Deserialize<'buf>,
188 {
189 rmp_serde::from_slice(self.buffer)
190 }
191 }
192}
193
194#[cfg(feature = "bitcode")]
199pub mod serde_bitcode {
200 use bitcode::Buffer;
201 use serde::{Deserialize, Serialize};
202
203 benchmarker! {
204 'buf
205
206 pub fn buffer() -> Buffer {
207 Buffer::with_capacity(4096)
208 }
209
210 pub fn reset<T>(&mut self, _: usize, _: &T) {}
211
212 pub fn encode<T>(&mut self, value: &T) -> Result<&'buf [u8], bitcode::Error>
213 where
214 T: Serialize,
215 {
216 self.buffer.serialize(value)
217 }
218
219 pub fn decode<T>(&self) -> Result<T, bitcode::Error>
220 where
221 for<'de> T: Deserialize<'de>,
222 {
223 bitcode::deserialize(self.buffer)
224 }
225 }
226}
227
228#[cfg(feature = "bitcode")]
233pub mod derive_bitcode {
234 use bitcode::Buffer;
235 use bitcode::{Decode, Encode};
236
237 benchmarker! {
238 'buf
239
240 pub fn buffer() -> Buffer {
241 Buffer::with_capacity(4096)
242 }
243
244 pub fn reset<T>(&mut self, _: usize, _: &T) {}
245
246 pub fn encode<T>(&mut self, value: &T) -> Result<&'buf [u8], bitcode::Error>
247 where
248 T: Encode,
249 {
250 self.buffer.encode(value)
251 }
252
253 pub fn decode<T>(&self) -> Result<T, bitcode::Error>
254 where
255 T: Decode,
256 {
257 bitcode::decode(self.buffer)
258 }
259 }
260}