1pub trait To<T> {
3 fn to(self) -> T;
4}
5
6impl<T> To<T> for T {
8 #[inline(always)]
9 fn to(self) -> Self {
10 self
11 }
12}
13
14macro_rules! impl_to {
15 ($ty1:ty, $($ty:ty,)*) => {
16$(
17 impl To<$ty> for $ty1 {
18 #[inline(always)]
19 fn to(self) -> $ty {
20 self as $ty
21 }
22 }
23 impl To<$ty1> for $ty {
24 #[inline(always)]
25 fn to(self) -> $ty1 {
26 self as $ty1
27 }
28 }
29)*
30
31impl_to!($($ty,)*);
32
33};
34 () => {};
35}
36
37impl_to!(u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, f32, f64, usize, isize,);
38
39#[cfg(feature = "half")]
40mod half_impl {
41 use super::*;
42
43 macro_rules! impl_to_half {
44 ($ty1:ty, $($ty:ty,)*) => {
45
46 impl To<half::f16> for $ty1 {
47 #[inline(always)]
48 fn to(self) -> half::f16 {
49 (self as f32).to()
50 }
51 }
52 impl To<half::bf16> for $ty1 {
53 #[inline(always)]
54 fn to(self) -> half::bf16 {
55 (self as f32).to()
56 }
57 }
58 impl To<$ty1> for half::f16 {
59 #[inline(always)]
60 fn to(self) -> $ty1 {
61 self.to_f32().to()
62 }
63 }
64 impl To<$ty1> for half::bf16 {
65 #[inline(always)]
66 fn to(self) -> $ty1 {
67 self.to_f32().to()
68 }
69 }
70
71 impl_to_half!($($ty,)*);
72 };
73 () => {};
74 }
75
76 impl_to_half!(u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, usize, isize,);
77
78 impl To<half::f16> for f32 {
79 #[inline(always)]
80 fn to(self) -> half::f16 {
81 half::f16::from_f32(self)
82 }
83 }
84 impl To<half::bf16> for f32 {
85 #[inline(always)]
86 fn to(self) -> half::bf16 {
87 half::bf16::from_f32(self)
88 }
89 }
90 impl To<half::f16> for f64 {
91 #[inline(always)]
92 fn to(self) -> half::f16 {
93 half::f16::from_f64(self)
94 }
95 }
96 impl To<half::bf16> for f64 {
97 #[inline(always)]
98 fn to(self) -> half::bf16 {
99 half::bf16::from_f64(self)
100 }
101 }
102 impl To<f32> for half::f16 {
103 #[inline(always)]
104 fn to(self) -> f32 {
105 self.to_f32()
106 }
107 }
108 impl To<f32> for half::bf16 {
109 #[inline(always)]
110 fn to(self) -> f32 {
111 self.to_f32()
112 }
113 }
114 impl To<f64> for half::f16 {
115 #[inline(always)]
116 fn to(self) -> f64 {
117 self.to_f64()
118 }
119 }
120 impl To<f64> for half::bf16 {
121 #[inline(always)]
122 fn to(self) -> f64 {
123 self.to_f64()
124 }
125 }
126}