Skip to content

Commit e2e8066

Browse files
committed
Migrate Bytes to u128 internally
1 parent 88d8bd8 commit e2e8066

File tree

4 files changed

+194
-51
lines changed

4 files changed

+194
-51
lines changed

src/range_macros.rs

Lines changed: 178 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44

55
// An omnibus macro that includes all simple macros.
66
macro_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

3154
macro_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

84107
macro_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

95118
macro_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

126149
macro_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.
159201
macro_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

170221
macro_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

181240
macro_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.
194253
macro_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

204271
macro_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

222304
macro_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.
243342
macro_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

254361
macro_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

265380
macro_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

277401
macro_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

288420
macro_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

Comments
 (0)