safe_arithmetic/
clamp.rs

1#[allow(clippy::module_name_repetitions)]
2pub trait ClampMin {
3    #[must_use]
4    fn clamp_min<MIN>(self, min: MIN) -> Self
5    where
6        Self: Sized,
7        MIN: Into<Self>;
8}
9
10pub trait Clamp {
11    #[must_use]
12    fn clamp<MIN, MAX>(self, min: MIN, max: MAX) -> Self
13    where
14        Self: Sized,
15        MIN: Into<Self>,
16        MAX: Into<Self>;
17}
18
19impl<T> Clamp for T
20where
21    Self: Sized + PartialOrd<Self>,
22{
23    #[inline]
24    #[must_use]
25    fn clamp<MIN, MAX>(self, min: MIN, max: MAX) -> Self
26    where
27        MIN: Into<Self>,
28        MAX: Into<Self>,
29    {
30        num::clamp(self, min.into(), max.into())
31    }
32}
33
34impl<T> ClampMin for T
35where
36    Self: Sized + PartialOrd<Self>,
37{
38    #[inline]
39    #[must_use]
40    fn clamp_min<MIN>(self, min: MIN) -> Self
41    where
42        MIN: Into<Self>,
43    {
44        num::traits::clamp_min(self, min.into())
45    }
46}
47
48#[cfg(test)]
49mod tests {
50    use super::{Clamp, ClampMin};
51    use approx::assert_abs_diff_eq;
52
53    #[test]
54    fn clamp_using_partial_ord() {
55        assert_eq!(Clamp::clamp(10u32, 5u32, 12u32), 10u32);
56        assert_eq!(Clamp::clamp(10u32, 11u32, 12u32), 11u32);
57        assert_abs_diff_eq!(Clamp::clamp(3f32, 0f32, 2f32), 2f32);
58    }
59
60    #[test]
61    fn clamp_min_using_partial_ord() {
62        assert_eq!(ClampMin::clamp_min(10u32, 5u32), 10u32);
63        assert_eq!(ClampMin::clamp_min(10u32, 11u32), 11u32);
64        assert_abs_diff_eq!(ClampMin::clamp_min(3f32, 0f32), 3f32);
65    }
66}