Skip to main content

fructose/
cast.rs

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}