pub struct Helpers<const L_NOM: u64, const L_DENOM: u64, const R_NOM: u64, const R_DENOM: u64>;
impl<const L_NOM: u64, const L_DENOM: u64, const R_NOM: u64, const R_DENOM: u64>
Helpers<L_NOM, L_DENOM, R_NOM, R_DENOM>
{
const DIVISOR_U128: u128 = gcd::binary_u128(
L_DENOM as u128 * R_NOM as u128,
R_DENOM as u128 * L_NOM as u128,
);
const DIVISOR_2_U128: u128 = gcd::binary_u128(
L_NOM as u128 * R_NOM as u128,
R_DENOM as u128 * L_DENOM as u128,
);
const RD_TIMES_LN_U128: u128 = (R_DENOM as u128 * L_NOM as u128) / Self::DIVISOR_U128;
const LD_TIMES_RN_U128: u128 = (L_DENOM as u128 * R_NOM as u128) / Self::DIVISOR_U128;
const LN_TIMES_RN_U128: u128 = (L_NOM as u128 * R_NOM as u128) / Self::DIVISOR_2_U128;
const RD_TIMES_LD_U128: u128 = (R_DENOM as u128 * L_DENOM as u128) / Self::DIVISOR_2_U128;
const RATE_TO_DURATION_NUMERATOR_U128: u128 = Self::RD_TIMES_LD_U128 / Self::LN_TIMES_RN_U128;
pub const RD_TIMES_LN: u64 = {
assert!(
Self::RD_TIMES_LN_U128 <= u64::MAX as u128,
"RD_TIMES_LN overflows u64 - NOM/DENOM values too large"
);
Self::RD_TIMES_LN_U128 as u64
};
pub const LD_TIMES_RN: u64 = {
assert!(
Self::LD_TIMES_RN_U128 <= u64::MAX as u128,
"LD_TIMES_RN overflows u64 - NOM/DENOM values too large"
);
Self::LD_TIMES_RN_U128 as u64
};
pub const RATE_TO_DURATION_NUMERATOR: u64 = {
assert!(
Self::RATE_TO_DURATION_NUMERATOR_U128 <= u64::MAX as u128,
"RATE_TO_DURATION_NUMERATOR overflows u64 - NOM/DENOM values too large"
);
Self::RATE_TO_DURATION_NUMERATOR_U128 as u64
};
pub const SAME_BASE: bool = Self::LD_TIMES_RN == Self::RD_TIMES_LN;
}
#[inline]
pub const fn div_round_nearest_u64(numerator: u64, divisor: u64) -> u64 {
let q = numerator / divisor;
let r = numerator % divisor;
if r >= divisor - r {
q + 1
} else {
q
}
}