1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#![no_std]

use core::mem;

pub unsafe trait Mappable: core::marker::Sized {
    fn mapped(data: &[u8]) -> Option<(&Self, &[u8])> {
        if data.len() < mem::size_of::<Self>() {
            None
        } else {
            Some((
                unsafe { &*(data.as_ptr() as *const _) },
                &data[mem::size_of::<Self>()..],
            ))
        }
    }

    fn mapped_mut(data: &mut [u8]) -> Option<(&mut Self, &mut [u8])> {
        if data.len() < mem::size_of::<Self>() {
            None
        } else {
            Some((
                unsafe { &mut *(data.as_mut_ptr() as *mut _) },
                &mut data[mem::size_of::<Self>()..],
            ))
        }
    }

    fn as_bytes(&self) -> &[u8] {
        unsafe {
            ::core::slice::from_raw_parts(
                (self as *const _) as *const u8,
                ::core::mem::size_of::<Self>(),
            )
        }
    }
}