From 2b8991496226e736d96ef77193ba0595081284a4 Mon Sep 17 00:00:00 2001 From: Tim Vermeulen Date: Fri, 2 Oct 2020 02:46:19 +0200 Subject: [PATCH] Implement slice::{Iter, IterMut}::{advance_by, advance_back_by} Co-authored-by: The8472 --- library/core/src/slice/iter/macros.rs | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/library/core/src/slice/iter/macros.rs b/library/core/src/slice/iter/macros.rs index 457b2a3605e8..04945fa0e821 100644 --- a/library/core/src/slice/iter/macros.rs +++ b/library/core/src/slice/iter/macros.rs @@ -185,6 +185,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")]