use num_traits::PrimInt;
#[allow(private_bounds)]
pub trait Endian: Sealed + Copy {
fn to_register_endian<T: PrimInt>(value: T) -> T;
fn from_register_endian<T: PrimInt>(value: T) -> T;
fn address_order_to_significance(address_order: usize, num_subwords: usize) -> usize;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BigEndian;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct LittleEndian;
trait Sealed {}
impl Sealed for BigEndian {}
impl Sealed for LittleEndian {}
impl Endian for BigEndian {
fn to_register_endian<T: PrimInt>(value: T) -> T {
value.to_be()
}
fn from_register_endian<T: PrimInt>(value: T) -> T {
T::from_be(value)
}
fn address_order_to_significance(address_order: usize, num_subwords: usize) -> usize {
num_subwords - 1 - address_order
}
}
impl Endian for LittleEndian {
fn to_register_endian<T: PrimInt>(value: T) -> T {
value.to_le()
}
fn from_register_endian<T: PrimInt>(value: T) -> T {
T::from_le(value)
}
fn address_order_to_significance(address_order: usize, _num_subwords: usize) -> usize {
address_order
}
}