polars_utils/
abs_diff.rs

1use num_traits::Num;
2
3pub trait AbsDiff {
4    type Abs: Num + PartialOrd + Copy + std::fmt::Debug + Send + Sync;
5
6    fn max_abs_diff() -> Self::Abs;
7    fn abs_diff(self, other: Self) -> Self::Abs;
8}
9
10macro_rules! impl_trivial_abs_diff {
11    ($T: ty, $max: expr) => {
12        impl AbsDiff for $T {
13            type Abs = $T;
14
15            fn max_abs_diff() -> Self::Abs {
16                $max
17            }
18
19            fn abs_diff(self, other: Self) -> Self::Abs {
20                if self > other {
21                    self - other
22                } else {
23                    other - self
24                }
25            }
26        }
27    };
28}
29
30macro_rules! impl_signed_abs_diff {
31    ($T: ty, $U: ty) => {
32        impl AbsDiff for $T {
33            type Abs = $U;
34
35            fn max_abs_diff() -> Self::Abs {
36                <$U>::MAX
37            }
38
39            fn abs_diff(self, other: Self) -> Self::Abs {
40                self.abs_diff(other)
41            }
42        }
43    };
44}
45
46impl_trivial_abs_diff!(u8, u8::MAX);
47impl_trivial_abs_diff!(u16, u16::MAX);
48impl_trivial_abs_diff!(u32, u32::MAX);
49impl_trivial_abs_diff!(u64, u64::MAX);
50impl_trivial_abs_diff!(u128, u128::MAX);
51impl_trivial_abs_diff!(usize, usize::MAX);
52impl_trivial_abs_diff!(f32, f32::INFINITY);
53impl_trivial_abs_diff!(f64, f64::INFINITY);
54impl_signed_abs_diff!(i8, u8);
55impl_signed_abs_diff!(i16, u16);
56impl_signed_abs_diff!(i32, u32);
57impl_signed_abs_diff!(i64, u64);
58impl_signed_abs_diff!(i128, u128);
59impl_signed_abs_diff!(isize, usize);