use std::borrow::Cow;
use std::{mem, slice};
#[inline]
pub fn bytes_of_mut<T: 'static + Copy>(elem: &mut T) -> &mut [u8] {
let slice = slice::from_mut(elem);
let new_len = mem::size_of_val(slice);
unsafe { slice::from_raw_parts_mut(slice.as_ptr() as *mut u8, new_len) }
}
#[inline]
pub fn cow_struct<T: 'static + Copy + Default>(bytes: &[u8]) -> Option<Cow<T>> {
if bytes.len() != mem::size_of::<T>() {
None
} else if (bytes.as_ptr() as usize) % mem::align_of::<T>() != 0 {
let mut elem = T::default();
bytes_of_mut(&mut elem).copy_from_slice(bytes);
Some(Cow::Owned(elem))
} else {
Some(Cow::Borrowed(unsafe { &*(bytes.as_ptr() as *const T) }))
}
}