use std::io::{Read, Write, Result, Error, ErrorKind};
use std::mem::{zeroed, transmute, size_of, forget};
use std::slice;
pub trait Packed {
fn switch_endianness(&mut self);
}
impl Packed for bool {
fn switch_endianness(&mut self) {
}
}
impl Packed for u8 {
fn switch_endianness(&mut self) {
}
}
impl Packed for i8 {
fn switch_endianness(&mut self) {
}
}
impl Packed for u16 {
fn switch_endianness(&mut self) {
*self = u16::swap_bytes(*self);
}
}
impl Packed for i16 {
fn switch_endianness(&mut self) {
*self = i16::swap_bytes(*self);
}
}
impl Packed for u32 {
fn switch_endianness(&mut self) {
*self = u32::swap_bytes(*self);
}
}
impl Packed for i32 {
fn switch_endianness(&mut self) {
*self = i32::swap_bytes(*self);
}
}
impl Packed for u64 {
fn switch_endianness(&mut self) {
*self = u64::swap_bytes(*self);
}
}
impl Packed for i64 {
fn switch_endianness(&mut self) {
*self = i64::swap_bytes(*self);
}
}
impl Packed for f32 {
fn switch_endianness(&mut self) {
unsafe {
*self = transmute(u32::swap_bytes(transmute(*self)));
}
}
}
impl Packed for f64 {
fn switch_endianness(&mut self) {
unsafe {
*self = transmute(u64::swap_bytes(transmute(*self)));
}
}
}
impl<T> Packed for [T;1] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
}
}
impl<T> Packed for [T;2] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
}
}
impl<T> Packed for [T;3] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
}
}
impl<T> Packed for [T;4] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
}
}
impl<T> Packed for [T;5] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
}
}
impl<T> Packed for [T;6] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
}
}
impl<T> Packed for [T;7] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
}
}
impl<T> Packed for [T;8] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
}
}
impl<T> Packed for [T;9] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
}
}
impl<T> Packed for [T;10] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
}
}
impl<T> Packed for [T;11] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
}
}
impl<T> Packed for [T;12] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
}
}
impl<T> Packed for [T;13] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
}
}
impl<T> Packed for [T;14] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
}
}
impl<T> Packed for [T;15] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
}
}
impl<T> Packed for [T;16] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
}
}
impl<T> Packed for [T;17] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
}
}
impl<T> Packed for [T;18] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
}
}
impl<T> Packed for [T;19] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
}
}
impl<T> Packed for [T;20] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
}
}
impl<T> Packed for [T;21] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
}
}
impl<T> Packed for [T;22] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
}
}
impl<T> Packed for [T;23] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
}
}
impl<T> Packed for [T;24] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
}
}
impl<T> Packed for [T;25] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
}
}
impl<T> Packed for [T;26] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
}
}
impl<T> Packed for [T;27] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
self[26].switch_endianness();
}
}
impl<T> Packed for [T;28] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
self[26].switch_endianness();
self[27].switch_endianness();
}
}
impl<T> Packed for [T;29] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
self[26].switch_endianness();
self[27].switch_endianness();
self[28].switch_endianness();
}
}
impl<T> Packed for [T;30] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
self[26].switch_endianness();
self[27].switch_endianness();
self[28].switch_endianness();
self[29].switch_endianness();
}
}
impl<T> Packed for [T;31] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
self[26].switch_endianness();
self[27].switch_endianness();
self[28].switch_endianness();
self[29].switch_endianness();
self[30].switch_endianness();
}
}
impl<T> Packed for [T;32] where T: Packed {
fn switch_endianness(&mut self) {
self[0].switch_endianness();
self[1].switch_endianness();
self[2].switch_endianness();
self[3].switch_endianness();
self[4].switch_endianness();
self[5].switch_endianness();
self[6].switch_endianness();
self[7].switch_endianness();
self[8].switch_endianness();
self[9].switch_endianness();
self[10].switch_endianness();
self[11].switch_endianness();
self[12].switch_endianness();
self[13].switch_endianness();
self[14].switch_endianness();
self[15].switch_endianness();
self[16].switch_endianness();
self[17].switch_endianness();
self[18].switch_endianness();
self[19].switch_endianness();
self[20].switch_endianness();
self[21].switch_endianness();
self[22].switch_endianness();
self[23].switch_endianness();
self[24].switch_endianness();
self[25].switch_endianness();
self[26].switch_endianness();
self[27].switch_endianness();
self[28].switch_endianness();
self[29].switch_endianness();
self[30].switch_endianness();
self[31].switch_endianness();
}
}
pub trait Unpacker {
fn unpack<T: Packed>(&mut self) -> Result<T>;
fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
}
pub trait Packer {
fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
fn pack_all<T: Packed>(&mut self, buf: &[T]) -> Result<()>;
}
impl<R> Unpacker for R where R: Read {
fn unpack<T: Packed>(&mut self) -> Result<T> {
let mut res: T;
unsafe {
res = zeroed();
self.read_exact(slice::from_raw_parts_mut(transmute::<&mut T, *mut u8>(&mut res), size_of::<T>()))?;
}
return Ok(res);
}
fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize> {
unsafe {
let length = buf.len();
let capacity = buf.capacity();
let mut converted = Vec::<u8>::from_raw_parts(buf.as_mut_ptr() as *mut u8, length * size_of::<T>(), capacity * size_of::<T>());
match self.read_to_end(&mut converted) {
Ok(size) => {
if converted.len() % size_of::<T>() != 0 {
converted.truncate(length * size_of::<T>());
let new_capacity = converted.len() / size_of::<T>();
*buf = Vec::from_raw_parts(converted.as_mut_ptr() as *mut T, length, new_capacity);
forget(converted);
return Err(Error::new(
ErrorKind::UnexpectedEof,
format!("read_to_end() returned a number of bytes ({}) which is not a multiple of the size of T ({})", size, size_of::<T>())
));
}
},
Err(e) => {
converted.truncate(length * size_of::<T>());
let new_capacity = converted.len() / size_of::<T>();
*buf = Vec::from_raw_parts(converted.as_mut_ptr() as *mut T, length, new_capacity);
forget(converted);
return Err(e);
}
};
let new_length = converted.len() / size_of::<T>();
let new_capacity = converted.len() / size_of::<T>();
*buf = Vec::from_raw_parts(converted.as_mut_ptr() as *mut T, new_length, new_capacity);
forget(converted);
return Ok(new_length - length);
}
}
fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()> {
unsafe {
self.read_exact(slice::from_raw_parts_mut(buf.as_mut_ptr() as *mut u8, buf.len() * size_of::<T>()))
}
}
}
impl<W> Packer for W where W: Write {
fn pack<T: Packed>(&mut self, t: T) -> Result<()> {
unsafe {
self.write_all(slice::from_raw_parts(transmute::<&T, *const u8>(&t), size_of::<T>()))?;
}
return Ok(());
}
fn pack_all<T: Packed>(&mut self, t: &[T]) -> Result<()> {
unsafe {
self.write_all(slice::from_raw_parts(transmute::<*const T, *const u8>(t.as_ptr()), t.len() * size_of::<T>()))?;
}
return Ok(());
}
}
pub trait LEUnpacker {
fn unpack<T: Packed>(&mut self) -> Result<T>;
fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
}
pub trait LEPacker {
fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()>;
}
impl<R> LEUnpacker for R where R: Read {
fn unpack<T: Packed>(&mut self) -> Result<T> {
if cfg!(target_endian = "big") {
let mut t = Unpacker::unpack::<T>(self)?;
t.switch_endianness();
Ok(t)
}
else {
Unpacker::unpack(self)
}
}
fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize> {
if cfg!(target_endian = "big") {
let size = Unpacker::unpack_to_end(self, buf)?;
let start = buf.len() - size;
for i in start..buf.len() {
buf[i].switch_endianness();
}
Ok(size)
}
else {
Unpacker::unpack_to_end(self, buf)
}
}
fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()> {
if cfg!(target_endian = "big") {
Unpacker::unpack_exact(self, buf)?;
for i in 0..buf.len() {
buf[i].switch_endianness();
}
Ok(())
}
else {
Unpacker::unpack_exact(self, buf)
}
}
}
impl<W> LEPacker for W where W: Write {
fn pack<T: Packed>(&mut self, t: T) -> Result<()> {
if cfg!(target_endian = "big") {
let mut t_copy = t;
t_copy.switch_endianness();
Packer::pack(self, t_copy)
}
else {
Packer::pack(self, t)
}
}
fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()> {
if cfg!(target_endian = "big") {
let mut buf_copy = buf.to_vec();
for i in 0..buf_copy.len() {
buf_copy[i].switch_endianness();
}
Packer::pack_all(self, &buf_copy[..])
}
else {
Packer::pack_all(self, buf)
}
}
}
pub trait BEUnpacker {
fn unpack<T: Packed>(&mut self) -> Result<T>;
fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize>;
fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()>;
}
pub trait BEPacker {
fn pack<T: Packed>(&mut self, t: T) -> Result<()>;
fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()>;
}
impl<R> BEUnpacker for R where R: Read {
fn unpack<T: Packed>(&mut self) -> Result<T> {
if cfg!(target_endian = "big") {
let mut t = Unpacker::unpack::<T>(self)?;
t.switch_endianness();
Ok(t)
}
else {
Unpacker::unpack(self)
}
}
fn unpack_to_end<T: Packed>(&mut self, buf: &mut Vec<T>) -> Result<usize> {
if cfg!(target_endian = "big") {
let size = Unpacker::unpack_to_end(self, buf)?;
let start = buf.len() - size;
for i in start..buf.len() {
buf[i].switch_endianness();
}
Ok(size)
}
else {
Unpacker::unpack_to_end(self, buf)
}
}
fn unpack_exact<T: Packed>(&mut self, buf: &mut [T]) -> Result<()> {
if cfg!(target_endian = "big") {
Unpacker::unpack_exact(self, buf)?;
for i in 0..buf.len() {
buf[i].switch_endianness();
}
Ok(())
}
else {
Unpacker::unpack_exact(self, buf)
}
}
}
impl<W> BEPacker for W where W: Write {
fn pack<T: Packed>(&mut self, t: T) -> Result<()> {
if cfg!(target_endian = "big") {
let mut t_copy = t;
t_copy.switch_endianness();
Packer::pack(self, t_copy)
}
else {
Packer::pack(self, t)
}
}
fn pack_all<T: Packed + Clone>(&mut self, buf: &[T]) -> Result<()> {
if cfg!(target_endian = "big") {
let mut buf_copy = buf.to_vec();
for i in 0..buf_copy.len() {
buf_copy[i].switch_endianness();
}
Packer::pack_all(self, &buf_copy[..])
}
else {
Packer::pack_all(self, buf)
}
}
}