inc_complete/db/
serialize.rs1use std::sync::atomic::{AtomicU32, Ordering};
2
3use serde::{Deserialize, ser::SerializeStruct};
4
5use crate::{Cell, cell::CellData};
6
7use super::Db;
8
9impl<Storage> serde::Serialize for Db<Storage>
10where
11 Storage: serde::Serialize,
12{
13 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
14 where
15 S: serde::Serializer,
16 {
17 let mut cells = Vec::with_capacity(self.cells.len());
18
19 self.cells.scan(|key, value| {
20 cells.push((*key, value.clone()));
21 });
22
23 let version = self.version.load(Ordering::SeqCst);
24 let next_cell = self.next_cell.load(Ordering::SeqCst);
25
26 let mut s = serializer.serialize_struct("Db", 4)?;
27 s.serialize_field("version", &version)?;
28 s.serialize_field("next_cell", &next_cell)?;
29 s.serialize_field("cells", &cells)?;
30 s.serialize_field("storage", &self.storage)?;
31 s.end()
32 }
33}
34
35#[derive(Deserialize)]
36#[serde(rename = "Db")]
37struct DbDeserialize<Storage> {
38 version: u32,
39 next_cell: u32,
40 cells: Vec<(Cell, CellData)>,
41 storage: Storage,
42}
43
44impl<'de, Storage> serde::Deserialize<'de> for Db<Storage>
45where
46 Storage: serde::Deserialize<'de>,
47{
48 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
49 where
50 D: serde::Deserializer<'de>,
51 {
52 let db = DbDeserialize::deserialize(deserializer)?;
53
54 let cells = scc::HashMap::with_capacity(db.cells.len());
55 for (cell, data) in db.cells {
56 cells.insert(cell, data).ok();
57 }
58
59 Ok(Db {
60 cells,
61 version: AtomicU32::new(db.version),
62 next_cell: AtomicU32::new(db.next_cell),
63 storage: db.storage,
64 })
65 }
66}