| use core::{ptr, mem}; |
| |
| macro_rules! write_slice { |
| ($src:expr, $dst:expr, $ty:ty, $size:expr, $which:ident) => ({ |
| assert!($size == mem::size_of::<$ty>()); |
| assert_eq!($dst.len(), $size*$src.len()); |
| unsafe { |
| ptr::copy_nonoverlapping( |
| $src.as_ptr() as *const u8, |
| $dst.as_mut_ptr(), |
| $dst.len()); |
| let tmp: &mut [$ty] = mem::transmute($dst); |
| for v in tmp[..$src.len()].iter_mut() { |
| *v = v.$which(); |
| } |
| } |
| }); |
| } |
| |
| /// Write a vector of u32s into a vector of bytes. The values are written in |
| /// little-endian format. |
| #[inline] |
| pub fn write_u32v_le(dst: &mut [u8], src: &[u32]) { |
| write_slice!(src, dst, u32, 4, to_le); |
| } |
| |
| /// Write a vector of u32s into a vector of bytes. The values are written in |
| /// big-endian format. |
| #[inline] |
| pub fn write_u32v_be(dst: &mut [u8], src: &[u32]) { |
| write_slice!(src, dst, u32, 4, to_be); |
| } |
| |
| /// Write a vector of u64s into a vector of bytes. The values are written in |
| /// little-endian format. |
| #[inline] |
| pub fn write_u64v_le(dst: &mut [u8], src: &[u64]) { |
| write_slice!(src, dst, u64, 8, to_le); |
| } |
| |
| /// Write a vector of u64s into a vector of bytes. The values are written in |
| /// little-endian format. |
| #[inline] |
| pub fn write_u64v_be(dst: &mut [u8], src: &[u64]) { |
| write_slice!(src, dst, u64, 8, to_be); |
| } |