use std::mem::{size_of};
use std::ptr::{write_bytes};
use std::slice::{from_raw_parts, from_raw_parts_mut};
pub trait SliceExt {
fn as_bytes(&self) -> &[u8];
fn as_mut_bytes(&mut self) -> &mut [u8];
fn zero(&mut self);
}
macro_rules! implement {
($ty:ty) => {
impl SliceExt for [$ty] {
fn as_bytes(&self) -> &[u8] {
unsafe { from_raw_parts(self.as_ptr() as *const u8, self.len() * size_of::<$ty>()) }
}
fn as_mut_bytes(&mut self) -> &mut [u8] {
unsafe { from_raw_parts_mut(self.as_mut_ptr() as *mut u8, self.len() * size_of::<$ty>()) }
}
fn zero(&mut self) {
unsafe { write_bytes(self.as_mut_ptr(), 0, self.len() * size_of::<$ty>()) }
}
}
}
}
implement!(i8);
implement!(u8);
implement!(i16);
implement!(u16);
implement!(i32);
implement!(u32);
implement!(i64);
implement!(u64);
implement!(isize);
implement!(usize);