use crate::wuint;
pub(crate) fn check_divisibility_and_divide_by_pow10(n: &mut u32) -> bool {
const N: u32 = 2;
debug_assert!(*n <= crate::compute_power32::<{ N + 1 }>(10));
struct Info;
impl Info {
const MAGIC_NUMBER: u32 = 656;
const SHIFT_AMOUNT: i32 = 16;
}
let prod = *n * Info::MAGIC_NUMBER;
const MASK: u32 = (1 << Info::SHIFT_AMOUNT) - 1;
let result = (prod & MASK) < Info::MAGIC_NUMBER;
*n = prod >> Info::SHIFT_AMOUNT;
result
}
pub(crate) fn divide_by_pow10<const N: u32, const N_MAX: u64>(n: u64) -> u64 {
if N == 1 && N_MAX <= 4611686018427387908 {
return wuint::umul128_upper64(n, 1844674407370955162);
}
if N == 3 && N_MAX <= 15534100272597517998 {
return wuint::umul128_upper64(n, 4722366482869645214) >> 8;
}
let divisor = const { crate::compute_power64::<N>(10) };
n / divisor
}