Coverage Report

Created: 2025-11-28 06:44

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}