1use crate::float16::pf16;
2
3pub 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
56unsafe impl IsFloat for i8 {}
57unsafe impl IsFloat for i16 {}
58unsafe impl IsFloat for i32 {}
59unsafe impl IsFloat for i64 {}
60unsafe impl IsFloat for i128 {}
61unsafe impl IsFloat for u8 {}
62unsafe impl IsFloat for u16 {}
63unsafe impl IsFloat for u32 {}
64unsafe impl IsFloat for u64 {}
65unsafe impl IsFloat for u128 {}
66unsafe impl IsFloat for usize {}
67unsafe impl IsFloat for &str {}
68unsafe impl IsFloat for &[u8] {}
69unsafe impl IsFloat for bool {}
70unsafe impl<T: IsFloat> IsFloat for Option<T> {}
71
72mod 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
96macro_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
147impl_is_float!(pf16, true, false, false);
148impl_is_float!(f32, false, true, false);
149impl_is_float!(f64, false, false, true);