|
3 | 3 | //! Serialization support for primitive data types.
|
4 | 4 | #![allow(clippy::float_cmp)]
|
5 | 5 |
|
| 6 | +use std::collections::VecDeque; |
| 7 | + |
6 | 8 | use self::super::{VersionMap, Versionize, VersionizeError, VersionizeResult};
|
7 | 9 | use vmm_sys_util::fam::{FamStruct, FamStructWrapper};
|
8 | 10 |
|
@@ -335,6 +337,53 @@ where
|
335 | 337 | }
|
336 | 338 | }
|
337 | 339 |
|
| 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 | + |
338 | 387 | // Implement versioning for FAM structures by using the FamStructWrapper interface.
|
339 | 388 | impl<T: Default + FamStruct + Versionize> Versionize for FamStructWrapper<T>
|
340 | 389 | where
|
@@ -622,6 +671,25 @@ mod tests {
|
622 | 671 | assert_eq!(store, restore);
|
623 | 672 | }
|
624 | 673 |
|
| 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 | + |
625 | 693 | #[test]
|
626 | 694 | fn test_ser_de_option() {
|
627 | 695 | let vm = VersionMap::new();
|
|
0 commit comments