Skip to main content

prefix_trie/rkyv/
deserialize.rs

1//! Deserialization logic for rkyv
2
3use crate::{
4    joint::{JointPrefix, JointPrefixMap, JointPrefixSet},
5    rkyv::{ArchivedJointPrefixMap, ArchivedJointPrefixSet, ArchivedPrefixMap, ArchivedPrefixSet},
6    table::Table,
7    Prefix, PrefixMap, PrefixSet,
8};
9use rkyv::{
10    rancor::{Fallible, Source},
11    Archive, Deserialize,
12};
13
14impl<P, T, D> Deserialize<PrefixMap<P, T>, D> for ArchivedPrefixMap<P, T>
15where
16    P: Prefix,
17    T: Archive,
18    T::Archived: Deserialize<T, D>,
19    D: Fallible + ?Sized,
20    D::Error: Source,
21{
22    fn deserialize(&self, d: &mut D) -> Result<PrefixMap<P, T>, D::Error> {
23        let count = self.data.as_slice().len();
24        let nodes = self
25            .nodes
26            .as_slice()
27            .iter()
28            .map(|n| (n.data_bitmap.to_native(), n.child_bitmap.to_native()));
29        let data = self.data.as_slice().iter().map(|c| c.deserialize(d));
30
31        let table = Table::from_bfs(nodes, data)?;
32        Ok(PrefixMap::from_table_count(table, count))
33    }
34}
35
36impl<P, D> Deserialize<PrefixSet<P>, D> for ArchivedPrefixSet<P>
37where
38    P: Prefix,
39    D: Fallible + ?Sized,
40    D::Error: Source,
41{
42    fn deserialize(&self, d: &mut D) -> Result<PrefixSet<P>, D::Error> {
43        self.0.deserialize(d).map(PrefixSet)
44    }
45}
46
47impl<P, T, D> Deserialize<JointPrefixMap<P, T>, D> for ArchivedJointPrefixMap<P, T>
48where
49    P: JointPrefix,
50    T: Archive,
51    T::Archived: Deserialize<T, D>,
52    D: Fallible + ?Sized,
53    D::Error: Source,
54{
55    fn deserialize(&self, d: &mut D) -> Result<JointPrefixMap<P, T>, D::Error> {
56        let t1 = self.t1.deserialize(d)?;
57        let t2 = self.t2.deserialize(d)?;
58        Ok(JointPrefixMap { t1, t2 })
59    }
60}
61
62impl<P, D> Deserialize<JointPrefixSet<P>, D> for ArchivedJointPrefixSet<P>
63where
64    P: JointPrefix,
65    D: Fallible + ?Sized,
66    D::Error: Source,
67{
68    fn deserialize(&self, d: &mut D) -> Result<JointPrefixSet<P>, D::Error> {
69        let t1 = self.t1.deserialize(d)?;
70        let t2 = self.t2.deserialize(d)?;
71        Ok(JointPrefixSet { t1, t2 })
72    }
73}