number_as/
lib.rs

1/*!
2# Number As
3
4**Use** the trait `NumberAs` in the current scope to let all primitive number types have a `number_as` method.
5
6```rust
7use number_as::NumberAs;
8
9let a: i32 = 2u16.number_as();
10
11assert_eq!(2i32, a);
12
13assert_eq!(2i32, 2u16.number_as());
14
15assert_eq!(20i32, 20.6.number_as());
16```
17
18All implements for the `NumberAs` trait can be considered as a whole **Primitive Number**. If you want to design an **add** function, which accepts all kinds of primitive numbers,
19you can use the `Number` trait as a trait bound.
20
21```rust
22use number_as::{Number, NumberAs};
23
24fn add<T, J, K>(a: T, b: J) -> K where T: Number, J: Number, K: Number, i128: NumberAs<K> {
25    let a: i128 = a.number_as();
26    let b: i128 = b.number_as();
27
28    let c = a + b;
29
30    c.number_as()
31}
32
33assert_eq!(40i32, add(5u8, 35i16));
34```
35*/
36
37#![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);