relax input conditions of fixed::checked_from_integer (#11159)

* relax input conditions of fixed::checked_from_integer

* Fix build
This commit is contained in:
Kian Paimani
2022-04-07 09:46:51 +02:00
committed by GitHub
parent 1df943cd6d
commit b438b47f1a
2 changed files with 10 additions and 8 deletions
@@ -121,7 +121,8 @@ pub trait FixedPointNumber:
/// Creates `self` from an integer number `int`.
///
/// Returns `None` if `int` exceeds accuracy.
fn checked_from_integer(int: Self::Inner) -> Option<Self> {
fn checked_from_integer<N: Into<Self::Inner>>(int: N) -> Option<Self> {
let int: Self::Inner = int.into();
int.checked_mul(&Self::DIV).map(Self::from_inner)
}
@@ -898,31 +899,32 @@ macro_rules! implement_fixed {
let accuracy = $name::accuracy();
// Case where integer fits.
let a = $name::checked_from_integer(42).expect("42 * accuracy <= inner_max; qed");
let a = $name::checked_from_integer::<$inner_type>(42)
.expect("42 * accuracy <= inner_max; qed");
assert_eq!(a.into_inner(), 42 * accuracy);
// Max integer that fit.
let a = $name::checked_from_integer(inner_max / accuracy)
let a = $name::checked_from_integer::<$inner_type>(inner_max / accuracy)
.expect("(inner_max / accuracy) * accuracy <= inner_max; qed");
assert_eq!(a.into_inner(), (inner_max / accuracy) * accuracy);
// Case where integer doesn't fit, so it returns `None`.
let a = $name::checked_from_integer(inner_max / accuracy + 1);
let a = $name::checked_from_integer::<$inner_type>(inner_max / accuracy + 1);
assert_eq!(a, None);
if $name::SIGNED {
// Case where integer fits.
let a = $name::checked_from_integer(0.saturating_sub(42))
let a = $name::checked_from_integer::<$inner_type>(0.saturating_sub(42))
.expect("-42 * accuracy >= inner_min; qed");
assert_eq!(a.into_inner(), 0 - 42 * accuracy);
// Min integer that fit.
let a = $name::checked_from_integer(inner_min / accuracy)
let a = $name::checked_from_integer::<$inner_type>(inner_min / accuracy)
.expect("(inner_min / accuracy) * accuracy <= inner_min; qed");
assert_eq!(a.into_inner(), (inner_min / accuracy) * accuracy);
// Case where integer doesn't fit, so it returns `None`.
let a = $name::checked_from_integer(inner_min / accuracy - 1);
let a = $name::checked_from_integer::<$inner_type>(inner_min / accuracy - 1);
assert_eq!(a, None);
}
}