]> git.lizzy.rs Git - rust.git/commitdiff
Fix rotate_{left, right} for multiple of bitsize rotation amounts
authorSamuel Neves <sneves@dei.uc.pt>
Wed, 2 Jul 2014 03:58:23 +0000 (04:58 +0100)
committerSamuel Neves <sneves@dei.uc.pt>
Wed, 2 Jul 2014 22:45:27 +0000 (23:45 +0100)
Add additional rotation tests

src/libcore/num/mod.rs
src/libcoretest/num/int_macros.rs
src/libcoretest/num/uint_macros.rs

index b32e4167da1d45e90517b74a4e36b0a55af6791b..1fae362471d9c8f168c77160af8182a871fac88b 100644 (file)
@@ -586,14 +586,14 @@ fn trailing_zeros(self) -> $T { unsafe { $cttz(self) } }
             fn rotate_left(self, n: uint) -> $T {
                 // Protect against undefined behaviour for over-long bit shifts
                 let n = n % $BITS;
-                (self << n) | (self >> ($BITS - n))
+                (self << n) | (self >> (($BITS - n) % $BITS))
             }
 
             #[inline]
             fn rotate_right(self, n: uint) -> $T {
                 // Protect against undefined behaviour for over-long bit shifts
                 let n = n % $BITS;
-                (self >> n) | (self << ($BITS - n))
+                (self >> n) | (self << (($BITS - n) % $BITS))
             }
 
             #[inline]
index 940b036ca907be036b4a7003ba70186d79c66738..d078b51408512fa5e0d13b572a4da0bee79b4c00 100644 (file)
@@ -114,6 +114,15 @@ fn test_rotate() {
         assert_eq!(_1.rotate_left(124), _1);
         assert_eq!(_0.rotate_right(124), _0);
         assert_eq!(_1.rotate_right(124), _1);
+
+        // Rotating by 0 should have no effect
+        assert_eq!(A.rotate_left(0), A);
+        assert_eq!(B.rotate_left(0), B);
+        assert_eq!(C.rotate_left(0), C);
+        // Rotating by a multiple of word size should also have no effect
+        assert_eq!(A.rotate_left(64), A);
+        assert_eq!(B.rotate_left(64), B);
+        assert_eq!(C.rotate_left(64), C);
     }
 
     #[test]
index 2272af67daf8580b7303aeb1f84d4a341ba70a5a..aefaa90520e798a339d35ef7d15adfad12c0f8ff 100644 (file)
@@ -74,6 +74,15 @@ fn test_rotate() {
         assert_eq!(_1.rotate_left(124), _1);
         assert_eq!(_0.rotate_right(124), _0);
         assert_eq!(_1.rotate_right(124), _1);
+
+        // Rotating by 0 should have no effect
+        assert_eq!(A.rotate_left(0), A);
+        assert_eq!(B.rotate_left(0), B);
+        assert_eq!(C.rotate_left(0), C);
+        // Rotating by a multiple of word size should also have no effect
+        assert_eq!(A.rotate_left(64), A);
+        assert_eq!(B.rotate_left(64), B);
+        assert_eq!(C.rotate_left(64), C);
     }
 
     #[test]