scotch_guest/
encoded.rs

1use crate::MemoryType;
2use bincode::{config::standard, error::DecodeError, Decode, Encode};
3use core::{marker::PhantomData, slice::from_raw_parts};
4
5#[repr(transparent)]
6#[doc(hidden)]
7pub struct EncodedPtr<T: Encode + Decode> {
8    offset: MemoryType,
9    _ty: PhantomData<T>,
10}
11
12impl<T: Encode + Decode> EncodedPtr<T> {
13    /// # Safety
14    /// Pointer is managed by scotch_host and was not created by other means.
15    #[inline]
16    pub unsafe fn read(&self) -> Result<T, DecodeError> {
17        let mut size = [0, 0];
18        (self.offset as *const u8).copy_to_nonoverlapping(&mut size as _, 2);
19
20        let len = u16::from_le_bytes(size) as usize;
21        bincode::decode_from_slice(from_raw_parts((self.offset + 2) as _, len), standard())
22            .map(|(a, _)| a)
23    }
24}