1pub 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);