about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTim Vermeulen <tvermeulen@me.com>2020-10-02 02:46:19 +0200
committerThe8472 <git@infinite-source.de>2021-07-22 22:05:37 +0200
commit2b8991496226e736d96ef77193ba0595081284a4 (patch)
treefe6ab0d084fe69cf82bec8fab6c56994a577b629
parente742158ef5483b9cd756b193402329af3d4ba177 (diff)
downloadrust-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.rs16
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")]