1use std::convert::TryFrom;
2
3pub trait CastInts:
4 TryFrom<usize>
5 + TryFrom<isize>
6 + TryFrom<u8>
7 + TryFrom<i8>
8 + TryFrom<u16>
9 + TryFrom<i16>
10 + TryFrom<u32>
11 + TryFrom<i32>
12 + TryFrom<u64>
13 + TryFrom<i64>
14 + TryFrom<u128>
15 + TryFrom<i128>
16{
17}
18
19impl<T> CastInts for T where
20 T: TryFrom<usize>
21 + TryFrom<isize>
22 + TryFrom<u8>
23 + TryFrom<i8>
24 + TryFrom<u16>
25 + TryFrom<i16>
26 + TryFrom<u32>
27 + TryFrom<i32>
28 + TryFrom<u64>
29 + TryFrom<i64>
30 + TryFrom<u128>
31 + TryFrom<i128>
32{
33}
34
35pub trait FromU32 {
36 fn from_u32(num: u32) -> Self;
37}
38
39pub trait FromI32 {
40 fn from_i32(num: i32) -> Self;
41}
42
43pub trait FromF32 {
44 fn from_f32(num: f32) -> Self;
45}
46
47macro_rules! impl_from {
48 ($($unsigned:ty:$signed:ty $(:$float:ty)?);* $(;)?) => {
49 $(
50 impl FromU32 for $unsigned {
51 #[inline]
52 fn from_u32(num: u32) -> Self {
53 num as Self
54 }
55 }
56 impl FromI32 for $unsigned {
57 #[inline]
58 fn from_i32(num: i32) -> Self {
59 num.abs() as Self
60 }
61 }
62 impl FromU32 for $signed {
63 #[inline]
64 fn from_u32(num: u32) -> Self {
65 num as Self
66 }
67 }
68 impl FromI32 for $signed {
69 #[inline]
70 fn from_i32(num: i32) -> Self {
71 num as Self
72 }
73 }
74 $(
75 impl FromU32 for $float {
76 #[inline]
77 fn from_u32(num: u32) -> Self {
78 num as Self
79 }
80 }
81 impl FromI32 for $float {
82 #[inline]
83 fn from_i32(num: i32) -> Self {
84 num as Self
85 }
86 }
87
88 impl FromF32 for $float {
89 #[inline]
90 fn from_f32(num: f32) -> Self {
91 num as Self
92 }
93 }
94 )?
95 )*
96 }
97}
98
99impl_from! {
100 usize:isize;
101 u8:i8;
102 u16:i16;
103 u32:i32:f32;
104 u64:i64:f64;
105 u128:i128;
106}