diff options
| author | The 8472 <git@infinite-source.de> | 2021-12-26 03:21:54 +0100 |
|---|---|---|
| committer | The 8472 <git@infinite-source.de> | 2023-03-27 14:11:49 +0200 |
| commit | 69db91b8b25de51633ac9f089cd7fb10a58c2b2a (patch) | |
| tree | 2bb072195a1a0744f33624b96a1343d12a2452c2 /library/alloc/src | |
| parent | 7a0600714ab1a4cb2d1a88cd0660b9f9a2c07309 (diff) | |
| download | rust-69db91b8b25de51633ac9f089cd7fb10a58c2b2a.tar.gz rust-69db91b8b25de51633ac9f089cd7fb10a58c2b2a.zip | |
Change advance(_back)_by to return `usize` instead of `Result<(), usize>`
A successful advance is now signalled by returning `0` and other values now represent the remaining number of steps that couldn't be advanced as opposed to the amount of steps that have been advanced during a partial advance_by. This simplifies adapters a bit, replacing some `match`/`if` with arithmetic. Whether this is beneficial overall depends on whether `advance_by` is mostly used as a building-block for other iterator methods and adapters or whether we also see uses by users where `Result` might be more useful.
Diffstat (limited to 'library/alloc/src')
| -rw-r--r-- | library/alloc/src/collections/vec_deque/into_iter.rs | 12 | ||||
| -rw-r--r-- | library/alloc/src/collections/vec_deque/iter.rs | 25 | ||||
| -rw-r--r-- | library/alloc/src/collections/vec_deque/iter_mut.rs | 25 | ||||
| -rw-r--r-- | library/alloc/src/vec/into_iter.rs | 14 |
4 files changed, 34 insertions, 42 deletions
diff --git a/library/alloc/src/collections/vec_deque/into_iter.rs b/library/alloc/src/collections/vec_deque/into_iter.rs index 34bc0ce9177..8ba963b790d 100644 --- a/library/alloc/src/collections/vec_deque/into_iter.rs +++ b/library/alloc/src/collections/vec_deque/into_iter.rs @@ -54,14 +54,14 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> { } #[inline] - fn advance_by(&mut self, n: usize) -> Result<(), usize> { + fn advance_by(&mut self, n: usize) -> usize { if self.inner.len < n { let len = self.inner.len; self.inner.clear(); - Err(len) + len - n } else { self.inner.drain(..n); - Ok(()) + 0 } } @@ -182,14 +182,14 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> { } #[inline] - fn advance_back_by(&mut self, n: usize) -> Result<(), usize> { + fn advance_back_by(&mut self, n: usize) -> usize { let len = self.inner.len; if len >= n { self.inner.truncate(len - n); - Ok(()) + 0 } else { self.inner.clear(); - Err(len) + n - len } } diff --git a/library/alloc/src/collections/vec_deque/iter.rs b/library/alloc/src/collections/vec_deque/iter.rs index d9f3937144d..5b91c1635f0 100644 --- a/library/alloc/src/collections/vec_deque/iter.rs +++ b/library/alloc/src/collections/vec_deque/iter.rs @@ -55,13 +55,13 @@ impl<'a, T> Iterator for Iter<'a, T> { } } - fn advance_by(&mut self, n: usize) -> Result<(), usize> { - let m = match self.i1.advance_by(n) { - Ok(_) => return Ok(()), - Err(m) => m, - }; + fn advance_by(&mut self, n: usize) -> usize { + let remaining = self.i1.advance_by(n); + if remaining == 0 { + return 0; + } mem::swap(&mut self.i1, &mut self.i2); - self.i1.advance_by(n - m).map_err(|o| o + m) + self.i1.advance_by(remaining) } #[inline] @@ -125,14 +125,13 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> { } } - fn advance_back_by(&mut self, n: usize) -> Result<(), usize> { - let m = match self.i2.advance_back_by(n) { - Ok(_) => return Ok(()), - Err(m) => m, - }; - + fn advance_back_by(&mut self, n: usize) -> usize { + let remaining = self.i2.advance_back_by(n); + if remaining == 0 { + return 0; + } mem::swap(&mut self.i1, &mut self.i2); - self.i2.advance_back_by(n - m).map_err(|o| m + o) + self.i2.advance_back_by(remaining) } fn rfold<Acc, F>(self, accum: Acc, mut f: F) -> Acc diff --git a/library/alloc/src/collections/vec_deque/iter_mut.rs b/library/alloc/src/collections/vec_deque/iter_mut.rs index 2c59d95cd53..848cb3649c8 100644 --- a/library/alloc/src/collections/vec_deque/iter_mut.rs +++ b/library/alloc/src/collections/vec_deque/iter_mut.rs @@ -47,13 +47,13 @@ impl<'a, T> Iterator for IterMut<'a, T> { } } - fn advance_by(&mut self, n: usize) -> Result<(), usize> { - let m = match self.i1.advance_by(n) { - Ok(_) => return Ok(()), - Err(m) => m, - }; + fn advance_by(&mut self, n: usize) -> usize { + let remaining = self.i1.advance_by(n); + if remaining == 0 { + return 0; + } mem::swap(&mut self.i1, &mut self.i2); - self.i1.advance_by(n - m).map_err(|o| o + m) + self.i1.advance_by(remaining) } #[inline] @@ -117,14 +117,13 @@ impl<'a, T> DoubleEndedIterator for IterMut<'a, T> { } } - fn advance_back_by(&mut self, n: usize) -> Result<(), usize> { - let m = match self.i2.advance_back_by(n) { - Ok(_) => return Ok(()), - Err(m) => m, - }; - + fn advance_back_by(&mut self, n: usize) -> usize { + let remaining = self.i2.advance_back_by(n); + if remaining == 0 { + return 0; + } mem::swap(&mut self.i1, &mut self.i2); - self.i2.advance_back_by(n - m).map_err(|o| m + o) + self.i2.advance_back_by(remaining) } fn rfold<Acc, F>(self, accum: Acc, mut f: F) -> Acc diff --git a/library/alloc/src/vec/into_iter.rs b/library/alloc/src/vec/into_iter.rs index f6525eb9003..504ca4333be 100644 --- a/library/alloc/src/vec/into_iter.rs +++ b/library/alloc/src/vec/into_iter.rs @@ -213,7 +213,7 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> { } #[inline] - fn advance_by(&mut self, n: usize) -> Result<(), usize> { + fn advance_by(&mut self, n: usize) -> usize { let step_size = self.len().min(n); let to_drop = ptr::slice_from_raw_parts_mut(self.ptr as *mut T, step_size); if T::IS_ZST { @@ -227,10 +227,7 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> { unsafe { ptr::drop_in_place(to_drop); } - if step_size < n { - return Err(step_size); - } - Ok(()) + n - step_size } #[inline] @@ -313,7 +310,7 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> { } #[inline] - fn advance_back_by(&mut self, n: usize) -> Result<(), usize> { + fn advance_back_by(&mut self, n: usize) -> usize { let step_size = self.len().min(n); if T::IS_ZST { // SAFETY: same as for advance_by() @@ -327,10 +324,7 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> { unsafe { ptr::drop_in_place(to_drop); } - if step_size < n { - return Err(step_size); - } - Ok(()) + n - step_size } } |
