reflexo/vector/
stream.rs

1use super::ir::{ArchivedFlatModule, FlatModule};
2use rkyv::de::deserializers::SharedDeserializeMap;
3use rkyv::{AlignedVec, Deserialize};
4
5pub enum RkyvStreamData<'a> {
6    Aligned(&'a [u8]),
7    Unaligned(AlignedVec),
8}
9
10impl<'a> RkyvStreamData<'a> {
11    /// # Safety
12    /// This function is unsafe because it creates a reference to the archived
13    /// value without checking bounds
14    pub unsafe fn unchecked_peek<T: rkyv::Archive + ?Sized>(&'a self) -> &'a T::Archived {
15        rkyv::archived_root::<T>(self.as_ref())
16    }
17}
18
19impl From<AlignedVec> for RkyvStreamData<'_> {
20    #[inline]
21    fn from(v: AlignedVec) -> Self {
22        Self::Unaligned(v)
23    }
24}
25
26impl<'a> From<&'a [u8]> for RkyvStreamData<'a> {
27    #[inline]
28    fn from(v: &'a [u8]) -> Self {
29        if (v.as_ptr() as usize) % AlignedVec::ALIGNMENT != 0 {
30            let mut aligned = AlignedVec::with_capacity(v.len());
31            aligned.extend_from_slice(v);
32            Self::Unaligned(aligned)
33        } else {
34            Self::Aligned(v)
35        }
36    }
37}
38
39impl AsRef<[u8]> for RkyvStreamData<'_> {
40    #[inline]
41    fn as_ref(&self) -> &[u8] {
42        match self {
43            Self::Aligned(v) => v,
44            Self::Unaligned(v) => v.as_slice(),
45        }
46    }
47}
48
49pub struct BytesModuleStream<'a> {
50    data: RkyvStreamData<'a>,
51}
52
53impl<'a> BytesModuleStream<'a> {
54    pub fn from_slice(v: &'a [u8]) -> Self {
55        Self {
56            data: RkyvStreamData::from(v),
57        }
58    }
59
60    pub fn checkout(&self) -> &ArchivedFlatModule {
61        rkyv::check_archived_root::<FlatModule>(self.data.as_ref()).unwrap()
62    }
63
64    pub fn checkout_owned(&self) -> FlatModule {
65        let v = self.checkout();
66        let mut dmap = SharedDeserializeMap::default();
67        v.deserialize(&mut dmap).unwrap()
68    }
69}