@@ -56,115 +56,37 @@ pub trait MinNumTraits: Sized + Copy {
56
56
fn checked_sub ( self , v : Self ) -> Option < Self > ;
57
57
}
58
58
59
- impl MinNumTraits for i64 {
60
- fn from_u32 ( n : u32 ) -> Option < i64 > {
61
- Some ( n. into ( ) )
62
- }
63
-
64
- fn zero ( ) -> Self {
65
- 0
66
- }
67
-
68
- fn checked_mul ( self , v : i64 ) -> Option < i64 > {
69
- i64:: checked_mul ( self , v)
70
- }
71
-
72
- fn checked_add ( self , v : i64 ) -> Option < i64 > {
73
- i64:: checked_add ( self , v)
74
- }
75
-
76
- fn checked_sub ( self , v : i64 ) -> Option < i64 > {
77
- i64:: checked_sub ( self , v)
78
- }
79
- }
80
-
81
- impl MinNumTraits for u64 {
82
- fn from_u32 ( n : u32 ) -> Option < u64 > {
83
- Some ( n. into ( ) )
84
- }
85
-
86
- fn zero ( ) -> Self {
87
- 0
88
- }
89
-
90
- fn checked_mul ( self , v : u64 ) -> Option < u64 > {
91
- u64:: checked_mul ( self , v)
92
- }
93
-
94
- fn checked_add ( self , v : u64 ) -> Option < u64 > {
95
- u64:: checked_add ( self , v)
96
- }
97
-
98
- fn checked_sub ( self , v : u64 ) -> Option < u64 > {
99
- u64:: checked_sub ( self , v)
100
- }
101
- }
102
-
103
- impl MinNumTraits for usize {
104
- fn from_u32 ( n : u32 ) -> Option < usize > {
105
- n. try_into ( ) . ok ( )
106
- }
107
-
108
- fn zero ( ) -> Self {
109
- 0
110
- }
111
-
112
- fn checked_mul ( self , v : usize ) -> Option < usize > {
113
- usize:: checked_mul ( self , v)
114
- }
115
-
116
- fn checked_add ( self , v : usize ) -> Option < usize > {
117
- usize:: checked_add ( self , v)
118
- }
119
-
120
- fn checked_sub ( self , v : usize ) -> Option < usize > {
121
- usize:: checked_sub ( self , v)
122
- }
123
- }
124
-
125
- impl MinNumTraits for i32 {
126
- fn from_u32 ( n : u32 ) -> Option < Self > {
127
- n. try_into ( ) . ok ( )
128
- }
59
+ macro_rules! min_num_traits {
60
+ ( $t : ty, from_u32 => $from_u32 : expr) => {
61
+ impl MinNumTraits for $t {
62
+ fn from_u32( n: u32 ) -> Option <$t> {
63
+ $from_u32( n)
64
+ }
129
65
130
- fn zero ( ) -> Self {
131
- 0
132
- }
66
+ fn zero( ) -> Self {
67
+ 0
68
+ }
133
69
134
- fn checked_mul ( self , v : i32 ) -> Option < i32 > {
135
- i32 :: checked_mul ( self , v)
136
- }
70
+ fn checked_mul( self , v: $t ) -> Option <$t > {
71
+ <$t> :: checked_mul( self , v)
72
+ }
137
73
138
- fn checked_add ( self , v : i32 ) -> Option < i32 > {
139
- i32 :: checked_add ( self , v)
140
- }
74
+ fn checked_add( self , v: $t ) -> Option <$t > {
75
+ <$t> :: checked_add( self , v)
76
+ }
141
77
142
- fn checked_sub ( self , v : i32 ) -> Option < i32 > {
143
- i32:: checked_sub ( self , v)
144
- }
78
+ fn checked_sub( self , v: $t) -> Option <$t> {
79
+ <$t>:: checked_sub( self , v)
80
+ }
81
+ }
82
+ } ;
145
83
}
146
84
147
- impl MinNumTraits for u8 {
148
- fn from_u32 ( n : u32 ) -> Option < Self > {
149
- n. try_into ( ) . ok ( )
150
- }
151
-
152
- fn zero ( ) -> Self {
153
- 0
154
- }
155
-
156
- fn checked_mul ( self , v : u8 ) -> Option < u8 > {
157
- u8:: checked_mul ( self , v)
158
- }
159
-
160
- fn checked_add ( self , v : u8 ) -> Option < u8 > {
161
- u8:: checked_add ( self , v)
162
- }
163
-
164
- fn checked_sub ( self , v : u8 ) -> Option < u8 > {
165
- u8:: checked_sub ( self , v)
166
- }
167
- }
85
+ min_num_traits ! ( i32 , from_u32 => |n: u32 | n. try_into( ) . ok( ) ) ;
86
+ min_num_traits ! ( i64 , from_u32 => |n: u32 | Some ( n. into( ) ) ) ;
87
+ min_num_traits ! ( u64 , from_u32 => |n: u32 | Some ( n. into( ) ) ) ;
88
+ min_num_traits ! ( u8 , from_u32 => |n: u32 | n. try_into( ) . ok( ) ) ;
89
+ min_num_traits ! ( usize , from_u32 => |n: u32 | n. try_into( ) . ok( ) ) ;
168
90
169
91
/// Converts a byte slice to an integer. Signs are not allowed.
170
92
///
0 commit comments