]> git.lizzy.rs Git - rust.git/commitdiff
std: Implement RandomAccessIterator for Invert
authorblake2-ppc <blake2-ppc>
Sat, 3 Aug 2013 17:40:20 +0000 (19:40 +0200)
committerblake2-ppc <blake2-ppc>
Tue, 6 Aug 2013 02:05:07 +0000 (04:05 +0200)
src/libstd/iterator.rs

index 0769aa6a7646478303936748307dc2ab682038fe..372afd7402d45c3eeea3e28cdfc1e3ddd1cdb683 100644 (file)
@@ -106,6 +106,16 @@ impl<A, T: DoubleEndedIterator<A>> DoubleEndedIterator<A> for Invert<T> {
     fn next_back(&mut self) -> Option<A> { self.iter.next() }
 }
 
+impl<A, T: DoubleEndedIterator<A> + RandomAccessIterator<A>> RandomAccessIterator<A>
+    for Invert<T> {
+    #[inline]
+    fn indexable(&self) -> uint { self.iter.indexable() }
+    #[inline]
+    fn idx(&self, index: uint) -> Option<A> {
+        self.iter.idx(self.indexable() - index - 1)
+    }
+}
+
 /// Iterator adaptors provided for every `Iterator` implementation. The adaptor objects are also
 /// implementations of the `Iterator` trait.
 ///
@@ -2017,6 +2027,17 @@ fn test_random_access_enumerate() {
         check_randacc_iter(xs.iter().enumerate(), xs.len());
     }
 
+    #[test]
+    fn test_random_access_invert() {
+        let xs = [1, 2, 3, 4, 5];
+        check_randacc_iter(xs.iter().invert(), xs.len());
+        let mut it = xs.iter().invert();
+        it.next();
+        it.next_back();
+        it.next();
+        check_randacc_iter(it, xs.len() - 3);
+    }
+
     #[test]
     fn test_random_access_zip() {
         let xs = [1, 2, 3, 4, 5];