use crate::num::arithmetic::traits::UnsignedAbs;
use crate::num::basic::signeds::PrimitiveSigned;
use crate::num::basic::unsigneds::PrimitiveUnsigned;
use crate::num::logic::traits::{LeadingZeros, SignificantBits};
fn significant_bits_unsigned<T: PrimitiveUnsigned>(x: T) -> u64 {
T::WIDTH - LeadingZeros::leading_zeros(x)
}
macro_rules! impl_significant_bits_unsigned {
($t:ident) => {
impl SignificantBits for $t {
#[inline]
fn significant_bits(self) -> u64 {
significant_bits_unsigned(self)
}
}
};
}
apply_to_unsigneds!(impl_significant_bits_unsigned);
fn significant_bits_signed<U: PrimitiveUnsigned, S: PrimitiveSigned + UnsignedAbs<Output = U>>(
x: S,
) -> u64 {
x.unsigned_abs().significant_bits()
}
macro_rules! impl_significant_bits_signed {
($u:ident, $s:ident) => {
impl SignificantBits for $s {
#[inline]
fn significant_bits(self) -> u64 {
significant_bits_signed(self)
}
}
};
}
apply_to_unsigned_signed_pairs!(impl_significant_bits_signed);