Skip to main content

use_arithmetic/
divisibility.rs

1/// Returns whether `value` is evenly divisible by `divisor`.
2///
3/// This plain helper returns `false` when `divisor` is zero.
4/// Use [`checked_is_divisible_by`] when zero divisors should stay explicit.
5///
6/// # Examples
7///
8/// ```rust
9/// use use_arithmetic::is_divisible_by;
10///
11/// assert!(is_divisible_by(84, 7));
12/// assert!(!is_divisible_by(84, 0));
13/// ```
14#[must_use]
15pub const fn is_divisible_by(value: u64, divisor: u64) -> bool {
16    divisor != 0 && value.is_multiple_of(divisor)
17}
18
19/// Returns whether `value` is evenly divisible by `divisor`.
20///
21/// Returns `None` when `divisor` is zero.
22///
23/// # Examples
24///
25/// ```rust
26/// use use_arithmetic::checked_is_divisible_by;
27///
28/// assert_eq!(checked_is_divisible_by(84, 7), Some(true));
29/// assert_eq!(checked_is_divisible_by(84, 0), None);
30/// ```
31#[must_use]
32pub const fn checked_is_divisible_by(value: u64, divisor: u64) -> Option<bool> {
33    if divisor == 0 {
34        None
35    } else {
36        Some(value.is_multiple_of(divisor))
37    }
38}
39
40#[cfg(test)]
41mod tests {
42    use super::{checked_is_divisible_by, is_divisible_by};
43
44    #[test]
45    fn handles_positive_and_zero_divisors() {
46        assert!(is_divisible_by(81, 9));
47        assert!(!is_divisible_by(81, 8));
48        assert!(!is_divisible_by(81, 0));
49        assert_eq!(checked_is_divisible_by(81, 9), Some(true));
50        assert_eq!(checked_is_divisible_by(81, 8), Some(false));
51        assert_eq!(checked_is_divisible_by(81, 0), None);
52    }
53}