Skip to content

Commit 82c8ebf

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

File tree

2 files changed

+77
-1
lines changed

2 files changed

+77
-1
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.

src/primitives.rs

+68
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,25 @@ 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).unwrap();
689+
690+
assert_eq!(store, restore);
691+
}
692+
625693
#[test]
626694
fn test_ser_de_option() {
627695
let vm = VersionMap::new();

0 commit comments

Comments
 (0)