Skip to content

Commit f1980ab

Browse files
Alenarsfauvel
authored andcommitted
Add Rem arithmetic operation on BlockNumber
1 parent ed96f8f commit f1980ab

File tree

2 files changed

+120
-1
lines changed

2 files changed

+120
-1
lines changed

mithril-common/src/entities/block_number.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use serde::{Deserialize, Serialize};
55

66
use crate::entities::wrapper_helpers::{
77
impl_add_to_wrapper, impl_div_to_wrapper, impl_mul_to_wrapper, impl_partial_eq_to_wrapper,
8-
impl_sub_to_wrapper,
8+
impl_rem_to_wrapper, impl_sub_to_wrapper,
99
};
1010
use crate::signable_builder::Beacon;
1111

@@ -41,6 +41,7 @@ impl_add_to_wrapper!(BlockNumber, u64);
4141
impl_sub_to_wrapper!(BlockNumber, u64);
4242
impl_mul_to_wrapper!(BlockNumber, u64);
4343
impl_div_to_wrapper!(BlockNumber, u64);
44+
impl_rem_to_wrapper!(BlockNumber, u64);
4445
impl_partial_eq_to_wrapper!(BlockNumber, u64);
4546

4647
#[cfg(test)]
@@ -152,6 +153,26 @@ mod tests {
152153
test_op_assign!(18_u64, /=, &BlockNumber(3) => 6_u64);
153154
}
154155

156+
#[test]
157+
#[allow(clippy::op_ref)]
158+
fn test_rem() {
159+
assert_eq!(BlockNumber(3), BlockNumber(18) % BlockNumber(5));
160+
assert_eq!(BlockNumber(3), BlockNumber(18) % 5_u64);
161+
assert_eq!(BlockNumber(3), BlockNumber(18) % &5_u64);
162+
163+
assert_eq!(BlockNumber(6), 20_u64 % BlockNumber(7));
164+
assert_eq!(BlockNumber(6), 20_u64 % &BlockNumber(7));
165+
assert_eq!(BlockNumber(6), &20_u64 % BlockNumber(7));
166+
assert_eq!(BlockNumber(6), &20_u64 % &BlockNumber(7));
167+
168+
test_op_assign!(BlockNumber(18), %=, BlockNumber(5) => BlockNumber(3));
169+
test_op_assign!(BlockNumber(18), %=, 5_u64 => BlockNumber(3));
170+
test_op_assign!(BlockNumber(18), %=, &5_u64 => BlockNumber(3));
171+
172+
test_op_assign!(18_u64, %=, BlockNumber(5) => 3_u64);
173+
test_op_assign!(18_u64, %=, &BlockNumber(5) => 3_u64);
174+
}
175+
155176
#[test]
156177
fn test_eq() {
157178
assert_eq!(BlockNumber(1), BlockNumber(1));

mithril-common/src/entities/wrapper_helpers.rs

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,99 @@ macro_rules! impl_div_to_wrapper {
370370
}
371371
pub(crate) use impl_div_to_wrapper;
372372

373+
macro_rules! impl_rem_to_wrapper {
374+
( $wrapper:ident, $inner:ty ) => {
375+
use std::ops::{Rem, RemAssign};
376+
377+
impl Rem for $wrapper {
378+
type Output = Self;
379+
380+
fn rem(self, rhs: Self) -> Self::Output {
381+
self % *rhs
382+
}
383+
}
384+
385+
impl Rem<$inner> for $wrapper {
386+
type Output = Self;
387+
388+
fn rem(self, rhs: $inner) -> Self::Output {
389+
$wrapper(*self % rhs)
390+
}
391+
}
392+
393+
impl Rem<&$inner> for $wrapper {
394+
type Output = Self;
395+
396+
fn rem(self, rhs: &$inner) -> Self::Output {
397+
self.rem(*rhs)
398+
}
399+
}
400+
401+
impl Rem<$wrapper> for $inner {
402+
type Output = $wrapper;
403+
404+
fn rem(self, rhs: $wrapper) -> Self::Output {
405+
$wrapper(self.rem(rhs.0))
406+
}
407+
}
408+
409+
impl Rem<&$wrapper> for $inner {
410+
type Output = $wrapper;
411+
412+
fn rem(self, rhs: &$wrapper) -> Self::Output {
413+
self.rem(*rhs)
414+
}
415+
}
416+
417+
impl Rem<$wrapper> for &$inner {
418+
type Output = $wrapper;
419+
420+
fn rem(self, rhs: $wrapper) -> Self::Output {
421+
(*self).rem(rhs)
422+
}
423+
}
424+
425+
impl Rem<&$wrapper> for &$inner {
426+
type Output = $wrapper;
427+
428+
fn rem(self, rhs: &$wrapper) -> Self::Output {
429+
(*self).rem(*rhs)
430+
}
431+
}
432+
433+
impl RemAssign for $wrapper {
434+
fn rem_assign(&mut self, rhs: Self) {
435+
*self = self.rem(rhs);
436+
}
437+
}
438+
439+
impl RemAssign<$inner> for $wrapper {
440+
fn rem_assign(&mut self, rhs: $inner) {
441+
*self = self.rem(rhs);
442+
}
443+
}
444+
445+
impl RemAssign<&$inner> for $wrapper {
446+
fn rem_assign(&mut self, rhs: &$inner) {
447+
*self = self.rem(rhs);
448+
}
449+
}
450+
451+
impl RemAssign<$wrapper> for $inner {
452+
fn rem_assign(&mut self, rhs: $wrapper) {
453+
*self = self.rem(rhs.0);
454+
}
455+
}
456+
457+
impl RemAssign<&$wrapper> for $inner {
458+
fn rem_assign(&mut self, rhs: &$wrapper) {
459+
*self = self.rem(rhs.0);
460+
}
461+
}
462+
};
463+
}
464+
pub(crate) use impl_rem_to_wrapper;
465+
373466
macro_rules! impl_partial_eq_to_wrapper {
374467
( $wrapper:ty, $inner:ty ) => {
375468
impl PartialEq<$inner> for $wrapper {
@@ -446,6 +539,11 @@ pub(crate) mod tests {
446539
number /= $left;
447540
assert_eq!($expected, number);
448541
}};
542+
( $right:expr, %=, $left:expr => $expected:expr ) => {{
543+
let mut number = $right;
544+
number %= $left;
545+
assert_eq!($expected, number);
546+
}};
449547
}
450548
pub(crate) use test_op_assign;
451549
}

0 commit comments

Comments
 (0)