hermes_simd_core/vec/
rkyv.rs1use super::AlignedVec;
6use crate::align::Alignment;
7
8#[repr(transparent)]
9pub struct ArchivedAlignedVec<T> {
11 pub(crate) elements: rkyv::vec::ArchivedVec<T>,
12}
13
14pub 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}