Skip to content

Commit ed96f8f

Browse files
Alenarsfauvel
authored andcommitted
Add Div arithmetic operation on BlockNumber
1 parent 445d206 commit ed96f8f

File tree

2 files changed

+121
-1
lines changed

2 files changed

+121
-1
lines changed

mithril-common/src/entities/block_number.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@ use std::ops::{Deref, DerefMut};
44
use serde::{Deserialize, Serialize};
55

66
use crate::entities::wrapper_helpers::{
7-
impl_add_to_wrapper, impl_mul_to_wrapper, impl_partial_eq_to_wrapper, impl_sub_to_wrapper,
7+
impl_add_to_wrapper, impl_div_to_wrapper, impl_mul_to_wrapper, impl_partial_eq_to_wrapper,
8+
impl_sub_to_wrapper,
89
};
910
use crate::signable_builder::Beacon;
1011

@@ -39,6 +40,7 @@ impl DerefMut for BlockNumber {
3940
impl_add_to_wrapper!(BlockNumber, u64);
4041
impl_sub_to_wrapper!(BlockNumber, u64);
4142
impl_mul_to_wrapper!(BlockNumber, u64);
43+
impl_div_to_wrapper!(BlockNumber, u64);
4244
impl_partial_eq_to_wrapper!(BlockNumber, u64);
4345

4446
#[cfg(test)]
@@ -130,6 +132,26 @@ mod tests {
130132
test_op_assign!(2_u64, *=, &BlockNumber(3) => 6_u64);
131133
}
132134

135+
#[test]
136+
#[allow(clippy::op_ref)]
137+
fn test_div() {
138+
assert_eq!(BlockNumber(6), BlockNumber(18) / BlockNumber(3));
139+
assert_eq!(BlockNumber(6), BlockNumber(18) / 3_u64);
140+
assert_eq!(BlockNumber(6), BlockNumber(18) / &3_u64);
141+
142+
assert_eq!(BlockNumber(6), 12_u64 / BlockNumber(2));
143+
assert_eq!(BlockNumber(6), 12_u64 / &BlockNumber(2));
144+
assert_eq!(BlockNumber(6), &12_u64 / BlockNumber(2));
145+
assert_eq!(BlockNumber(6), &12_u64 / &BlockNumber(2));
146+
147+
test_op_assign!(BlockNumber(18), /=, BlockNumber(3) => BlockNumber(6));
148+
test_op_assign!(BlockNumber(18), /=, 3_u64 => BlockNumber(6));
149+
test_op_assign!(BlockNumber(18), /=, &3_u64 => BlockNumber(6));
150+
151+
test_op_assign!(18_u64, /=, BlockNumber(3) => 6_u64);
152+
test_op_assign!(18_u64, /=, &BlockNumber(3) => 6_u64);
153+
}
154+
133155
#[test]
134156
fn test_eq() {
135157
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
@@ -277,6 +277,99 @@ macro_rules! impl_mul_to_wrapper {
277277
}
278278
pub(crate) use impl_mul_to_wrapper;
279279

280+
macro_rules! impl_div_to_wrapper {
281+
( $wrapper:ident, $inner:ty ) => {
282+
use std::ops::{Div, DivAssign};
283+
284+
impl Div for $wrapper {
285+
type Output = Self;
286+
287+
fn div(self, rhs: Self) -> Self::Output {
288+
self / *rhs
289+
}
290+
}
291+
292+
impl Div<$inner> for $wrapper {
293+
type Output = Self;
294+
295+
fn div(self, rhs: $inner) -> Self::Output {
296+
$wrapper(*self / rhs)
297+
}
298+
}
299+
300+
impl Div<&$inner> for $wrapper {
301+
type Output = Self;
302+
303+
fn div(self, rhs: &$inner) -> Self::Output {
304+
self.div(*rhs)
305+
}
306+
}
307+
308+
impl Div<$wrapper> for $inner {
309+
type Output = $wrapper;
310+
311+
fn div(self, rhs: $wrapper) -> Self::Output {
312+
$wrapper(self.div(rhs.0))
313+
}
314+
}
315+
316+
impl Div<&$wrapper> for $inner {
317+
type Output = $wrapper;
318+
319+
fn div(self, rhs: &$wrapper) -> Self::Output {
320+
self.div(*rhs)
321+
}
322+
}
323+
324+
impl Div<$wrapper> for &$inner {
325+
type Output = $wrapper;
326+
327+
fn div(self, rhs: $wrapper) -> Self::Output {
328+
(*self).div(rhs)
329+
}
330+
}
331+
332+
impl Div<&$wrapper> for &$inner {
333+
type Output = $wrapper;
334+
335+
fn div(self, rhs: &$wrapper) -> Self::Output {
336+
(*self).div(*rhs)
337+
}
338+
}
339+
340+
impl DivAssign for $wrapper {
341+
fn div_assign(&mut self, rhs: Self) {
342+
*self = self.div(rhs);
343+
}
344+
}
345+
346+
impl DivAssign<$inner> for $wrapper {
347+
fn div_assign(&mut self, rhs: $inner) {
348+
*self = self.div(rhs);
349+
}
350+
}
351+
352+
impl DivAssign<&$inner> for $wrapper {
353+
fn div_assign(&mut self, rhs: &$inner) {
354+
*self = self.div(rhs);
355+
}
356+
}
357+
358+
impl DivAssign<$wrapper> for $inner {
359+
fn div_assign(&mut self, rhs: $wrapper) {
360+
*self = self.div(rhs.0);
361+
}
362+
}
363+
364+
impl DivAssign<&$wrapper> for $inner {
365+
fn div_assign(&mut self, rhs: &$wrapper) {
366+
*self = self.div(rhs.0);
367+
}
368+
}
369+
};
370+
}
371+
pub(crate) use impl_div_to_wrapper;
372+
280373
macro_rules! impl_partial_eq_to_wrapper {
281374
( $wrapper:ty, $inner:ty ) => {
282375
impl PartialEq<$inner> for $wrapper {
@@ -348,6 +441,11 @@ pub(crate) mod tests {
348441
number *= $left;
349442
assert_eq!($expected, number);
350443
}};
444+
( $right:expr, /=, $left:expr => $expected:expr ) => {{
445+
let mut number = $right;
446+
number /= $left;
447+
assert_eq!($expected, number);
448+
}};
351449
}
352450
pub(crate) use test_op_assign;
353451
}

0 commit comments

Comments
 (0)