Skip to content

Commit 5b834eb

Browse files
committed
Implement slice::{Iter, IterMut}::{advance_by, advance_back_by}
1 parent 9fdaeb3 commit 5b834eb

File tree

1 file changed

+10
-31
lines changed

1 file changed

+10
-31
lines changed

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

+10-31
Original file line numberDiff line numberDiff line change
@@ -163,26 +163,11 @@ macro_rules! iterator {
163163
}
164164

165165
#[inline]
166-
fn nth(&mut self, n: usize) -> Option<$elem> {
167-
if n >= len!(self) {
168-
// This iterator is now empty.
169-
if mem::size_of::<T>() == 0 {
170-
// We have to do it this way as `ptr` may never be 0, but `end`
171-
// could be (due to wrapping).
172-
self.end = self.ptr.as_ptr();
173-
} else {
174-
// SAFETY: end can't be 0 if T isn't ZST because ptr isn't 0 and end >= ptr
175-
unsafe {
176-
self.ptr = NonNull::new_unchecked(self.end as *mut T);
177-
}
178-
}
179-
return None;
180-
}
181-
// SAFETY: We are in bounds. `post_inc_start` does the right thing even for ZSTs.
182-
unsafe {
183-
self.post_inc_start(n as isize);
184-
Some(next_unchecked!(self))
185-
}
166+
fn advance_by(&mut self, n: usize) -> Result<(), usize>{
167+
let advance = cmp::min(n, len!(self));
168+
// SAFETY: `advance` does not exceed `self.len()` by construction
169+
unsafe { self.post_inc_start(advance as isize) };
170+
if advance == n { Ok(()) } else { Err(advance) }
186171
}
187172

188173
#[inline]
@@ -359,17 +344,11 @@ macro_rules! iterator {
359344
}
360345

361346
#[inline]
362-
fn nth_back(&mut self, n: usize) -> Option<$elem> {
363-
if n >= len!(self) {
364-
// This iterator is now empty.
365-
self.end = self.ptr.as_ptr();
366-
return None;
367-
}
368-
// SAFETY: We are in bounds. `pre_dec_end` does the right thing even for ZSTs.
369-
unsafe {
370-
self.pre_dec_end(n as isize);
371-
Some(next_back_unchecked!(self))
372-
}
347+
fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
348+
let advance = cmp::min(n, len!(self));
349+
// SAFETY: `advance` does not exceed `self.len()` by construction
350+
unsafe { self.pre_dec_end(advance as isize) };
351+
if advance == n { Ok(()) } else { Err(advance) }
373352
}
374353
}
375354

0 commit comments

Comments
 (0)