Skip to main content

glycin_utils/
safe_math.rs

1use 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}