#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ByteOrder {
LittleEndian,
BigEndian,
}
impl ByteOrder {
#[must_use]
pub fn u16(self, b: [u8; 2]) -> u16 {
match self {
ByteOrder::LittleEndian => u16::from_le_bytes(b),
ByteOrder::BigEndian => u16::from_be_bytes(b),
}
}
#[must_use]
pub fn u32(self, b: [u8; 4]) -> u32 {
match self {
ByteOrder::LittleEndian => u32::from_le_bytes(b),
ByteOrder::BigEndian => u32::from_be_bytes(b),
}
}
#[cfg(feature = "bigtiff")]
#[must_use]
pub fn u64(self, b: [u8; 8]) -> u64 {
match self {
ByteOrder::LittleEndian => u64::from_le_bytes(b),
ByteOrder::BigEndian => u64::from_be_bytes(b),
}
}
#[must_use]
pub fn pack_u16(self, v: u16) -> [u8; 2] {
match self {
ByteOrder::LittleEndian => v.to_le_bytes(),
ByteOrder::BigEndian => v.to_be_bytes(),
}
}
#[must_use]
pub fn pack_u32(self, v: u32) -> [u8; 4] {
match self {
ByteOrder::LittleEndian => v.to_le_bytes(),
ByteOrder::BigEndian => v.to_be_bytes(),
}
}
#[cfg(feature = "bigtiff")]
#[must_use]
pub fn pack_u64(self, v: u64) -> [u8; 8] {
match self {
ByteOrder::LittleEndian => v.to_le_bytes(),
ByteOrder::BigEndian => v.to_be_bytes(),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn byte_order_roundtrips_integers() {
for order in [ByteOrder::LittleEndian, ByteOrder::BigEndian] {
assert_eq!(order.u16(order.pack_u16(0xABCD)), 0xABCD);
assert_eq!(order.u32(order.pack_u32(0x0123_4567)), 0x0123_4567);
#[cfg(feature = "bigtiff")]
assert_eq!(
order.u64(order.pack_u64(0x0123_4567_89AB_CDEF)),
0x0123_4567_89AB_CDEF
);
}
assert_eq!(ByteOrder::LittleEndian.pack_u16(0x00FF), [0xFF, 0x00]);
assert_eq!(ByteOrder::BigEndian.pack_u16(0x00FF), [0x00, 0xFF]);
#[cfg(feature = "bigtiff")]
{
assert_eq!(
ByteOrder::LittleEndian.pack_u64(0xFF),
[0xFF, 0, 0, 0, 0, 0, 0, 0]
);
assert_eq!(
ByteOrder::BigEndian.pack_u64(0xFF),
[0, 0, 0, 0, 0, 0, 0, 0xFF]
);
}
}
}