use super::*;
pub struct Accessor<B, T> {
item_ptr: *mut T,
storage: PhantomData<B>,
}
impl<B: SplitByteSlice, T: FromBytes + IntoBytes + KnownLayout + Immutable>
Accessor<B, T>
{
pub fn read_from_prefix<'a>(buf: B) -> Result<(Self, B), ParseError>
where
B: 'a + IntoBufPointer<'a>,
T: 'a,
{
let len = {
let (r, _): (Ref<&[u8], T>, _) =
Ref::from_prefix(buf.as_bytes())
.map_err(|_| ParseError::TooSmall)?;
Ref::bytes(&r).len()
};
let (acc, rest) = unsafe {
let (keep, rest) = buf.split_at_unchecked(len);
(
Self {
item_ptr: keep.into_buf_ptr() as *mut _,
storage: PhantomData,
},
rest,
)
};
Ok((acc, rest))
}
}
impl<B: ByteSlice, T: FromBytes + KnownLayout + Immutable> Deref
for Accessor<B, T>
{
type Target = T;
fn deref(&self) -> &Self::Target {
unsafe { &*(self.item_ptr) }
}
}
impl<B: ByteSliceMut, T: FromBytes + KnownLayout + Immutable> DerefMut
for Accessor<B, T>
{
fn deref_mut(&mut self) -> &mut Self::Target {
unsafe { &mut (*self.item_ptr) }
}
}