/rust/registry/src/index.crates.io-1949cf8c6b5b557f/revision-0.14.0/src/implementations/collections.rs
Line | Count | Source |
1 | | use crate::DeserializeRevisioned; |
2 | | use crate::Error; |
3 | | use crate::Revisioned; |
4 | | use crate::SerializeRevisioned; |
5 | | |
6 | | use std::collections::BTreeMap; |
7 | | use std::collections::BTreeSet; |
8 | | use std::collections::BinaryHeap; |
9 | | use std::collections::HashMap; |
10 | | use std::collections::HashSet; |
11 | | use std::hash::BuildHasher; |
12 | | use std::hash::Hash; |
13 | | |
14 | | impl<K: SerializeRevisioned + Eq + Hash, V: SerializeRevisioned, S: BuildHasher + Default> |
15 | | SerializeRevisioned for HashMap<K, V, S> |
16 | | { |
17 | | #[inline] |
18 | 0 | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { |
19 | 0 | self.len().serialize_revisioned(writer)?; |
20 | 0 | for (k, v) in self.iter() { |
21 | 0 | k.serialize_revisioned(writer)?; |
22 | 0 | v.serialize_revisioned(writer)?; |
23 | | } |
24 | 0 | Ok(()) |
25 | 0 | } |
26 | | } |
27 | | |
28 | | impl<K: DeserializeRevisioned + Eq + Hash, V: DeserializeRevisioned, S: BuildHasher + Default> |
29 | | DeserializeRevisioned for HashMap<K, V, S> |
30 | | { |
31 | | #[inline] |
32 | 0 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { |
33 | 0 | let len = usize::deserialize_revisioned(reader)?; |
34 | 0 | let mut map = Self::with_capacity_and_hasher(len, S::default()); |
35 | 0 | for _ in 0..len { |
36 | 0 | let k = K::deserialize_revisioned(reader)?; |
37 | 0 | let v = V::deserialize_revisioned(reader)?; |
38 | 0 | map.insert(k, v); |
39 | | } |
40 | 0 | Ok(map) |
41 | 0 | } |
42 | | } |
43 | | |
44 | | impl<K: Revisioned + Eq + Hash, V: Revisioned, S: BuildHasher + Default> Revisioned |
45 | | for HashMap<K, V, S> |
46 | | { |
47 | | #[inline] |
48 | 0 | fn revision() -> u16 { |
49 | 0 | 1 |
50 | 0 | } |
51 | | } |
52 | | |
53 | | impl<K: SerializeRevisioned + Ord, V: SerializeRevisioned> SerializeRevisioned for BTreeMap<K, V> { |
54 | | #[inline] |
55 | 31.4k | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { |
56 | 31.4k | self.len().serialize_revisioned(writer)?; |
57 | 31.4k | for (k, v) in self.iter() { |
58 | 5.39k | k.serialize_revisioned(writer)?; |
59 | 5.39k | v.serialize_revisioned(writer)?; |
60 | | } |
61 | 31.4k | Ok(()) |
62 | 31.4k | } <alloc::collections::btree::map::BTreeMap<alloc::string::String, surrealdb_core::val::Value> as revision::SerializeRevisioned>::serialize_revisioned::<alloc::vec::Vec<u8>> Line | Count | Source | 55 | 31.4k | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { | 56 | 31.4k | self.len().serialize_revisioned(writer)?; | 57 | 31.4k | for (k, v) in self.iter() { | 58 | 5.39k | k.serialize_revisioned(writer)?; | 59 | 5.39k | v.serialize_revisioned(writer)?; | 60 | | } | 61 | 31.4k | Ok(()) | 62 | 31.4k | } |
Unexecuted instantiation: <alloc::collections::btree::map::BTreeMap<alloc::string::String, surrealdb_core::expr::kind::Kind> as revision::SerializeRevisioned>::serialize_revisioned::<alloc::vec::Vec<u8>> Unexecuted instantiation: <alloc::collections::btree::map::BTreeMap<_, _> as revision::SerializeRevisioned>::serialize_revisioned::<_> |
63 | | } |
64 | | |
65 | | impl<K: DeserializeRevisioned + Ord, V: DeserializeRevisioned> DeserializeRevisioned |
66 | | for BTreeMap<K, V> |
67 | | { |
68 | | #[inline] |
69 | 727 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { |
70 | 727 | let len = usize::deserialize_revisioned(reader)?; |
71 | 727 | let mut map = Self::new(); |
72 | 727 | for _ in 0..len { |
73 | 1.25k | let k = K::deserialize_revisioned(reader)?; |
74 | 1.25k | let v = V::deserialize_revisioned(reader)?; |
75 | 1.25k | map.insert(k, v); |
76 | | } |
77 | 727 | Ok(map) |
78 | 727 | } <alloc::collections::btree::map::BTreeMap<alloc::string::String, surrealdb_core::val::Value> as revision::DeserializeRevisioned>::deserialize_revisioned::<&[u8]> Line | Count | Source | 69 | 727 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { | 70 | 727 | let len = usize::deserialize_revisioned(reader)?; | 71 | 727 | let mut map = Self::new(); | 72 | 727 | for _ in 0..len { | 73 | 1.25k | let k = K::deserialize_revisioned(reader)?; | 74 | 1.25k | let v = V::deserialize_revisioned(reader)?; | 75 | 1.25k | map.insert(k, v); | 76 | | } | 77 | 727 | Ok(map) | 78 | 727 | } |
Unexecuted instantiation: <alloc::collections::btree::map::BTreeMap<alloc::string::String, surrealdb_core::expr::kind::Kind> as revision::DeserializeRevisioned>::deserialize_revisioned::<&[u8]> Unexecuted instantiation: <alloc::collections::btree::map::BTreeMap<_, _> as revision::DeserializeRevisioned>::deserialize_revisioned::<_> |
79 | | } |
80 | | |
81 | | impl<K: Revisioned + Ord, V: Revisioned> Revisioned for BTreeMap<K, V> { |
82 | | #[inline] |
83 | 0 | fn revision() -> u16 { |
84 | 0 | 1 |
85 | 0 | } |
86 | | } |
87 | | |
88 | | impl<T: SerializeRevisioned + Eq + Hash, S: BuildHasher + Default> SerializeRevisioned |
89 | | for HashSet<T, S> |
90 | | { |
91 | | #[inline] |
92 | 0 | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { |
93 | 0 | self.len().serialize_revisioned(writer)?; |
94 | 0 | for v in self.iter() { |
95 | 0 | v.serialize_revisioned(writer)?; |
96 | | } |
97 | 0 | Ok(()) |
98 | 0 | } |
99 | | } |
100 | | |
101 | | impl<T: DeserializeRevisioned + Eq + Hash, S: BuildHasher + Default> DeserializeRevisioned |
102 | | for HashSet<T, S> |
103 | | { |
104 | | #[inline] |
105 | 0 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { |
106 | 0 | let len = usize::deserialize_revisioned(reader)?; |
107 | 0 | let mut set = Self::with_capacity_and_hasher(len, S::default()); |
108 | 0 | for _ in 0..len { |
109 | 0 | let v = T::deserialize_revisioned(reader)?; |
110 | 0 | set.insert(v); |
111 | | } |
112 | 0 | Ok(set) |
113 | 0 | } |
114 | | } |
115 | | |
116 | | impl<T: Revisioned + Eq + Hash, S: BuildHasher + Default> Revisioned for HashSet<T, S> { |
117 | | #[inline] |
118 | 0 | fn revision() -> u16 { |
119 | 0 | 1 |
120 | 0 | } |
121 | | } |
122 | | |
123 | | impl<T: SerializeRevisioned + Ord> SerializeRevisioned for BTreeSet<T> { |
124 | | #[inline] |
125 | 0 | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { |
126 | 0 | self.len().serialize_revisioned(writer)?; |
127 | 0 | for v in self.iter() { |
128 | 0 | v.serialize_revisioned(writer)?; |
129 | | } |
130 | 0 | Ok(()) |
131 | 0 | } Unexecuted instantiation: <alloc::collections::btree::set::BTreeSet<surrealdb_core::val::Value> as revision::SerializeRevisioned>::serialize_revisioned::<alloc::vec::Vec<u8>> Unexecuted instantiation: <alloc::collections::btree::set::BTreeSet<_> as revision::SerializeRevisioned>::serialize_revisioned::<_> |
132 | | } |
133 | | |
134 | | impl<T: DeserializeRevisioned + Ord> DeserializeRevisioned for BTreeSet<T> { |
135 | | #[inline] |
136 | 0 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { |
137 | 0 | let len = usize::deserialize_revisioned(reader)?; |
138 | 0 | let mut set = Self::new(); |
139 | 0 | for _ in 0..len { |
140 | 0 | let v = T::deserialize_revisioned(reader)?; |
141 | 0 | set.insert(v); |
142 | | } |
143 | 0 | Ok(set) |
144 | 0 | } Unexecuted instantiation: <alloc::collections::btree::set::BTreeSet<surrealdb_core::val::Value> as revision::DeserializeRevisioned>::deserialize_revisioned::<&[u8]> Unexecuted instantiation: <alloc::collections::btree::set::BTreeSet<_> as revision::DeserializeRevisioned>::deserialize_revisioned::<_> |
145 | | } |
146 | | |
147 | | impl<T: Revisioned + Eq + Ord> Revisioned for BTreeSet<T> { |
148 | | #[inline] |
149 | 0 | fn revision() -> u16 { |
150 | 0 | 1 |
151 | 0 | } |
152 | | } |
153 | | |
154 | | impl<T: SerializeRevisioned + Ord> SerializeRevisioned for BinaryHeap<T> { |
155 | | #[inline] |
156 | 0 | fn serialize_revisioned<W: std::io::Write>(&self, writer: &mut W) -> Result<(), Error> { |
157 | 0 | self.len().serialize_revisioned(writer)?; |
158 | 0 | for v in self.iter() { |
159 | 0 | v.serialize_revisioned(writer)?; |
160 | | } |
161 | 0 | Ok(()) |
162 | 0 | } |
163 | | } |
164 | | |
165 | | impl<T: DeserializeRevisioned + Ord> DeserializeRevisioned for BinaryHeap<T> { |
166 | | #[inline] |
167 | 0 | fn deserialize_revisioned<R: std::io::Read>(reader: &mut R) -> Result<Self, Error> { |
168 | 0 | let len = usize::deserialize_revisioned(reader)?; |
169 | 0 | let mut heap = Self::with_capacity(len); |
170 | 0 | for _ in 0..len { |
171 | 0 | let v = T::deserialize_revisioned(reader)?; |
172 | 0 | heap.push(v); |
173 | | } |
174 | 0 | Ok(heap) |
175 | 0 | } |
176 | | } |
177 | | |
178 | | impl<T: Revisioned + Ord> Revisioned for BinaryHeap<T> { |
179 | | #[inline] |
180 | 0 | fn revision() -> u16 { |
181 | 0 | 1 |
182 | 0 | } |
183 | | } |
184 | | |
185 | | #[cfg(test)] |
186 | | mod tests { |
187 | | |
188 | | use super::*; |
189 | | |
190 | | #[test] |
191 | | fn test_hashmap() { |
192 | | let mut val: HashMap<String, Vec<f64>> = HashMap::new(); |
193 | | val.insert("some".into(), vec![1.449, -5365.3849, 97194619.117391]); |
194 | | val.insert("test".into(), vec![-3917.195, 19461.3849, -365.195759]); |
195 | | let mut mem: Vec<u8> = vec![]; |
196 | | val.serialize_revisioned(&mut mem).unwrap(); |
197 | | assert_eq!(mem.len(), 61); |
198 | | let out = <HashMap<String, Vec<f64>> as DeserializeRevisioned>::deserialize_revisioned( |
199 | | &mut mem.as_slice(), |
200 | | ) |
201 | | .unwrap(); |
202 | | assert_eq!(val, out); |
203 | | } |
204 | | |
205 | | #[test] |
206 | | fn test_hashmap_nondefault_hasher() { |
207 | | #[derive(Default)] |
208 | | struct TestHasher(std::hash::RandomState); |
209 | | impl BuildHasher for TestHasher { |
210 | | type Hasher = <std::hash::RandomState as std::hash::BuildHasher>::Hasher; |
211 | | fn build_hasher(&self) -> Self::Hasher { |
212 | | self.0.build_hasher() |
213 | | } |
214 | | } |
215 | | |
216 | | let mut val: HashMap<String, Vec<f64>, TestHasher> = |
217 | | HashMap::with_hasher(Default::default()); |
218 | | val.insert("some".into(), vec![1.449, -5365.3849, 97194619.117391]); |
219 | | val.insert("test".into(), vec![-3917.195, 19461.3849, -365.195759]); |
220 | | let mut mem: Vec<u8> = vec![]; |
221 | | val.serialize_revisioned(&mut mem).unwrap(); |
222 | | assert_eq!(mem.len(), 61); |
223 | | let out = <HashMap<String, Vec<f64>, TestHasher> as DeserializeRevisioned>::deserialize_revisioned( |
224 | | &mut mem.as_slice(), |
225 | | ) |
226 | | .unwrap(); |
227 | | assert_eq!(val, out); |
228 | | } |
229 | | |
230 | | #[test] |
231 | | fn test_btreemap() { |
232 | | let mut val: BTreeMap<String, Vec<f64>> = BTreeMap::new(); |
233 | | val.insert("some".into(), vec![1.449, -5365.3849, 97194619.117391]); |
234 | | val.insert("test".into(), vec![-3917.195, 19461.3849, -365.195759]); |
235 | | let mut mem: Vec<u8> = vec![]; |
236 | | val.serialize_revisioned(&mut mem).unwrap(); |
237 | | assert_eq!(mem.len(), 61); |
238 | | let out = <BTreeMap<String, Vec<f64>> as DeserializeRevisioned>::deserialize_revisioned( |
239 | | &mut mem.as_slice(), |
240 | | ) |
241 | | .unwrap(); |
242 | | assert_eq!(val, out); |
243 | | } |
244 | | |
245 | | #[test] |
246 | | fn test_hashset() { |
247 | | let mut val: HashSet<String> = HashSet::new(); |
248 | | val.insert("some".into()); |
249 | | val.insert("test".into()); |
250 | | let mut mem: Vec<u8> = vec![]; |
251 | | val.serialize_revisioned(&mut mem).unwrap(); |
252 | | assert_eq!(mem.len(), 11); |
253 | | let out = |
254 | | <HashSet<String> as DeserializeRevisioned>::deserialize_revisioned(&mut mem.as_slice()) |
255 | | .unwrap(); |
256 | | assert_eq!(val, out); |
257 | | } |
258 | | |
259 | | #[test] |
260 | | fn test_btreeset() { |
261 | | let mut val: BTreeSet<String> = BTreeSet::new(); |
262 | | val.insert("some".into()); |
263 | | val.insert("test".into()); |
264 | | let mut mem: Vec<u8> = vec![]; |
265 | | val.serialize_revisioned(&mut mem).unwrap(); |
266 | | assert_eq!(mem.len(), 11); |
267 | | let out = <BTreeSet<String> as DeserializeRevisioned>::deserialize_revisioned( |
268 | | &mut mem.as_slice(), |
269 | | ) |
270 | | .unwrap(); |
271 | | assert_eq!(val, out); |
272 | | } |
273 | | |
274 | | #[test] |
275 | | fn test_binheap() { |
276 | | let mut val: BinaryHeap<String> = BinaryHeap::new(); |
277 | | val.push("some".into()); |
278 | | val.push("test".into()); |
279 | | let mut mem: Vec<u8> = vec![]; |
280 | | val.serialize_revisioned(&mut mem).unwrap(); |
281 | | assert_eq!(mem.len(), 11); |
282 | | let out = <BinaryHeap<String> as DeserializeRevisioned>::deserialize_revisioned( |
283 | | &mut mem.as_slice(), |
284 | | ) |
285 | | .unwrap(); |
286 | | assert_eq!(val.into_sorted_vec(), out.into_sorted_vec()); |
287 | | } |
288 | | |
289 | | #[test] |
290 | | fn test_hashset_string_empty() { |
291 | | let set: HashSet<String> = HashSet::new(); |
292 | | let mut mem: Vec<u8> = vec![]; |
293 | | set.serialize_revisioned(&mut mem).unwrap(); |
294 | | |
295 | | let out: HashSet<String> = HashSet::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
296 | | assert_eq!(set, out); |
297 | | } |
298 | | |
299 | | #[test] |
300 | | fn test_btreeset_string_empty() { |
301 | | let set: BTreeSet<String> = BTreeSet::new(); |
302 | | let mut mem: Vec<u8> = vec![]; |
303 | | set.serialize_revisioned(&mut mem).unwrap(); |
304 | | |
305 | | let out: BTreeSet<String> = BTreeSet::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
306 | | assert_eq!(set, out); |
307 | | } |
308 | | |
309 | | #[test] |
310 | | fn test_hashmap_string_empty() { |
311 | | let map: HashMap<String, i32> = HashMap::new(); |
312 | | let mut mem: Vec<u8> = vec![]; |
313 | | map.serialize_revisioned(&mut mem).unwrap(); |
314 | | |
315 | | let out: HashMap<String, i32> = |
316 | | HashMap::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
317 | | assert_eq!(map, out); |
318 | | } |
319 | | |
320 | | #[test] |
321 | | fn test_btreemap_string_empty() { |
322 | | let map: BTreeMap<String, i32> = BTreeMap::new(); |
323 | | let mut mem: Vec<u8> = vec![]; |
324 | | map.serialize_revisioned(&mut mem).unwrap(); |
325 | | |
326 | | let out: BTreeMap<String, i32> = |
327 | | BTreeMap::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
328 | | assert_eq!(map, out); |
329 | | } |
330 | | |
331 | | #[test] |
332 | | fn test_hashset_string_specialization() { |
333 | | let mut set = HashSet::new(); |
334 | | set.insert("item1".to_string()); |
335 | | set.insert("item2".to_string()); |
336 | | set.insert("".to_string()); |
337 | | set.insert("longer_item_with_underscores".to_string()); |
338 | | set.insert("unicode_🚀🔥✨".to_string()); |
339 | | |
340 | | let mut mem: Vec<u8> = vec![]; |
341 | | set.serialize_revisioned(&mut mem).unwrap(); |
342 | | |
343 | | let out: HashSet<String> = HashSet::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
344 | | assert_eq!(set, out); |
345 | | } |
346 | | |
347 | | #[test] |
348 | | fn test_btreeset_string_specialization() { |
349 | | let mut set = BTreeSet::new(); |
350 | | set.insert("item1".to_string()); |
351 | | set.insert("item2".to_string()); |
352 | | set.insert("".to_string()); |
353 | | set.insert("longer_item_with_underscores".to_string()); |
354 | | set.insert("unicode_🚀🔥✨".to_string()); |
355 | | |
356 | | let mut mem: Vec<u8> = vec![]; |
357 | | set.serialize_revisioned(&mut mem).unwrap(); |
358 | | |
359 | | let out: BTreeSet<String> = BTreeSet::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
360 | | assert_eq!(set, out); |
361 | | } |
362 | | |
363 | | #[test] |
364 | | fn test_hashset_string_large() { |
365 | | // Test larger HashSet to verify bulk operations and deterministic serialization |
366 | | let mut set = HashSet::new(); |
367 | | for i in 0..50 { |
368 | | set.insert(format!("item_{}", i)); |
369 | | } |
370 | | |
371 | | let mut mem: Vec<u8> = vec![]; |
372 | | set.serialize_revisioned(&mut mem).unwrap(); |
373 | | |
374 | | let out: HashSet<String> = HashSet::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
375 | | assert_eq!(set, out); |
376 | | } |
377 | | |
378 | | #[test] |
379 | | fn test_btreeset_string_large() { |
380 | | // Test larger BTreeSet to verify bulk operations and ordering |
381 | | let mut set = BTreeSet::new(); |
382 | | for i in 0..50 { |
383 | | set.insert(format!("item_{:03}", i)); // Zero-padded for consistent ordering |
384 | | } |
385 | | |
386 | | let mut mem: Vec<u8> = vec![]; |
387 | | set.serialize_revisioned(&mut mem).unwrap(); |
388 | | |
389 | | let out: BTreeSet<String> = BTreeSet::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
390 | | assert_eq!(set, out); |
391 | | } |
392 | | |
393 | | // Tests specifically for the String-keyed specializations |
394 | | #[test] |
395 | | fn test_hashmap_string_specialization() { |
396 | | let mut map = HashMap::new(); |
397 | | map.insert("key1".to_string(), 42i32); |
398 | | map.insert("key2".to_string(), -100i32); |
399 | | map.insert("".to_string(), 0i32); |
400 | | map.insert("longer_key_with_underscores".to_string(), 999i32); |
401 | | map.insert("unicode_🚀🔥✨".to_string(), -42i32); |
402 | | |
403 | | let mut mem: Vec<u8> = vec![]; |
404 | | map.serialize_revisioned(&mut mem).unwrap(); |
405 | | |
406 | | let out: HashMap<String, i32> = |
407 | | HashMap::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
408 | | assert_eq!(map, out); |
409 | | } |
410 | | |
411 | | #[test] |
412 | | fn test_btreemap_string_specialization() { |
413 | | let mut map = BTreeMap::new(); |
414 | | map.insert("key1".to_string(), 42i32); |
415 | | map.insert("key2".to_string(), -100i32); |
416 | | map.insert("".to_string(), 0i32); |
417 | | map.insert("longer_key_with_underscores".to_string(), 999i32); |
418 | | map.insert("unicode_🚀🔥✨".to_string(), -42i32); |
419 | | |
420 | | let mut mem: Vec<u8> = vec![]; |
421 | | map.serialize_revisioned(&mut mem).unwrap(); |
422 | | |
423 | | let out: BTreeMap<String, i32> = |
424 | | BTreeMap::deserialize_revisioned(&mut mem.as_slice()).unwrap(); |
425 | | assert_eq!(map, out); |
426 | | } |
427 | | } |