glycin_utils/
safe_math.rs1use crate::error::DimensionTooLargerError;
2
3pub trait SafeConversion:
4 TryInto<usize> + TryInto<i32> + TryInto<u32> + TryInto<i64> + TryInto<u64>
5{
6 fn try_usize(self) -> Result<usize, DimensionTooLargerError> {
7 self.try_into().map_err(|_| DimensionTooLargerError)
8 }
9
10 fn try_i32(self) -> Result<i32, DimensionTooLargerError> {
11 self.try_into().map_err(|_| DimensionTooLargerError)
12 }
13
14 fn try_u32(self) -> Result<u32, DimensionTooLargerError> {
15 self.try_into().map_err(|_| DimensionTooLargerError)
16 }
17
18 fn try_i64(self) -> Result<i64, DimensionTooLargerError> {
19 self.try_into().map_err(|_| DimensionTooLargerError)
20 }
21
22 fn try_u64(self) -> Result<u64, DimensionTooLargerError> {
23 self.try_into().map_err(|_| DimensionTooLargerError)
24 }
25}
26
27impl SafeConversion for usize {}
28impl SafeConversion for u32 {}
29impl SafeConversion for i32 {}
30impl SafeConversion for u64 {}
31
32pub trait SafeMath: Sized {
33 fn smul(self, rhs: Self) -> Result<Self, DimensionTooLargerError>;
34 fn sadd(self, rhs: Self) -> Result<Self, DimensionTooLargerError>;
35 fn srem(self, rhs: Self) -> Result<Self, DimensionTooLargerError>;
36}
37
38impl SafeMath for usize {
39 fn smul(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
40 self.checked_mul(rhs).ok_or(DimensionTooLargerError)
41 }
42
43 fn sadd(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
44 self.checked_add(rhs).ok_or(DimensionTooLargerError)
45 }
46
47 fn srem(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
48 self.checked_rem(rhs).ok_or(DimensionTooLargerError)
49 }
50}
51
52impl SafeMath for u32 {
53 fn smul(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
54 self.checked_mul(rhs).ok_or(DimensionTooLargerError)
55 }
56
57 fn sadd(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
58 self.checked_add(rhs).ok_or(DimensionTooLargerError)
59 }
60
61 fn srem(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
62 self.checked_add(rhs).ok_or(DimensionTooLargerError)
63 }
64}
65
66impl SafeMath for u64 {
67 fn smul(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
68 self.checked_mul(rhs).ok_or(DimensionTooLargerError)
69 }
70
71 fn sadd(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
72 self.checked_add(rhs).ok_or(DimensionTooLargerError)
73 }
74
75 fn srem(self, rhs: Self) -> Result<Self, DimensionTooLargerError> {
76 self.checked_add(rhs).ok_or(DimensionTooLargerError)
77 }
78}