diff --git a/src/lib.rs b/src/lib.rs index 9ec36ad..b281c9b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -69,15 +69,13 @@ pub fn mem_fibonacci(n: usize) -> Option { /// Can calculate up to 186 using native unsigned 128 bit integers. #[inline] pub fn rec_fibonacci(n: usize) -> Option { - match n { - 0 => Some(0), - 1 => Some(1), - n => { - let a = rec_fibonacci(n - 1)?; - let b = rec_fibonacci(n - 2)?; + if matches!(n, 0 | 1) { + Some(n as u128) + } else { + let a = rec_fibonacci(n - 1)?; + let b = rec_fibonacci(n - 2)?; - a.checked_add(b) - } + a.checked_add(b) } } @@ -101,19 +99,17 @@ pub fn fibonacci(n: usize) -> Option { let mut a: u128 = 0; let mut b: u128 = 1; - match n { - 0 => Some(a), - 1 => Some(b), - _ => { - for _ in 0..n - 1 { - let c: u128 = a.checked_add(b)?; + if matches!(n, 0 | 1) { + Some(n as u128) + } else { + for _ in 0..n - 1 { + let c: u128 = a.checked_add(b)?; - a = b; - b = c; - } - - Some(b) + a = b; + b = c; } + + Some(b) } } @@ -135,15 +131,14 @@ pub fn fibonacci(n: usize) -> Option { pub fn it_factorial(n: usize) -> Option { let mut total: u128 = 1; - match n { - 0 | 1 => Some(1u128), - _ => { - for x in 1..=n { - total = total.checked_mul(x as u128)?; - } - - Some(total) + if matches!(n, 0 | 1) { + Some(1u128) + } else { + for x in 1..=n { + total = total.checked_mul(x as u128)?; } + + Some(total) } } @@ -163,14 +158,12 @@ pub fn it_factorial(n: usize) -> Option { /// ``` #[inline] pub fn factorial(n: usize) -> Option { - match n { - 0 => Some(1u128), - 1 => Some(1u128), - _ => { - let prev = factorial(n - 1)?; + if matches!(n, 0 | 1) { + Some(1u128) + } else { + let prev = factorial(n - 1)?; - (n as u128).checked_mul(prev) - } + (n as u128).checked_mul(prev) } } @@ -240,6 +233,13 @@ mod tests { assert!(it_factorial(35).is_none()); } + #[test] + fn test_approx_factorial() { + assert!(approx_factorial(170.624).is_some()); + assert!(approx_factorial(1.0).is_some()); + assert!(approx_factorial(170.7).is_none()); + } + #[test] fn test_fibonacci() { // Sanity checking diff --git a/src/num.rs b/src/num.rs index ff3aeab..1408486 100644 --- a/src/num.rs +++ b/src/num.rs @@ -151,6 +151,7 @@ macro_rules! impl_int { self == 0 } + #[cfg_attr(tarpaulin, skip)] fn max_value() -> $type { <$type>::max_value() } @@ -243,6 +244,7 @@ macro_rules! impl_unsigned { let (x, y) = (min(x, y), max(x, y)); Self::stein_gcd((y - x) >> 1, x) } + #[cfg_attr(tarpaulin, skip)] _ => unreachable!(), } } diff --git a/src/rational.rs b/src/rational.rs index 1083990..ca9bcaa 100644 --- a/src/rational.rs +++ b/src/rational.rs @@ -328,23 +328,38 @@ mod tests { #[test] #[should_panic(expected = "Fraction can not have a zero denominator")] fn zero_denom_new() { - frac!(1/0); + frac!(1 / 0); } #[test] fn test_get_sign() { - assert_eq!(Sign::Positive, Frac::get_sign(frac!(1), frac!(-1), FracOp::Subtraction)); - assert_eq!(Sign::Negative, Frac::get_sign(frac!(-1), frac!(-1), FracOp::Addition)); - assert_eq!(Sign::Negative, Frac::get_sign(frac!(-1), frac!(1), FracOp::Addition)); - assert_eq!(Sign::Negative, Frac::get_sign(frac!(-1), frac!(1), FracOp::Subtraction)); - assert_eq!(Sign::Negative, Frac::get_sign(frac!(-1), frac!(1), FracOp::Other)); + assert_eq!( + Sign::Positive, + Frac::get_sign(frac!(1), frac!(-1), FracOp::Subtraction) + ); + assert_eq!( + Sign::Negative, + Frac::get_sign(frac!(-1), frac!(-1), FracOp::Addition) + ); + assert_eq!( + Sign::Negative, + Frac::get_sign(frac!(-1), frac!(1), FracOp::Addition) + ); + assert_eq!( + Sign::Negative, + Frac::get_sign(frac!(-1), frac!(1), FracOp::Subtraction) + ); + assert_eq!( + Sign::Negative, + Frac::get_sign(frac!(-1), frac!(1), FracOp::Other) + ); } #[test] fn test_cmp() { - assert_eq!(Ordering::Greater, frac!(3/4).cmp(&frac!(1/4))); - assert_eq!(Ordering::Less, frac!(1/4).cmp(&frac!(3/4))); - assert_eq!(Ordering::Equal, frac!(1/2).cmp(&frac!(4/8))); + assert_eq!(Ordering::Greater, frac!(3 / 4).cmp(&frac!(1 / 4))); + assert_eq!(Ordering::Less, frac!(1 / 4).cmp(&frac!(3 / 4))); + assert_eq!(Ordering::Equal, frac!(1 / 2).cmp(&frac!(4 / 8))); } #[test]