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 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}