diff options
| author | Tim Vermeulen <tvermeulen@me.com> | 2020-10-02 02:46:19 +0200 |
|---|---|---|
| committer | The8472 <git@infinite-source.de> | 2021-07-22 22:05:37 +0200 |
| commit | 2b8991496226e736d96ef77193ba0595081284a4 (patch) | |
| tree | fe6ab0d084fe69cf82bec8fab6c56994a577b629 | |
| parent | e742158ef5483b9cd756b193402329af3d4ba177 (diff) | |
| download | rust-2b8991496226e736d96ef77193ba0595081284a4.tar.gz rust-2b8991496226e736d96ef77193ba0595081284a4.zip | |
Implement slice::{Iter, IterMut}::{advance_by, advance_back_by}
Co-authored-by: The8472 <git@infinite-source.de>
| -rw-r--r-- | library/core/src/slice/iter/macros.rs | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/library/core/src/slice/iter/macros.rs b/library/core/src/slice/iter/macros.rs index 457b2a3605e..04945fa0e82 100644 --- a/library/core/src/slice/iter/macros.rs +++ b/library/core/src/slice/iter/macros.rs @@ -186,6 +186,14 @@ macro_rules! iterator { } #[inline] + fn advance_by(&mut self, n: usize) -> Result<(), usize>{ + let advance = cmp::min(n, len!(self)); + // SAFETY: `advance` does not exceed `self.len()` by construction + unsafe { self.post_inc_start(advance as isize) }; + if advance == n { Ok(()) } else { Err(advance) } + } + + #[inline] fn last(mut self) -> Option<$elem> { self.next_back() } @@ -371,6 +379,14 @@ macro_rules! iterator { Some(next_back_unchecked!(self)) } } + + #[inline] + fn advance_back_by(&mut self, n: usize) -> Result<(), usize> { + let advance = cmp::min(n, len!(self)); + // SAFETY: `advance` does not exceed `self.len()` by construction + unsafe { self.pre_dec_end(advance as isize) }; + if advance == n { Ok(()) } else { Err(advance) } + } } #[stable(feature = "fused", since = "1.26.0")] |
