@@ -13,6 +13,10 @@ use num_integer::Integer;
1313use num_traits:: {
1414 pow, Euclid , FromBytes , FromPrimitive , Num , One , Pow , Signed , ToBytes , ToPrimitive , Zero ,
1515} ;
16+ use num_traits:: ops:: wrapping:: WrappingAdd ;
17+ use num_traits:: ops:: overflowing:: OverflowingAdd ;
18+ use num_traits:: ops:: wrapping:: WrappingSub ;
19+ use num_traits:: ops:: overflowing:: OverflowingSub ;
1620
1721mod consts;
1822use crate :: consts:: * ;
@@ -978,6 +982,43 @@ fn test_checked_add() {
978982 }
979983}
980984
985+ #[ test]
986+ fn test_wrapping_add ( ) {
987+ for elm in SUM_TRIPLES . iter ( ) {
988+ let ( a_vec, b_vec, c_vec) = * elm;
989+ let a = BigInt :: from_slice ( Plus , a_vec) ;
990+ let b = BigInt :: from_slice ( Plus , b_vec) ;
991+ let c = BigInt :: from_slice ( Plus , c_vec) ;
992+
993+ assert_eq ! ( a. wrapping_add( & b) , c) ;
994+ assert_eq ! ( b. wrapping_add( & a) , c) ;
995+ assert_eq ! ( c. wrapping_add( & ( -& a) ) , b) ;
996+ assert_eq ! ( c. wrapping_add( & ( -& b) ) , a) ;
997+ assert_eq ! ( a. wrapping_add( & ( -& c) ) , ( -& b) ) ;
998+ assert_eq ! ( b. wrapping_add( & ( -& c) ) , ( -& a) ) ;
999+ assert_eq ! ( ( -& a) . wrapping_add( & ( -& b) ) , ( -& c) ) ;
1000+ assert_eq ! ( a. wrapping_add( & ( -& a) ) , BigInt :: zero( ) ) ;
1001+ }
1002+ }
1003+
1004+ #[ test]
1005+ fn test_overflowing_add ( ) {
1006+ for elm in SUM_TRIPLES . iter ( ) {
1007+ let ( a_vec, b_vec, c_vec) = * elm;
1008+ let a = BigInt :: from_slice ( Plus , a_vec) ;
1009+ let b = BigInt :: from_slice ( Plus , b_vec) ;
1010+ let c = BigInt :: from_slice ( Plus , c_vec) ;
1011+
1012+ assert_eq ! ( a. overflowing_add( & b) , ( c. clone( ) , false ) ) ;
1013+ assert_eq ! ( b. overflowing_add( & a) , ( c. clone( ) , false ) ) ;
1014+ assert_eq ! ( c. overflowing_add( & ( -& a) ) , ( b. clone( ) , false ) ) ;
1015+ assert_eq ! ( c. overflowing_add( & ( -& b) ) , ( a. clone( ) , false ) ) ;
1016+ assert_eq ! ( a. overflowing_add( & ( -& c) ) , ( ( -& b) . clone( ) , false ) ) ;
1017+ assert_eq ! ( b. overflowing_add( & ( -& c) ) , ( ( -& a) . clone( ) , false ) ) ;
1018+ assert_eq ! ( c. overflowing_add( & ( -& c) ) , ( BigInt :: zero( ) , false ) ) ;
1019+ }
1020+ }
1021+
9811022#[ test]
9821023fn test_checked_sub ( ) {
9831024 for elm in SUM_TRIPLES . iter ( ) {
@@ -997,6 +1038,44 @@ fn test_checked_sub() {
9971038 }
9981039}
9991040
1041+ #[ test]
1042+ fn test_wrapping_sub ( ) {
1043+ for elm in SUM_TRIPLES . iter ( ) {
1044+ let ( a_vec, b_vec, c_vec) = * elm;
1045+ let a = BigInt :: from_slice ( Plus , a_vec) ;
1046+ let b = BigInt :: from_slice ( Plus , b_vec) ;
1047+ let c = BigInt :: from_slice ( Plus , c_vec) ;
1048+
1049+ assert_eq ! ( c. wrapping_sub( & a) , b) ;
1050+ assert_eq ! ( c. wrapping_sub( & b) , a) ;
1051+ assert_eq ! ( ( -& b) . wrapping_sub( & a) , ( -& c) ) ;
1052+ assert_eq ! ( ( -& a) . wrapping_sub( & b) , ( -& c) ) ;
1053+ assert_eq ! ( b. wrapping_sub( & ( -& a) ) , c) ;
1054+ assert_eq ! ( a. wrapping_sub( & ( -& b) ) , c) ;
1055+ assert_eq ! ( ( -& c) . wrapping_sub( & ( -& a) ) , ( -& b) ) ;
1056+ assert_eq ! ( a. wrapping_sub( & a) , BigInt :: zero( ) ) ;
1057+ }
1058+ }
1059+
1060+ #[ test]
1061+ fn test_overflowing_sub ( ) {
1062+ for elm in SUM_TRIPLES . iter ( ) {
1063+ let ( a_vec, b_vec, c_vec) = * elm;
1064+ let a = BigInt :: from_slice ( Plus , a_vec) ;
1065+ let b = BigInt :: from_slice ( Plus , b_vec) ;
1066+ let c = BigInt :: from_slice ( Plus , c_vec) ;
1067+
1068+ assert_eq ! ( c. overflowing_sub( & a) , ( b. clone( ) , false ) ) ;
1069+ assert_eq ! ( c. overflowing_sub( & b) , ( a. clone( ) , false ) ) ;
1070+ assert_eq ! ( ( -& b) . overflowing_sub( & a) , ( ( -& c) . clone( ) , false ) ) ;
1071+ assert_eq ! ( ( -& a) . overflowing_sub( & b) , ( ( -& c) . clone( ) , false ) ) ;
1072+ assert_eq ! ( b. overflowing_sub( & ( -& a) ) , ( c. clone( ) , false ) ) ;
1073+ assert_eq ! ( a. overflowing_sub( & ( -& b) ) , ( c. clone( ) , false ) ) ;
1074+ assert_eq ! ( ( -& c) . overflowing_sub( & ( -& a) ) , ( ( -& b) . clone( ) , false ) ) ;
1075+ assert_eq ! ( a. overflowing_sub( & a) , ( BigInt :: zero( ) , false ) ) ;
1076+ }
1077+ }
1078+
10001079#[ test]
10011080fn test_checked_mul ( ) {
10021081 for elm in MUL_TRIPLES . iter ( ) {
0 commit comments