Skip to content

Commit 0d761e2

Browse files
committed
implement Versionize for VecDeque
Signed-off-by: Alexandru Agache <[email protected]>
1 parent db18af0 commit 0d761e2

File tree

3 files changed

+79
-2
lines changed

3 files changed

+79
-2
lines changed

CHANGELOG.md

+9-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1-
# v0.1.0
1+
# Changelog
2+
3+
## [Unreleased]
4+
5+
### Added
6+
7+
- Implemented `Versionize` for `VecDeque` as a primitive.
8+
9+
## v0.1.0
210

311
- "versionize" v0.1.0 first release.

coverage_config_aarch64.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
{"coverage_score": 92.3, "exclude_path": "", "crate_features": ""}
1+
{"coverage_score": 92.4, "exclude_path": "", "crate_features": ""}

src/primitives.rs

+69
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
//! Serialization support for primitive data types.
44
#![allow(clippy::float_cmp)]
55

6+
use std::collections::VecDeque;
7+
68
use self::super::{VersionMap, Versionize, VersionizeError, VersionizeResult};
79
use vmm_sys_util::fam::{FamStruct, FamStructWrapper};
810

@@ -335,6 +337,53 @@ where
335337
}
336338
}
337339

340+
impl<T> Versionize for VecDeque<T>
341+
where
342+
T: Versionize,
343+
{
344+
#[inline]
345+
fn serialize<W: std::io::Write>(
346+
&self,
347+
mut writer: &mut W,
348+
version_map: &VersionMap,
349+
app_version: u16,
350+
) -> VersionizeResult<()> {
351+
// Serialize in the same fashion as bincode:
352+
// Write len.
353+
bincode::serialize_into(&mut writer, &self.len())
354+
.map_err(|ref err| VersionizeError::Serialize(format!("{:?}", err)))?;
355+
// Walk the vecdeque and write each elemenet.
356+
for element in self {
357+
element
358+
.serialize(writer, version_map, app_version)
359+
.map_err(|ref err| VersionizeError::Serialize(format!("{:?}", err)))?;
360+
}
361+
Ok(())
362+
}
363+
364+
#[inline]
365+
fn deserialize<R: std::io::Read>(
366+
mut reader: &mut R,
367+
version_map: &VersionMap,
368+
app_version: u16,
369+
) -> VersionizeResult<Self> {
370+
let mut v = VecDeque::new();
371+
let len: u64 = bincode::deserialize_from(&mut reader)
372+
.map_err(|ref err| VersionizeError::Deserialize(format!("{:?}", err)))?;
373+
for _ in 0..len {
374+
let element: T = T::deserialize(reader, version_map, app_version)
375+
.map_err(|ref err| VersionizeError::Deserialize(format!("{:?}", err)))?;
376+
v.push_back(element);
377+
}
378+
Ok(v)
379+
}
380+
381+
// Not used yet.
382+
fn version() -> u16 {
383+
1
384+
}
385+
}
386+
338387
// Implement versioning for FAM structures by using the FamStructWrapper interface.
339388
impl<T: Default + FamStruct + Versionize> Versionize for FamStructWrapper<T>
340389
where
@@ -622,6 +671,26 @@ mod tests {
622671
assert_eq!(store, restore);
623672
}
624673

674+
#[test]
675+
fn test_ser_de_vecdeque() {
676+
let vm = VersionMap::new();
677+
let mut snapshot_mem = vec![0u8; 64];
678+
679+
let mut store = VecDeque::new();
680+
store.push_back("test 1".to_owned());
681+
store.push_back("test 2".to_owned());
682+
store.push_back("test 3".to_owned());
683+
684+
store
685+
.serialize(&mut snapshot_mem.as_mut_slice(), &vm, 1)
686+
.unwrap();
687+
let restore =
688+
<VecDeque<String> as Versionize>::deserialize(&mut snapshot_mem.as_slice(), &vm, 1)
689+
.unwrap();
690+
691+
assert_eq!(store, restore);
692+
}
693+
625694
#[test]
626695
fn test_ser_de_option() {
627696
let vm = VersionMap::new();

0 commit comments

Comments
 (0)