#![allow(clippy::module_name_repetitions)]
use crate::number::Number;
mod sealed {
pub trait Sealed {}
impl Sealed for super::BigEndian {}
impl Sealed for super::LittleEndian {}
}
pub trait Endian: self::sealed::Sealed {
#[doc(hidden)]
fn mask<T>(index: u32) -> T
where
T: Number;
#[doc(hidden)]
fn ones<T>(value: T) -> u32
where
T: Number;
#[doc(hidden)]
fn ones_rev<T>(value: T) -> u32
where
T: Number;
#[doc(hidden)]
fn zeros<T>(value: T) -> u32
where
T: Number;
#[doc(hidden)]
fn zeros_rev<T>(value: T) -> u32
where
T: Number;
}
#[non_exhaustive]
pub struct BigEndian;
impl Endian for BigEndian {
#[inline]
fn mask<T>(index: u32) -> T
where
T: Number,
{
T::BIT_RIGHT.wrapping_shl(index)
}
#[inline]
fn ones<T>(value: T) -> u32
where
T: Number,
{
value.trailing_ones()
}
#[inline]
fn ones_rev<T>(value: T) -> u32
where
T: Number,
{
value.leading_ones()
}
#[inline]
fn zeros<T>(value: T) -> u32
where
T: Number,
{
value.trailing_zeros()
}
#[inline]
fn zeros_rev<T>(value: T) -> u32
where
T: Number,
{
value.leading_zeros()
}
}
#[non_exhaustive]
pub struct LittleEndian;
impl Endian for LittleEndian {
#[inline]
fn mask<T>(index: u32) -> T
where
T: Number,
{
T::BIT_LEFT.wrapping_shr(index)
}
#[inline]
fn ones<T>(value: T) -> u32
where
T: Number,
{
value.leading_ones()
}
#[inline]
fn ones_rev<T>(value: T) -> u32
where
T: Number,
{
value.trailing_ones()
}
#[inline]
fn zeros<T>(value: T) -> u32
where
T: Number,
{
value.leading_zeros()
}
#[inline]
fn zeros_rev<T>(value: T) -> u32
where
T: Number,
{
value.trailing_ones()
}
}
pub type DefaultEndian = BigEndian;