@@ -266,19 +266,6 @@ macro_rules! saturating_impl {
266
266
}
267
267
forward_ref_op_assign! { impl MulAssign , mul_assign for Saturating <$t>, Saturating <$t> }
268
268
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
-
282
269
#[ unstable( feature = "saturating_int_impl" , issue = "87920" ) ]
283
270
impl DivAssign for Saturating <$t> {
284
271
#[ inline]
@@ -864,6 +851,40 @@ macro_rules! saturating_int_impl_signed {
864
851
}
865
852
forward_ref_unop! { impl Neg , neg for Saturating <$t>,
866
853
#[ 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" ) ] }
867
888
) * )
868
889
}
869
890
@@ -912,6 +933,18 @@ macro_rules! saturating_int_impl_unsigned {
912
933
}
913
934
914
935
}
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" ) ] }
915
948
) * )
916
949
}
917
950
0 commit comments