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