common_traits/
to.rs

1/// Primitive cast between types using `as`
2pub trait To<T> {
3    fn to(self) -> T;
4}
5
6/// blanket implementation to ensure reflexive `To` is the identity function
7impl<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}