diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-04-21 22:15:42 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-04-23 10:03:43 -0700 |
| commit | f4083a22451692b9ae360f3d12bfb8cb52b096e4 (patch) | |
| tree | 5def1ac72e0ed4208f3995fdf609e8ac8539c65f /src/libstd | |
| parent | 159a10da4c15e5d34e00d4018b352573cec7918f (diff) | |
| download | rust-f4083a22451692b9ae360f3d12bfb8cb52b096e4.tar.gz rust-f4083a22451692b9ae360f3d12bfb8cb52b096e4.zip | |
std: Change RandomAccessIterator to use `&mut self`
Many iterators go through a closure when dealing with the `idx` method, which are invalid after the previous change (closures cannot be invoked through a `&` pointer). This commit alters the `fn idx` method on the RandomAccessIterator to take `&mut self` rather than `&self`. [breaking-change]
Diffstat (limited to 'src/libstd')
| -rw-r--r-- | src/libstd/iter.rs | 33 | ||||
| -rw-r--r-- | src/libstd/slice.rs | 4 |
2 files changed, 20 insertions, 17 deletions
diff --git a/src/libstd/iter.rs b/src/libstd/iter.rs index 7a04303268b..ec5d7390164 100644 --- a/src/libstd/iter.rs +++ b/src/libstd/iter.rs @@ -703,7 +703,7 @@ pub trait RandomAccessIterator<A>: Iterator<A> { fn indexable(&self) -> uint; /// Return an element at an index - fn idx(&self, index: uint) -> Option<A>; + fn idx(&mut self, index: uint) -> Option<A>; } /// An iterator that knows its exact length @@ -771,8 +771,9 @@ impl<A, T: DoubleEndedIterator<A> + RandomAccessIterator<A>> RandomAccessIterato #[inline] fn indexable(&self) -> uint { self.iter.indexable() } #[inline] - fn idx(&self, index: uint) -> Option<A> { - self.iter.idx(self.indexable() - index - 1) + fn idx(&mut self, index: uint) -> Option<A> { + let amt = self.indexable(); + self.iter.idx(amt - index - 1) } } @@ -1071,7 +1072,7 @@ impl<A, T: Clone + RandomAccessIterator<A>> RandomAccessIterator<A> for Cycle<T> } #[inline] - fn idx(&self, index: uint) -> Option<A> { + fn idx(&mut self, index: uint) -> Option<A> { let liter = self.iter.indexable(); let lorig = self.orig.indexable(); if lorig == 0 { @@ -1143,7 +1144,7 @@ for Chain<T, U> { } #[inline] - fn idx(&self, index: uint) -> Option<A> { + fn idx(&mut self, index: uint) -> Option<A> { let len = self.a.indexable(); if index < len { self.a.idx(index) @@ -1221,7 +1222,7 @@ RandomAccessIterator<(A, B)> for Zip<T, U> { } #[inline] - fn idx(&self, index: uint) -> Option<(A, B)> { + fn idx(&mut self, index: uint) -> Option<(A, B)> { match self.a.idx(index) { None => None, Some(x) => match self.b.idx(index) { @@ -1276,8 +1277,9 @@ impl<'a, A, B, T: RandomAccessIterator<A>> RandomAccessIterator<B> for Map<'a, A } #[inline] - fn idx(&self, index: uint) -> Option<B> { - self.do_map(self.iter.idx(index)) + fn idx(&mut self, index: uint) -> Option<B> { + let elt = self.iter.idx(index); + self.do_map(elt) } } @@ -1415,7 +1417,7 @@ impl<A, T: RandomAccessIterator<A>> RandomAccessIterator<(uint, A)> for Enumerat } #[inline] - fn idx(&self, index: uint) -> Option<(uint, A)> { + fn idx(&mut self, index: uint) -> Option<(uint, A)> { match self.iter.idx(index) { Some(a) => Some((self.count + index, a)), _ => None, @@ -1600,7 +1602,7 @@ impl<A, T: RandomAccessIterator<A>> RandomAccessIterator<A> for Skip<T> { } #[inline] - fn idx(&self, index: uint) -> Option<A> { + fn idx(&mut self, index: uint) -> Option<A> { if index >= self.indexable() { None } else { @@ -1649,7 +1651,7 @@ impl<A, T: RandomAccessIterator<A>> RandomAccessIterator<A> for Take<T> { } #[inline] - fn idx(&self, index: uint) -> Option<A> { + fn idx(&mut self, index: uint) -> Option<A> { if index >= self.n { None } else { @@ -1799,7 +1801,7 @@ impl<A, T: RandomAccessIterator<A>> RandomAccessIterator<A> for Fuse<T> { } #[inline] - fn idx(&self, index: uint) -> Option<A> { + fn idx(&mut self, index: uint) -> Option<A> { self.iter.idx(index) } } @@ -1862,8 +1864,9 @@ for Inspect<'a, A, T> { } #[inline] - fn idx(&self, index: uint) -> Option<A> { - self.do_inspect(self.iter.idx(index)) + fn idx(&mut self, index: uint) -> Option<A> { + let element = self.iter.idx(index); + self.do_inspect(element) } } @@ -2164,7 +2167,7 @@ impl<A: Clone> RandomAccessIterator<A> for Repeat<A> { #[inline] fn indexable(&self) -> uint { uint::MAX } #[inline] - fn idx(&self, _: uint) -> Option<A> { Some(self.element.clone()) } + fn idx(&mut self, _: uint) -> Option<A> { Some(self.element.clone()) } } /// Functions for lexicographical ordering of sequences. diff --git a/src/libstd/slice.rs b/src/libstd/slice.rs index 6c55195e627..309ea8623e5 100644 --- a/src/libstd/slice.rs +++ b/src/libstd/slice.rs @@ -489,7 +489,7 @@ impl<'a, T> RandomAccessIterator<&'a [T]> for Chunks<'a, T> { } #[inline] - fn idx(&self, index: uint) -> Option<&'a [T]> { + fn idx(&mut self, index: uint) -> Option<&'a [T]> { if index < self.indexable() { let lo = index * self.size; let mut hi = lo + self.size; @@ -2095,7 +2095,7 @@ impl<'a, T> RandomAccessIterator<&'a T> for Items<'a, T> { } #[inline] - fn idx(&self, index: uint) -> Option<&'a T> { + fn idx(&mut self, index: uint) -> Option<&'a T> { unsafe { if index < self.indexable() { transmute(self.ptr.offset(index as int)) |
