Skip to main content

hermes_simd_core/vec/
rkyv.rs

1//! rkyv zero-copy serialization support for AlignedVec.
2
3//! Zero-copy serialization support for aligned vectors using `rkyv`.
4
5use super::AlignedVec;
6use crate::align::Alignment;
7
8#[repr(transparent)]
9/// Archived representation of an `AlignedVec` used by `rkyv` zero-copy serialization.
10pub struct ArchivedAlignedVec<T> {
11    pub(crate) elements: rkyv::vec::ArchivedVec<T>,
12}
13
14/// Resolver type for `AlignedVec` serialization.
15pub struct AlignedVecResolver {
16    pub(crate) elements_resolver: rkyv::vec::VecResolver,
17}
18
19impl<T, Align> rkyv::Archive for AlignedVec<T, Align>
20where
21    T: rkyv::Archive,
22    Align: Alignment,
23{
24    type Archived = ArchivedAlignedVec<T::Archived>;
25    type Resolver = AlignedVecResolver;
26
27    #[inline]
28    unsafe fn resolve(&self, pos: usize, resolver: Self::Resolver, out: *mut Self::Archived) {
29        let out_elements = core::ptr::addr_of_mut!((*out).elements);
30        rkyv::vec::ArchivedVec::resolve_from_slice(
31            self.as_slice(),
32            pos,
33            resolver.elements_resolver,
34            out_elements,
35        );
36    }
37}
38
39impl<T, Align, S> rkyv::Serialize<S> for AlignedVec<T, Align>
40where
41    T: rkyv::Serialize<S> + rkyv::Archive,
42    Align: Alignment,
43    S: rkyv::Fallible + rkyv::ser::Serializer + ?Sized,
44    [T]: rkyv::SerializeUnsized<S>,
45{
46    #[inline]
47    fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
48        let elements_resolver =
49            rkyv::vec::ArchivedVec::serialize_from_slice(self.as_slice(), serializer)?;
50        Ok(AlignedVecResolver { elements_resolver })
51    }
52}
53
54impl<T, Align, D> rkyv::Deserialize<AlignedVec<T, Align>, D> for ArchivedAlignedVec<T>
55where
56    T: rkyv::Archive,
57    T: rkyv::Deserialize<T, D>,
58    Align: Alignment,
59    D: rkyv::Fallible + ?Sized,
60{
61    #[inline]
62    fn deserialize(&self, deserializer: &mut D) -> Result<AlignedVec<T, Align>, D::Error> {
63        let slice = self.elements.as_slice();
64        let mut v = AlignedVec::with_capacity(slice.len());
65        for x in slice {
66            v.push(x.deserialize(deserializer)?);
67        }
68        Ok(v)
69    }
70}