use core::marker::PhantomData;
use core::mem::{size_of, size_of_val};
use crate::buf::Padder;
use crate::traits::ZeroCopy;
pub struct BufMut<'a> {
start: *mut u8,
_marker: PhantomData<&'a [u8]>,
}
impl<'a> BufMut<'a> {
#[inline]
pub(crate) fn new(start: *mut u8) -> Self {
Self {
start,
_marker: PhantomData,
}
}
}
impl<'a> BufMut<'a> {
#[inline]
pub unsafe fn store_unsized_slice<T>(&mut self, values: &[T])
where
T: ZeroCopy,
{
self.start
.copy_from_nonoverlapping(values.as_ptr().cast(), size_of_val(values));
if T::PADDED {
let mut padder = Padder::new(self.start);
for _ in 0..values.len() {
T::pad(&mut padder);
}
padder.remaining_with(size_of_val(values));
}
self.start = self.start.wrapping_add(size_of_val(values));
}
#[inline]
pub(crate) unsafe fn store_unaligned<T>(&mut self, value: *const T)
where
T: ZeroCopy,
{
self.start
.copy_from_nonoverlapping(value.cast(), size_of::<T>());
let end = self.start.wrapping_add(size_of::<T>());
if T::PADDED {
let mut padder = Padder::new(self.start);
T::pad(&mut padder);
padder.remaining();
}
self.start = end;
}
}