pub trait Endianness: private::Sealed {
fn as_string() -> &'static str {
if Self::is_le() {
"LittleEndian"
} else {
"BigEndian"
}
}
fn is_le() -> bool;
fn is_be() -> bool;
fn endianness() -> Self;
}
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BigEndian;
#[derive(Debug, Clone, Copy, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct LittleEndian;
macro_rules! impl_endianness {
($type:ty, $le:expr, $instance:expr) => {
impl Endianness for $type {
#[inline(always)]
fn is_le() -> bool {
$le
}
#[inline(always)]
fn is_be() -> bool {
!$le
}
fn endianness() -> Self {
$instance
}
}
};
}
impl_endianness!(BigEndian, false, BigEndian);
impl_endianness!(LittleEndian, true, LittleEndian);
mod private {
pub trait Sealed {}
impl Sealed for super::BigEndian {}
impl Sealed for super::LittleEndian {}
}