diff options
Diffstat (limited to 'src/libcore')
| -rw-r--r-- | src/libcore/slice/mod.rs | 17 | ||||
| -rw-r--r-- | src/libcore/tests/slice.rs | 21 |
2 files changed, 33 insertions, 5 deletions
diff --git a/src/libcore/slice/mod.rs b/src/libcore/slice/mod.rs index ca5cf04b1d4..fd91227343f 100644 --- a/src/libcore/slice/mod.rs +++ b/src/libcore/slice/mod.rs @@ -201,7 +201,10 @@ pub trait SliceExt { fn ends_with(&self, needle: &[Self::Item]) -> bool where Self::Item: PartialEq; #[unstable(feature = "slice_rotate", issue = "41891")] - fn rotate(&mut self, mid: usize); + fn rotate_left(&mut self, mid: usize); + + #[unstable(feature = "slice_rotate", issue = "41891")] + fn rotate_right(&mut self, k: usize); #[stable(feature = "clone_from_slice", since = "1.7.0")] fn clone_from_slice(&mut self, src: &[Self::Item]) where Self::Item: Clone; @@ -640,7 +643,7 @@ impl<T> SliceExt for [T] { self.binary_search_by(|p| p.cmp(x)) } - fn rotate(&mut self, mid: usize) { + fn rotate_left(&mut self, mid: usize) { assert!(mid <= self.len()); let k = self.len() - mid; @@ -650,6 +653,16 @@ impl<T> SliceExt for [T] { } } + fn rotate_right(&mut self, k: usize) { + assert!(k <= self.len()); + let mid = self.len() - k; + + unsafe { + let p = self.as_mut_ptr(); + rotate::ptr_rotate(mid, p.offset(mid as isize), k); + } + } + #[inline] fn clone_from_slice(&mut self, src: &[T]) where T: Clone { assert!(self.len() == src.len(), diff --git a/src/libcore/tests/slice.rs b/src/libcore/tests/slice.rs index fa4c2e9b373..2df7d6e60f6 100644 --- a/src/libcore/tests/slice.rs +++ b/src/libcore/tests/slice.rs @@ -290,17 +290,32 @@ fn test_iter_folds() { } #[test] -fn test_rotate() { +fn test_rotate_left() { const N: usize = 600; let a: &mut [_] = &mut [0; N]; for i in 0..N { a[i] = i; } - a.rotate(42); + a.rotate_left(42); let k = N - 42; for i in 0..N { - assert_eq!(a[(i+k)%N], i); + assert_eq!(a[(i + k) % N], i); + } +} + +#[test] +fn test_rotate_right() { + const N: usize = 600; + let a: &mut [_] = &mut [0; N]; + for i in 0..N { + a[i] = i; + } + + a.rotate_right(42); + + for i in 0..N { + assert_eq!(a[(i + 42) % N], i); } } |
