use core::marker::PhantomData;
#[derive(Copy, Clone, Debug, PartialEq, Eq)]
pub struct Field<T> {
pub name: &'static str,
pub offset: usize,
_marker: PhantomData<T>,
}
impl<T> Field<T> {
#[inline(always)]
pub const fn new(name: &'static str, offset: usize) -> Self {
Self {
name,
offset,
_marker: PhantomData,
}
}
#[inline(always)]
pub const fn size(&self) -> usize {
core::mem::size_of::<T>()
}
#[inline(always)]
pub const fn end(&self) -> usize {
self.offset + self.size()
}
#[inline(always)]
pub fn get<'a>(&self, data: &'a [u8]) -> Option<&'a T> {
if data.len() < self.end() {
return None;
}
Some(unsafe { &*(data.as_ptr().add(self.offset) as *const T) })
}
#[inline(always)]
pub fn get_mut<'a>(&self, data: &'a mut [u8]) -> Option<&'a mut T> {
if data.len() < self.end() {
return None;
}
Some(unsafe { &mut *(data.as_mut_ptr().add(self.offset) as *mut T) })
}
#[inline(always)]
pub unsafe fn get_unchecked<'a>(&self, data: &'a [u8]) -> &'a T {
unsafe { &*(data.as_ptr().add(self.offset) as *const T) }
}
#[inline(always)]
pub unsafe fn get_mut_unchecked<'a>(&self, data: &'a mut [u8]) -> &'a mut T {
unsafe { &mut *(data.as_mut_ptr().add(self.offset) as *mut T) }
}
}