hermes_simd_core/vec/
rkyv.rs1use super::AlignedVec;
6use crate::align::Alignment;
7use rkyv::munge::munge;
8use rkyv::rancor::Fallible;
9use rkyv::ser::{Allocator, Writer};
10use rkyv::{Place, Portable};
11
12#[derive(Portable, rkyv::bytecheck::CheckBytes)]
17#[bytecheck(crate = rkyv::bytecheck)]
18#[repr(transparent)]
19pub struct ArchivedAlignedVec<T> {
20 pub(crate) elements: rkyv::vec::ArchivedVec<T>,
21}
22
23pub struct AlignedVecResolver {
25 pub(crate) elements_resolver: rkyv::vec::VecResolver,
26}
27
28impl<T, Align> rkyv::Archive for AlignedVec<T, Align>
29where
30 T: rkyv::Archive,
31 Align: Alignment,
32{
33 type Archived = ArchivedAlignedVec<T::Archived>;
34 type Resolver = AlignedVecResolver;
35
36 #[inline]
37 fn resolve(&self, resolver: Self::Resolver, out: Place<Self::Archived>) {
38 munge!(let ArchivedAlignedVec { elements } = out);
41 rkyv::vec::ArchivedVec::resolve_from_slice(
42 self.as_slice(),
43 resolver.elements_resolver,
44 elements,
45 );
46 }
47}
48
49impl<T, Align, S> rkyv::Serialize<S> for AlignedVec<T, Align>
50where
51 T: rkyv::Serialize<S> + rkyv::Archive,
52 Align: Alignment,
53 S: Fallible + Allocator + Writer + ?Sized,
54{
55 #[inline]
56 fn serialize(&self, serializer: &mut S) -> Result<Self::Resolver, S::Error> {
57 let elements_resolver =
58 rkyv::vec::ArchivedVec::serialize_from_slice(self.as_slice(), serializer)?;
59 Ok(AlignedVecResolver { elements_resolver })
60 }
61}
62
63impl<T, U, Align, D> rkyv::Deserialize<AlignedVec<U, Align>, D> for ArchivedAlignedVec<T>
69where
70 T: rkyv::Deserialize<U, D>,
71 Align: Alignment,
72 D: Fallible + ?Sized,
73{
74 #[inline]
75 fn deserialize(&self, deserializer: &mut D) -> Result<AlignedVec<U, Align>, D::Error> {
76 let slice = self.elements.as_slice();
77 let mut v = AlignedVec::with_capacity(slice.len());
78 for x in slice {
79 v.push(x.deserialize(deserializer)?);
80 }
81 Ok(v)
82 }
83}