Skip to content

Commit 2b89914

Browse files
timvermeulenthe8472
andcommitted
Implement slice::{Iter, IterMut}::{advance_by, advance_back_by}
Co-authored-by: The8472 <[email protected]>
1 parent e742158 commit 2b89914

File tree

1 file changed

+16
-0
lines changed

1 file changed

+16
-0
lines changed

library/core/src/slice/iter/macros.rs

+16
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,14 @@ macro_rules! iterator {
185185
}
186186
}
187187

188+
#[inline]
189+
fn advance_by(&mut self, n: usize) -> Result<(), usize>{
190+
let advance = cmp::min(n, len!(self));
191+
// SAFETY: `advance` does not exceed `self.len()` by construction
192+
unsafe { self.post_inc_start(advance as isize) };
193+
if advance == n { Ok(()) } else { Err(advance) }
194+
}
195+
188196
#[inline]
189197
fn last(mut self) -> Option<$elem> {
190198
self.next_back()
@@ -371,6 +379,14 @@ macro_rules! iterator {
371379
Some(next_back_unchecked!(self))
372380
}
373381
}
382+
383+
#[inline]
384+
fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
385+
let advance = cmp::min(n, len!(self));
386+
// SAFETY: `advance` does not exceed `self.len()` by construction
387+
unsafe { self.pre_dec_end(advance as isize) };
388+
if advance == n { Ok(()) } else { Err(advance) }
389+
}
374390
}
375391

376392
#[stable(feature = "fused", since = "1.26.0")]

0 commit comments

Comments
 (0)