Skip to content
/ rust Public
forked from rust-lang/rust

Commit c02f88a

Browse files
authored
Rollup merge of rust-lang#160342 - a1phyr:fuse_advnce_by, r=joboet
Specialize `advance_by` method of `Fuse` `advance_by` is used a lot internally so it seems important to specialize it.
2 parents 61dab2a + 7d0aafd commit c02f88a

1 file changed

Lines changed: 33 additions & 0 deletions

File tree

  • library/core/src/iter/adapters

library/core/src/iter/adapters/fuse.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::iter::adapters::zip::try_get_unchecked;
44
use crate::iter::{
55
FusedIterator, TrustedFused, TrustedLen, TrustedRandomAccess, TrustedRandomAccessNoCoerce,
66
};
7+
use crate::num::NonZero;
78
use crate::ops::Try;
89

910
/// An iterator that yields `None` forever after the underlying iterator
@@ -50,6 +51,10 @@ where
5051
FuseImpl::next(self)
5152
}
5253

54+
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
55+
FuseImpl::advance_by(self, n)
56+
}
57+
5358
#[inline]
5459
fn nth(&mut self, n: usize) -> Option<I::Item> {
5560
FuseImpl::nth(self, n)
@@ -259,6 +264,7 @@ trait FuseImpl<I> {
259264

260265
// Functions specific to any normal Iterators
261266
fn next(&mut self) -> Option<Self::Item>;
267+
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>>;
262268
fn nth(&mut self, n: usize) -> Option<Self::Item>;
263269
fn try_fold<Acc, Fold, R>(&mut self, acc: Acc, fold: Fold) -> R
264270
where
@@ -301,6 +307,22 @@ where
301307
and_then_or_clear(&mut self.iter, Iterator::next)
302308
}
303309

310+
#[inline]
311+
default fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
312+
let Some(iter) = &mut self.iter else {
313+
return match NonZero::new(n) {
314+
Some(n) => Err(n),
315+
None => Ok(()),
316+
};
317+
};
318+
319+
let res = iter.advance_by(n);
320+
if res.is_err() {
321+
self.iter = None;
322+
}
323+
res
324+
}
325+
304326
#[inline]
305327
default fn nth(&mut self, n: usize) -> Option<I::Item> {
306328
and_then_or_clear(&mut self.iter, |iter| iter.nth(n))
@@ -381,6 +403,17 @@ where
381403
self.iter.as_mut()?.next()
382404
}
383405

406+
#[inline]
407+
fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
408+
match &mut self.iter {
409+
Some(iter) => iter.advance_by(n),
410+
None => match NonZero::new(n) {
411+
Some(n) => Err(n),
412+
None => Ok(()),
413+
},
414+
}
415+
}
416+
384417
#[inline]
385418
fn nth(&mut self, n: usize) -> Option<I::Item> {
386419
self.iter.as_mut()?.nth(n)

0 commit comments

Comments
 (0)