@@ -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