musli_tests/utils/
extra.rs

1/// This one lives here because it doesn't support serialization of maps with
2/// other than string keys, and 128-bit numerical types.
3#[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/// rkyv lives here for a whole variety of reasons.
43///
44/// It has limited type support, so comparing it with full serialization methods
45/// would not be fair.
46#[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        // SAFETY: I don't know why this is OK.
67        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/// RMP lacks support for certain numerical types.
160#[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/// Bitcode lives in here with two variants, one using serde and another using
195/// its own derives.
196///
197/// It lacks support for 128-bit numerical types.
198#[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/// Bitcode lives in here with two variants, one using serde and another using
229/// its own derives.
230///
231/// It lacks support for 128-bit numerical types.
232#[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}