Skip to content

Commit a7d40a1

Browse files
bors[bot]cuviper
andauthored
Merge #45
45: Fix prev/next_multiple_of(&MIN, &-1) r=cuviper a=cuviper Closes #43. Co-authored-by: Josh Stone <[email protected]>
2 parents d839ba5 + cde58ee commit a7d40a1

File tree

1 file changed

+33
-0
lines changed

1 file changed

+33
-0
lines changed

src/lib.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -560,6 +560,29 @@ macro_rules! impl_integer_for_isize {
560560
fn div_rem(&self, other: &Self) -> (Self, Self) {
561561
(*self / *other, *self % *other)
562562
}
563+
564+
/// Rounds up to nearest multiple of argument.
565+
#[inline]
566+
fn next_multiple_of(&self, other: &Self) -> Self {
567+
// Avoid the overflow of `MIN % -1`
568+
if *other == -1 {
569+
return *self;
570+
}
571+
572+
let m = Integer::mod_floor(self, other);
573+
*self + if m == 0 { 0 } else { other - m }
574+
}
575+
576+
/// Rounds down to nearest multiple of argument.
577+
#[inline]
578+
fn prev_multiple_of(&self, other: &Self) -> Self {
579+
// Avoid the overflow of `MIN % -1`
580+
if *other == -1 {
581+
return *self;
582+
}
583+
584+
*self - Integer::mod_floor(self, other)
585+
}
563586
}
564587

565588
#[cfg(test)]
@@ -782,6 +805,16 @@ macro_rules! impl_integer_for_isize {
782805
assert_eq!((3 as $T).is_odd(), true);
783806
assert_eq!((4 as $T).is_odd(), false);
784807
}
808+
809+
#[test]
810+
fn test_multiple_of_one_limits() {
811+
for x in &[<$T>::min_value(), <$T>::max_value()] {
812+
for one in &[1, -1] {
813+
assert_eq!(Integer::next_multiple_of(x, one), *x);
814+
assert_eq!(Integer::prev_multiple_of(x, one), *x);
815+
}
816+
}
817+
}
785818
}
786819
};
787820
}

0 commit comments

Comments
 (0)