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}