Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
pola-rs
GitHub Repository: pola-rs/polars
Path: blob/main/crates/polars-utils/src/float.rs
8398 views
1
use crate::float16::pf16;
2
3
/// # Safety
4
/// Unsafe code downstream relies on the correct is_float call.
5
pub unsafe trait IsFloat: private::Sealed + Sized {
6
#[inline]
7
fn is_float() -> bool {
8
false
9
}
10
11
#[inline]
12
fn is_f16() -> bool {
13
false
14
}
15
16
#[inline]
17
fn is_f32() -> bool {
18
false
19
}
20
21
#[inline]
22
fn is_f64() -> bool {
23
false
24
}
25
26
fn nan_value() -> Self {
27
unimplemented!()
28
}
29
30
fn pos_inf_value() -> Self {
31
unimplemented!()
32
}
33
34
fn neg_inf_value() -> Self {
35
unimplemented!()
36
}
37
38
#[allow(clippy::wrong_self_convention)]
39
#[inline]
40
fn is_nan(&self) -> bool
41
where
42
Self: Sized,
43
{
44
false
45
}
46
#[allow(clippy::wrong_self_convention)]
47
#[inline]
48
fn is_finite(&self) -> bool
49
where
50
Self: Sized,
51
{
52
true
53
}
54
}
55
56
unsafe impl IsFloat for i8 {}
57
unsafe impl IsFloat for i16 {}
58
unsafe impl IsFloat for i32 {}
59
unsafe impl IsFloat for i64 {}
60
unsafe impl IsFloat for i128 {}
61
unsafe impl IsFloat for u8 {}
62
unsafe impl IsFloat for u16 {}
63
unsafe impl IsFloat for u32 {}
64
unsafe impl IsFloat for u64 {}
65
unsafe impl IsFloat for u128 {}
66
unsafe impl IsFloat for usize {}
67
unsafe impl IsFloat for &str {}
68
unsafe impl IsFloat for &[u8] {}
69
unsafe impl IsFloat for bool {}
70
unsafe impl<T: IsFloat> IsFloat for Option<T> {}
71
72
mod private {
73
use super::*;
74
75
pub trait Sealed {}
76
impl Sealed for i8 {}
77
impl Sealed for i16 {}
78
impl Sealed for i32 {}
79
impl Sealed for i64 {}
80
impl Sealed for i128 {}
81
impl Sealed for u8 {}
82
impl Sealed for u16 {}
83
impl Sealed for u32 {}
84
impl Sealed for u64 {}
85
impl Sealed for u128 {}
86
impl Sealed for usize {}
87
impl Sealed for pf16 {}
88
impl Sealed for f32 {}
89
impl Sealed for f64 {}
90
impl Sealed for &str {}
91
impl Sealed for &[u8] {}
92
impl Sealed for bool {}
93
impl<T: Sealed> Sealed for Option<T> {}
94
}
95
96
macro_rules! impl_is_float {
97
($tp:ty, $is_f16:literal, $is_f32:literal, $is_f64:literal) => {
98
unsafe impl IsFloat for $tp {
99
#[inline]
100
fn is_float() -> bool {
101
true
102
}
103
104
#[inline]
105
fn is_f16() -> bool {
106
$is_f16
107
}
108
109
#[inline]
110
fn is_f32() -> bool {
111
$is_f32
112
}
113
114
#[inline]
115
fn is_f64() -> bool {
116
$is_f64
117
}
118
119
#[inline]
120
fn nan_value() -> Self {
121
Self::NAN
122
}
123
124
#[inline]
125
fn pos_inf_value() -> Self {
126
Self::INFINITY
127
}
128
129
#[inline]
130
fn neg_inf_value() -> Self {
131
Self::NEG_INFINITY
132
}
133
134
#[inline]
135
fn is_nan(&self) -> bool {
136
<$tp>::is_nan(*self)
137
}
138
139
#[inline]
140
fn is_finite(&self) -> bool {
141
<$tp>::is_finite(*self)
142
}
143
}
144
};
145
}
146
147
impl_is_float!(pf16, true, false, false);
148
impl_is_float!(f32, false, true, false);
149
impl_is_float!(f64, false, false, true);
150
151