polars_utils/
float.rs

1/// # Safety
2/// unsafe code downstream relies on the correct is_float call
3pub unsafe trait IsFloat: private::Sealed + Sized {
4    fn is_float() -> bool {
5        false
6    }
7
8    fn is_f32() -> bool {
9        false
10    }
11
12    fn is_f64() -> bool {
13        false
14    }
15
16    fn nan_value() -> Self {
17        unimplemented!()
18    }
19
20    #[allow(clippy::wrong_self_convention)]
21    fn is_nan(&self) -> bool
22    where
23        Self: Sized,
24    {
25        false
26    }
27    #[allow(clippy::wrong_self_convention)]
28    fn is_finite(&self) -> bool
29    where
30        Self: Sized,
31    {
32        true
33    }
34}
35
36unsafe impl IsFloat for i8 {}
37unsafe impl IsFloat for i16 {}
38unsafe impl IsFloat for i32 {}
39unsafe impl IsFloat for i64 {}
40unsafe impl IsFloat for i128 {}
41unsafe impl IsFloat for u8 {}
42unsafe impl IsFloat for u16 {}
43unsafe impl IsFloat for u32 {}
44unsafe impl IsFloat for u64 {}
45unsafe impl IsFloat for &str {}
46unsafe impl IsFloat for &[u8] {}
47unsafe impl IsFloat for bool {}
48unsafe impl<T: IsFloat> IsFloat for Option<T> {}
49
50mod private {
51    pub trait Sealed {}
52    impl Sealed for i8 {}
53    impl Sealed for i16 {}
54    impl Sealed for i32 {}
55    impl Sealed for i64 {}
56    impl Sealed for i128 {}
57    impl Sealed for u8 {}
58    impl Sealed for u16 {}
59    impl Sealed for u32 {}
60    impl Sealed for u64 {}
61    impl Sealed for f32 {}
62    impl Sealed for f64 {}
63    impl Sealed for &str {}
64    impl Sealed for &[u8] {}
65    impl Sealed for bool {}
66    impl<T: Sealed> Sealed for Option<T> {}
67}
68
69macro_rules! impl_is_float {
70    ($tp:ty, $is_f32:literal, $is_f64:literal) => {
71        unsafe impl IsFloat for $tp {
72            #[inline]
73            fn is_float() -> bool {
74                true
75            }
76
77            fn is_f32() -> bool {
78                $is_f32
79            }
80
81            fn is_f64() -> bool {
82                $is_f64
83            }
84
85            fn nan_value() -> Self {
86                Self::NAN
87            }
88
89            #[inline]
90            fn is_nan(&self) -> bool {
91                <$tp>::is_nan(*self)
92            }
93
94            #[inline]
95            fn is_finite(&self) -> bool {
96                <$tp>::is_finite(*self)
97            }
98        }
99    };
100}
101
102impl_is_float!(f32, true, false);
103impl_is_float!(f64, false, true);