#![forbid(unsafe_code)]
#![doc = include_str!("../README.md")]
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct CongruenceTolerance {
value: f64,
}
impl CongruenceTolerance {
#[must_use]
pub const fn new(value: f64) -> Option<Self> {
if value.is_finite() && value >= 0.0 {
Some(Self { value })
} else {
None
}
}
#[must_use]
pub const fn value(self) -> f64 {
self.value
}
#[must_use]
pub fn matches_lengths(self, left: f64, right: f64) -> bool {
(left - right).abs() <= self.value
}
}
#[cfg(test)]
mod tests {
use super::CongruenceTolerance;
#[test]
fn compares_lengths_with_tolerance() {
let tolerance = CongruenceTolerance::new(0.01).expect("valid tolerance");
assert!(tolerance.matches_lengths(3.0, 3.005));
assert!(!tolerance.matches_lengths(3.0, 3.02));
assert_eq!(CongruenceTolerance::new(-1.0), None);
}
}