no_alloc 0.1.0

Embedded friendly pointer types for applications without heap allocators
Documentation
use core::mem;

#[repr(C)]
#[derive(Copy, Clone)]
pub(crate) struct FatPointer {
    pub(crate) data: *mut (),
    pub(crate) meta: usize,
}

impl FatPointer {
    pub(crate) fn from_raw<T: ?Sized>(raw: *mut T) -> Option<Self> {
        if mem::size_of::<*mut T>() == mem::size_of::<Self>() {
            unsafe { Some(*mem::transmute::<&*mut T, &Self>(&raw)) }
        } else {
            None
        }
    }
}

#[cfg(test)]
mod test {
    use super::*;

    use core::any::Any;

    #[test]
    fn smoke() {
        assert!(FatPointer::from_raw::<i32>(&mut 0).is_none());
        assert!(FatPointer::from_raw::<[i32]>(&mut [0][..]).is_some());
        assert!(FatPointer::from_raw::<dyn Any>(&mut 0).is_some());
    }
}