pub trait ByteSliceExt {
fn read_at<D: AsMut<[u8]> + ?Sized>(&self, offset: usize, destination: &mut D) -> usize;
}
pub trait ByteSliceMutExt {
fn write_at<S: AsRef<[u8]> + ?Sized>(&mut self, offset: usize, src: &S) -> usize;
fn memset(&mut self, value: u8);
}
#[inline]
fn slice_read_at(source: &[u8], offset: usize, destination: &mut [u8]) -> usize {
if offset > source.len() {
0
} else {
let len = core::cmp::min(destination.len(), source.len() - offset);
destination[0..len].copy_from_slice(&source[offset..][..len]);
len
}
}
#[inline]
fn slice_write_at(destination: &mut [u8], offset: usize, source: &[u8]) -> usize {
if offset > destination.len() {
0
} else {
let len = std::cmp::min(source.len(), destination.len() - offset);
destination[offset..offset + len].copy_from_slice(&source[0..len]);
len
}
}
#[inline]
fn slice_memset(destination: &mut [u8], value: u8) {
for b in destination.iter_mut() {
*b = value;
}
}
impl<T: AsRef<[u8]> + ?Sized> ByteSliceExt for T {
#[inline]
fn read_at<D: AsMut<[u8]> + ?Sized>(&self, offset: usize, destination: &mut D) -> usize {
slice_read_at(self.as_ref(), offset, destination.as_mut())
}
}
impl<T: AsMut<[u8]> + ?Sized> ByteSliceMutExt for T {
#[inline]
fn write_at<S: AsRef<[u8]> + ?Sized>(&mut self, offset: usize, src: &S) -> usize {
slice_write_at(self.as_mut(), offset, src.as_ref())
}
#[inline]
fn memset(&mut self, value: u8) {
slice_memset(self.as_mut(), value)
}
}