use crate::bint::intrinsics::{MAX_POWER_10, _U128};
impl _U128 {
pub(super) const POWERS_10: [_U128; MAX_POWER_10 as usize + 1] = make_power_10();
pub(super) const MAX_REDUCED_BY_POWERS_10: [_U128; MAX_POWER_10 as usize + 1] =
make_max_reduced_by_powers_10();
}
const fn make_power_10() -> [_U128; MAX_POWER_10 as usize + 1] {
let mut result = [_U128::ZERO; MAX_POWER_10 as usize + 1];
let mut i = 0;
while i <= MAX_POWER_10 as usize {
result[i] = from_u128(POWERS_10[i]);
i += 1;
}
result
}
const fn make_max_reduced_by_powers_10() -> [_U128; MAX_POWER_10 as usize + 1] {
let mut result = [_U128::ZERO; MAX_POWER_10 as usize + 1];
let mut i = 0;
while i <= MAX_POWER_10 as usize {
result[i] = from_u128(u128::MAX / POWERS_10[i]);
i += 1;
}
result
}
#[inline(always)]
const fn from_u128(v: u128) -> _U128 {
_U128 {
low: (v & 0x0000_0000_0000_0000_FFFF_FFFF_FFFF_FFFF) as u64,
high: (v >> 64) as u64,
}
}
const POWERS_10: [u128; MAX_POWER_10 as usize + 1] = [
1,
10,
100,
1000,
10000,
100000,
1000000,
10000000,
100000000,
1000000000,
10000000000,
100000000000,
1000000000000,
10000000000000,
100000000000000,
1000000000000000,
10000000000000000,
100000000000000000,
1000000000000000000,
10000000000000000000,
100000000000000000000,
1000000000000000000000,
10000000000000000000000,
100000000000000000000000,
1000000000000000000000000,
10000000000000000000000000,
100000000000000000000000000,
1000000000000000000000000000,
10000000000000000000000000000,
100000000000000000000000000000,
1000000000000000000000000000000,
10000000000000000000000000000000,
100000000000000000000000000000000,
1000000000000000000000000000000000,
10000000000000000000000000000000000,
100000000000000000000000000000000000,
1000000000000000000000000000000000000,
10000000000000000000000000000000000000,
100000000000000000000000000000000000000,
];