use crate::{protocol::Endianness, Signature};
pub unsafe trait Frame {
const SIGNATURE: &'static Signature;
fn adjust(&mut self, endianness: Endianness);
}
unsafe impl Frame for u8 {
const SIGNATURE: &'static Signature = Signature::BYTE;
#[inline]
fn adjust(&mut self, _: Endianness) {}
}
unsafe impl Frame for f64 {
const SIGNATURE: &'static Signature = Signature::DOUBLE;
#[inline]
fn adjust(&mut self, endianness: Endianness) {
if endianness != Endianness::NATIVE {
*self = f64::from_bits(u64::swap_bytes(self.to_bits()));
}
}
}
macro_rules! impl_number {
($($ty:ty, $signature:ident),* $(,)?) => {
$(
unsafe impl Frame for $ty {
const SIGNATURE: &'static Signature = Signature::$signature;
#[inline]
fn adjust(&mut self, endianness: Endianness) {
if endianness != Endianness::NATIVE {
*self = <$ty>::swap_bytes(*self);
}
}
}
)*
}
}
impl_number!(i16, INT16, i32, INT32, i64, INT64);
impl_number!(u16, UINT16, u32, UINT32, u64, UINT64);