Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-utils/src/abs_diff.rs
8382 views
1
use num_traits::Num;
2
3
use crate::float16::pf16;
4
5
pub trait AbsDiff {
6
type Abs: Num + PartialOrd + Copy + std::fmt::Debug + Send + Sync;
7
8
fn max_abs_diff() -> Self::Abs;
9
fn abs_diff(self, other: Self) -> Self::Abs;
10
}
11
12
macro_rules! impl_trivial_abs_diff {
13
($T: ty, $max: expr) => {
14
impl AbsDiff for $T {
15
type Abs = $T;
16
17
fn max_abs_diff() -> Self::Abs {
18
$max
19
}
20
21
fn abs_diff(self, other: Self) -> Self::Abs {
22
if self > other {
23
self - other
24
} else {
25
other - self
26
}
27
}
28
}
29
};
30
}
31
32
macro_rules! impl_signed_abs_diff {
33
($T: ty, $U: ty) => {
34
impl AbsDiff for $T {
35
type Abs = $U;
36
37
fn max_abs_diff() -> Self::Abs {
38
<$U>::MAX
39
}
40
41
fn abs_diff(self, other: Self) -> Self::Abs {
42
self.abs_diff(other)
43
}
44
}
45
};
46
}
47
48
impl_trivial_abs_diff!(u8, u8::MAX);
49
impl_trivial_abs_diff!(u16, u16::MAX);
50
impl_trivial_abs_diff!(u32, u32::MAX);
51
impl_trivial_abs_diff!(u64, u64::MAX);
52
impl_trivial_abs_diff!(u128, u128::MAX);
53
impl_trivial_abs_diff!(usize, usize::MAX);
54
impl_trivial_abs_diff!(pf16, pf16::INFINITY);
55
impl_trivial_abs_diff!(f32, f32::INFINITY);
56
impl_trivial_abs_diff!(f64, f64::INFINITY);
57
impl_signed_abs_diff!(i8, u8);
58
impl_signed_abs_diff!(i16, u16);
59
impl_signed_abs_diff!(i32, u32);
60
impl_signed_abs_diff!(i64, u64);
61
impl_signed_abs_diff!(i128, u128);
62
impl_signed_abs_diff!(isize, usize);
63
64