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}