1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
use na::base::Scalar;
use num::{
traits::{
ops::checked::{CheckedAdd, CheckedDiv, CheckedMul, CheckedNeg, CheckedRem, CheckedSub},
Num, NumAssign,
},
Integer, Signed,
};
use std::{fmt::Display, marker::Copy, str::FromStr};
macro_rules! checked_calc_impl {
($t:ty) => {
impl CheckedCalc for $t {}
};
}
macro_rules! checked_type_impl {
($t:ty) => {
impl CheckedType for $t {}
};
}
pub trait CheckedCalc:
CheckedAdd + CheckedSub + CheckedMul + CheckedDiv + CheckedRem + CheckedNeg
{
}
pub trait CheckedType:
Num + Copy + FromStr + Integer + Scalar + Signed + NumAssign + Display + Clone
{
}
checked_calc_impl!(u8);
checked_calc_impl!(u16);
checked_calc_impl!(u32);
checked_calc_impl!(u64);
checked_calc_impl!(u128);
checked_calc_impl!(usize);
checked_calc_impl!(i8);
checked_calc_impl!(i16);
checked_calc_impl!(i32);
checked_calc_impl!(i64);
checked_calc_impl!(i128);
checked_calc_impl!(isize);
checked_type_impl!(i8);
checked_type_impl!(i16);
checked_type_impl!(i32);
checked_type_impl!(i64);
checked_type_impl!(i128);
checked_type_impl!(isize);