1#[derive(Debug, Clone)]
2pub struct Clipper<T> where T: PartialOrd + Copy {
3 pub min: T,
4 pub max: T,
5}
6
7pub const fn for_i32(min: i32, max: i32) -> Clipper<i32> {
8 Clipper::<i32> { min, max, }
9}
10
11pub const fn for_i16(min: i16, max: i16) -> Clipper<i16> {
12 Clipper::<i16> { min, max, }
13}
14
15pub const fn for_f32(min: f32, max: f32) -> Clipper<f32> {
16 Clipper::<f32> { min, max, }
17}
18
19impl <T: PartialOrd + Copy> Clipper<T> {
20 pub fn clip(&self, value: T) -> T {
21 if value < self.min {
22 self.min
23 } else if self.max < value {
24 self.max
25 } else {
26 value
27 }
28 }
29}
30
31#[cfg(test)]
32mod tests {
33 use crate::clipper;
34
35 #[test]
36 fn can_i32_clipped() {
37 let clipper = clipper::for_i32(5, 10);
38 assert_eq!(clipper.clip(4), 5);
39 assert_eq!(clipper.clip(5), 5);
40 assert_eq!(clipper.clip(6), 6);
41 assert_eq!(clipper.clip(9), 9);
42 assert_eq!(clipper.clip(10), 10);
43 assert_eq!(clipper.clip(11), 10);
44 }
45
46 #[test]
47 fn can_f32_clipped() {
48 let clipper = clipper::for_f32(5f32, 10f32);
49 assert_eq!(clipper.clip(4f32), 5f32);
50 assert_eq!(clipper.clip(5f32), 5f32);
51 assert_eq!(clipper.clip(6f32), 6f32);
52 assert_eq!(clipper.clip(9f32), 9f32);
53 assert_eq!(clipper.clip(10f32), 10f32);
54 assert_eq!(clipper.clip(11f32), 10f32);
55 }
56}