44
55// An omnibus macro that includes all simple macros.
66macro_rules! range {
7- ( $( #[ $comment: meta] ) ? $T: ident, $display_name: expr) => {
7+ ( $( #[ $comment: meta] ) ? $T: ident, u64 , $display_name: expr) => {
88 $(
99 #[ $comment]
1010 ) ?
@@ -14,25 +14,48 @@ macro_rules! range {
1414 checked_add!( $T) ;
1515 debug_macro!( $T) ;
1616 display!( $T, $display_name) ;
17- serde_macro!( $T) ;
17+ serde_macro!( $T, u64 ) ;
1818 sum!( $T) ;
1919 add!( $T) ;
2020 add_assign!( $T) ;
2121 sub!( $T) ;
2222 sub_assign!( $T) ;
23- mul!( $T) ;
24- div!( $T) ;
25- rem!( $T) ;
26- deref!( $T) ;
27- from!( $T) ;
23+ mul!( $T, u64 ) ;
24+ div!( $T, u64 ) ;
25+ rem!( $T, u64 ) ;
26+ deref!( $T, u64 ) ;
27+ from!( $T, u64 ) ;
28+ } ;
29+ ( $( #[ $comment: meta] ) ? $T: ident, u128 , $display_name: expr) => {
30+ $(
31+ #[ $comment]
32+ ) ?
33+ #[ derive( Clone , Copy , Default , Eq , Ord , PartialEq , PartialOrd ) ]
34+ /// A type for $T
35+ pub struct $T( pub u128 ) ;
36+
37+ checked_add!( $T) ;
38+ debug_macro!( $T) ;
39+ display!( $T, $display_name) ;
40+ serde_macro!( $T, u128 ) ;
41+ sum!( $T) ;
42+ add!( $T) ;
43+ add_assign!( $T) ;
44+ sub!( $T) ;
45+ sub_assign!( $T) ;
46+ mul!( $T, u128 ) ;
47+ div!( $T, u128 ) ;
48+ rem!( $T, u128 ) ;
49+ deref!( $T, u128 ) ;
50+ from!( $T, u128 ) ;
2851 } ;
2952}
3053
3154macro_rules! self_div {
32- ( $T: ident) => {
55+ ( $T: ident, $inner : ty ) => {
3356 impl Div <$T> for $T {
34- type Output = u64 ;
35- fn div( self , rhs: $T) -> u64 {
57+ type Output = $inner ;
58+ fn div( self , rhs: $T) -> $inner {
3659 self . 0 / * rhs
3760 }
3861 }
@@ -82,20 +105,20 @@ macro_rules! sub_assign {
82105}
83106
84107macro_rules! deref {
85- ( $T: ident) => {
108+ ( $T: ident, $inner : ty ) => {
86109 impl Deref for $T {
87- type Target = u64 ;
88- fn deref( & self ) -> & u64 {
110+ type Target = $inner ;
111+ fn deref( & self ) -> & $inner {
89112 & self . 0
90113 }
91114 }
92115 } ;
93116}
94117
95118macro_rules! from {
96- ( $T: ident) => {
97- impl From <u64 > for $T {
98- fn from( t: u64 ) -> $T {
119+ ( $T: ident, $inner : ty ) => {
120+ impl From <$inner > for $T {
121+ fn from( t: $inner ) -> $T {
99122 $T( t)
100123 }
101124 }
@@ -124,7 +147,7 @@ macro_rules! display {
124147}
125148
126149macro_rules! serde_macro {
127- ( $T: ident) => {
150+ ( $T: ident, u64 ) => {
128151 impl serde:: Serialize for $T {
129152 fn serialize<S >( & self , serializer: S ) -> Result <S :: Ok , S :: Error >
130153 where
@@ -134,6 +157,25 @@ macro_rules! serde_macro {
134157 }
135158 }
136159
160+ impl <' de> serde:: Deserialize <' de> for $T {
161+ fn deserialize<D >( deserializer: D ) -> Result <$T, D :: Error >
162+ where
163+ D : serde:: de:: Deserializer <' de>,
164+ {
165+ Ok ( $T( serde:: Deserialize :: deserialize( deserializer) ?) )
166+ }
167+ }
168+ } ;
169+ ( $T: ident, u128 ) => {
170+ impl serde:: Serialize for $T {
171+ fn serialize<S >( & self , serializer: S ) -> Result <S :: Ok , S :: Error >
172+ where
173+ S : serde:: Serializer ,
174+ {
175+ serializer. serialize_u128( * * self )
176+ }
177+ }
178+
137179 impl <' de> serde:: Deserialize <' de> for $T {
138180 fn deserialize<D >( deserializer: D ) -> Result <$T, D :: Error >
139181 where
@@ -157,52 +199,77 @@ macro_rules! sum {
157199
158200// Define a complete set of division operations.
159201macro_rules! div {
160- ( $T: ident) => {
161- unsigned_div!( u64 , $T) ;
162- unsigned_div!( u32 , $T) ;
163- unsigned_div!( u16 , $T) ;
164- unsigned_div!( u8 , $T) ;
165- usize_div!( $T) ;
166- self_div!( $T) ;
202+ ( $T: ident, u64 ) => {
203+ unsigned_div!( u64 , $T, u64 ) ;
204+ unsigned_div!( u32 , $T, u64 ) ;
205+ unsigned_div!( u16 , $T, u64 ) ;
206+ unsigned_div!( u8 , $T, u64 ) ;
207+ usize_div!( $T, u64 ) ;
208+ self_div!( $T, u64 ) ;
209+ } ;
210+ ( $T: ident, u128 ) => {
211+ unsigned_div!( u128 , $T, u128 ) ;
212+ unsigned_div!( u64 , $T, u128 ) ;
213+ unsigned_div!( u32 , $T, u128 ) ;
214+ unsigned_div!( u16 , $T, u128 ) ;
215+ unsigned_div!( u8 , $T, u128 ) ;
216+ usize_div!( $T, u128 ) ;
217+ self_div!( $T, u128 ) ;
167218 } ;
168219}
169220
170221macro_rules! unsigned_div {
171- ( $t: ty, $T: ident) => {
222+ ( $t: ty, $T: ident, u64 ) => {
172223 impl Div <$t> for $T {
173224 type Output = $T;
174225 fn div( self , rhs: $t) -> $T {
175226 $T( self . 0 / u64 :: from( rhs) )
176227 }
177228 }
178229 } ;
230+ ( $t: ty, $T: ident, u128 ) => {
231+ impl Div <$t> for $T {
232+ type Output = $T;
233+ fn div( self , rhs: $t) -> $T {
234+ $T( self . 0 / u128 :: from( rhs) )
235+ }
236+ }
237+ } ;
179238}
180239
181240macro_rules! usize_div {
182- ( $T: ident) => {
241+ ( $T: ident, $inner : ty ) => {
183242 impl Div <usize > for $T {
184243 type Output = $T;
185244 fn div( self , rhs: usize ) -> $T {
186245 #[ allow( clippy:: cast_lossless) ]
187- $T( self . 0 / rhs as u64 )
246+ $T( self . 0 / rhs as $inner )
188247 }
189248 }
190249 } ;
191250}
192251
193252// Define a complete set of multiplication operations.
194253macro_rules! mul {
195- ( $T: ident) => {
196- unsigned_mul!( u64 , $T) ;
197- unsigned_mul!( u32 , $T) ;
198- unsigned_mul!( u16 , $T) ;
199- unsigned_mul!( u8 , $T) ;
200- usize_mul!( $T) ;
254+ ( $T: ident, u64 ) => {
255+ unsigned_mul!( u64 , $T, u64 ) ;
256+ unsigned_mul!( u32 , $T, u64 ) ;
257+ unsigned_mul!( u16 , $T, u64 ) ;
258+ unsigned_mul!( u8 , $T, u64 ) ;
259+ usize_mul!( $T, u64 ) ;
260+ } ;
261+ ( $T: ident, u128 ) => {
262+ unsigned_mul!( u128 , $T, u128 ) ;
263+ unsigned_mul!( u64 , $T, u128 ) ;
264+ unsigned_mul!( u32 , $T, u128 ) ;
265+ unsigned_mul!( u16 , $T, u128 ) ;
266+ unsigned_mul!( u8 , $T, u128 ) ;
267+ usize_mul!( $T, u128 ) ;
201268 } ;
202269}
203270
204271macro_rules! unsigned_mul {
205- ( $t: ty, $T: ident) => {
272+ ( $t: ty, $T: ident, u64 ) => {
206273 impl Mul <$t> for $T {
207274 type Output = $T;
208275 fn mul( self , rhs: $t) -> $T {
@@ -217,10 +284,25 @@ macro_rules! unsigned_mul {
217284 }
218285 }
219286 } ;
287+ ( $t: ty, $T: ident, u128 ) => {
288+ impl Mul <$t> for $T {
289+ type Output = $T;
290+ fn mul( self , rhs: $t) -> $T {
291+ $T( self . 0 * u128 :: from( rhs) )
292+ }
293+ }
294+
295+ impl Mul <$T> for $t {
296+ type Output = $T;
297+ fn mul( self , rhs: $T) -> $T {
298+ $T( u128 :: from( self ) * rhs. 0 )
299+ }
300+ }
301+ } ;
220302}
221303
222304macro_rules! usize_mul {
223- ( $T: ident) => {
305+ ( $T: ident, u64 ) => {
224306 impl Mul <usize > for $T {
225307 type Output = $T;
226308 fn mul( self , rhs: usize ) -> $T {
@@ -237,33 +319,66 @@ macro_rules! usize_mul {
237319 }
238320 }
239321 } ;
322+ ( $T: ident, u128 ) => {
323+ impl Mul <usize > for $T {
324+ type Output = $T;
325+ fn mul( self , rhs: usize ) -> $T {
326+ #[ allow( clippy:: cast_lossless) ]
327+ $T( self . 0 * rhs as u128 )
328+ }
329+ }
330+
331+ impl Mul <$T> for usize {
332+ type Output = $T;
333+ fn mul( self , rhs: $T) -> $T {
334+ #[ allow( clippy:: cast_lossless) ]
335+ $T( self as u128 * rhs. 0 )
336+ }
337+ }
338+ } ;
240339}
241340
242341// Define a complete set of remainder operations.
243342macro_rules! rem {
244- ( $T: ident) => {
245- unsigned_rem!( u64 , $T) ;
246- unsigned_rem!( u32 , $T) ;
247- unsigned_rem!( u16 , $T) ;
248- unsigned_rem!( u8 , $T) ;
249- usize_rem!( $T) ;
250- self_rem!( $T) ;
343+ ( $T: ident, u64 ) => {
344+ unsigned_rem!( u64 , $T, u64 ) ;
345+ unsigned_rem!( u32 , $T, u64 ) ;
346+ unsigned_rem!( u16 , $T, u64 ) ;
347+ unsigned_rem!( u8 , $T, u64 ) ;
348+ usize_rem!( $T, u64 ) ;
349+ self_rem!( $T, u64 ) ;
350+ } ;
351+ ( $T: ident, u128 ) => {
352+ unsigned_rem!( u64 , $T, u128 ) ;
353+ unsigned_rem!( u32 , $T, u128 ) ;
354+ unsigned_rem!( u16 , $T, u128 ) ;
355+ unsigned_rem!( u8 , $T, u128 ) ;
356+ usize_rem!( $T, u128 ) ;
357+ self_rem!( $T, u128 ) ;
251358 } ;
252359}
253360
254361macro_rules! unsigned_rem {
255- ( $t: ty, $T: ident) => {
362+ ( $t: ty, $T: ident, u64 ) => {
256363 impl Rem <$t> for $T {
257364 type Output = $T;
258365 fn rem( self , rhs: $t) -> $T {
259366 $T( self . 0 % u64 :: from( rhs) )
260367 }
261368 }
262369 } ;
370+ ( $t: ty, $T: ident, u128 ) => {
371+ impl Rem <$t> for $T {
372+ type Output = $T;
373+ fn rem( self , rhs: $t) -> $T {
374+ $T( self . 0 % u128 :: from( rhs) )
375+ }
376+ }
377+ } ;
263378}
264379
265380macro_rules! usize_rem {
266- ( $T: ident) => {
381+ ( $T: ident, u64 ) => {
267382 impl Rem <usize > for $T {
268383 type Output = $T;
269384 fn rem( self , rhs: usize ) -> $T {
@@ -272,17 +387,34 @@ macro_rules! usize_rem {
272387 }
273388 }
274389 } ;
390+ ( $T: ident, u128 ) => {
391+ impl Rem <usize > for $T {
392+ type Output = $T;
393+ fn rem( self , rhs: usize ) -> $T {
394+ #[ allow( clippy:: cast_lossless) ]
395+ $T( self . 0 % rhs as u128 )
396+ }
397+ }
398+ } ;
275399}
276400
277401macro_rules! self_rem {
278- ( $T: ident) => {
402+ ( $T: ident, u64 ) => {
279403 impl Rem <$T> for $T {
280404 type Output = $T;
281405 fn rem( self , rhs: $T) -> $T {
282406 $T( self . 0 % u64 :: from( rhs. 0 ) )
283407 }
284408 }
285409 } ;
410+ ( $T: ident, u128 ) => {
411+ impl Rem <$T> for $T {
412+ type Output = $T;
413+ fn rem( self , rhs: $T) -> $T {
414+ $T( self . 0 % u128 :: from( rhs. 0 ) )
415+ }
416+ }
417+ } ;
286418}
287419
288420macro_rules! checked_add {
@@ -306,7 +438,7 @@ mod tests {
306438 u64,
307439 } ;
308440
309- range ! ( Units , "units" ) ;
441+ range ! ( Units , u64 , "units" ) ;
310442
311443 #[ test]
312444 /// Test implicit derivations for Units
0 commit comments