Skip to content
This repository was archived by the owner on May 28, 2025. It is now read-only.

Commit 8049230

Browse files
committed
Saturate negative division
1 parent f136eea commit 8049230

File tree

1 file changed

+46
-13
lines changed

1 file changed

+46
-13
lines changed

library/core/src/num/saturating.rs

Lines changed: 46 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -266,19 +266,6 @@ macro_rules! saturating_impl {
266266
}
267267
forward_ref_op_assign! { impl MulAssign, mul_assign for Saturating<$t>, Saturating<$t> }
268268

269-
#[unstable(feature = "saturating_int_impl", issue = "87920")]
270-
impl Div for Saturating<$t> {
271-
type Output = Saturating<$t>;
272-
273-
#[inline]
274-
fn div(self, other: Saturating<$t>) -> Saturating<$t> {
275-
// saturating div is the default behavior?
276-
Saturating(self.0.div(other.0))
277-
}
278-
}
279-
forward_ref_binop! { impl Div, div for Saturating<$t>, Saturating<$t>,
280-
#[unstable(feature = "saturating_int_impl", issue = "87920")] }
281-
282269
#[unstable(feature = "saturating_int_impl", issue = "87920")]
283270
impl DivAssign for Saturating<$t> {
284271
#[inline]
@@ -864,6 +851,40 @@ macro_rules! saturating_int_impl_signed {
864851
}
865852
forward_ref_unop! { impl Neg, neg for Saturating<$t>,
866853
#[unstable(feature = "saturating_int_impl", issue = "87920")] }
854+
855+
/// # Examples
856+
///
857+
/// Basic usage:
858+
///
859+
/// ```
860+
/// #![feature(saturating_int_impl)]
861+
/// use std::num::Saturating;
862+
///
863+
#[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MIN + 1), Saturating(", stringify!($t), "::MAX) / Saturating(-1));")]
864+
#[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MAX), Saturating(", stringify!($t), "::MIN) / Saturating(-1));")]
865+
#[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MAX), Saturating(", stringify!($t), "::MAX) / Saturating(1));")]
866+
#[doc = concat!("assert_eq!(Saturating(", stringify!($t), "::MIN), Saturating(", stringify!($t), "::MIN) / Saturating(1));")]
867+
/// ```
868+
#[unstable(feature = "saturating_int_impl", issue = "87920")]
869+
impl Div for Saturating<$t> {
870+
type Output = Saturating<$t>;
871+
872+
#[inline]
873+
fn div(self, other: Saturating<$t>) -> Saturating<$t> {
874+
let expected_signum = self.0.signum() * other.0.signum();
875+
let (result, overflowed) = self.0.overflowing_div(other.0);
876+
877+
if !overflowed {
878+
Saturating(result)
879+
} else if expected_signum < 0 {
880+
Saturating(<$t>::MIN)
881+
} else {
882+
Saturating(<$t>::MAX)
883+
}
884+
}
885+
}
886+
forward_ref_binop! { impl Div, div for Saturating<$t>, Saturating<$t>,
887+
#[unstable(feature = "saturating_int_impl", issue = "87920")] }
867888
)*)
868889
}
869890

@@ -912,6 +933,18 @@ macro_rules! saturating_int_impl_unsigned {
912933
}
913934

914935
}
936+
937+
#[unstable(feature = "saturating_int_impl", issue = "87920")]
938+
impl Div for Saturating<$t> {
939+
type Output = Saturating<$t>;
940+
941+
#[inline]
942+
fn div(self, other: Saturating<$t>) -> Saturating<$t> {
943+
Saturating(self.0.div(other.0))
944+
}
945+
}
946+
forward_ref_binop! { impl Div, div for Saturating<$t>, Saturating<$t>,
947+
#[unstable(feature = "saturating_int_impl", issue = "87920")] }
915948
)*)
916949
}
917950

0 commit comments

Comments
 (0)