1#![no_std]
38
39pub trait NumberAs<T>: Sized {
40 fn number_as(self) -> T;
41}
42
43macro_rules! number_as_impl {
44 ($from:ty, $to:ty) => {
45 impl NumberAs<$to> for $from {
46 fn number_as(self) -> $to {
47 self as $to
48 }
49 }
50 };
51}
52
53macro_rules! number_as_batch {
54 ($from:ty) => {
55 number_as_impl!($from, u8);
56 number_as_impl!($from, u16);
57 number_as_impl!($from, u32);
58 number_as_impl!($from, u64);
59 number_as_impl!($from, u128);
60 number_as_impl!($from, usize);
61 number_as_impl!($from, i8);
62 number_as_impl!($from, i16);
63 number_as_impl!($from, i32);
64 number_as_impl!($from, i64);
65 number_as_impl!($from, i128);
66 number_as_impl!($from, isize);
67 number_as_impl!($from, f32);
68 number_as_impl!($from, f64);
69 };
70}
71
72number_as_batch!(u8);
73number_as_batch!(u16);
74number_as_batch!(u32);
75number_as_batch!(u64);
76number_as_batch!(u128);
77number_as_batch!(usize);
78
79number_as_batch!(i8);
80number_as_batch!(i16);
81number_as_batch!(i32);
82number_as_batch!(i64);
83number_as_batch!(i128);
84number_as_batch!(isize);
85
86number_as_batch!(f32);
87number_as_batch!(f64);
88
89pub trait Number:
90 NumberAs<u8>
91 + NumberAs<u16>
92 + NumberAs<u32>
93 + NumberAs<u64>
94 + NumberAs<u128>
95 + NumberAs<usize>
96 + NumberAs<i8>
97 + NumberAs<i16>
98 + NumberAs<i32>
99 + NumberAs<i64>
100 + NumberAs<i128>
101 + NumberAs<isize>
102 + NumberAs<f32>
103 + NumberAs<f64> {
104}
105
106macro_rules! number_impl {
107 ($t:ty) => {
108 impl Number for $t {}
109 };
110}
111
112number_impl!(u8);
113number_impl!(u16);
114number_impl!(u32);
115number_impl!(u64);
116number_impl!(u128);
117number_impl!(usize);
118
119number_impl!(i8);
120number_impl!(i16);
121number_impl!(i32);
122number_impl!(i64);
123number_impl!(i128);
124number_impl!(isize);
125
126number_impl!(f32);
127number_impl!(f64);