]> git.proxmox.com Git - rustc.git/blame - src/libcore/iter/adapters/mod.rs
New upstream version 1.35.0+dfsg1
[rustc.git] / src / libcore / iter / adapters / mod.rs
CommitLineData
9fa01778
XL
1use cmp;
2use fmt;
3use ops::Try;
4use usize;
5use intrinsics;
6use super::{Iterator, DoubleEndedIterator, ExactSizeIterator, FusedIterator, TrustedLen};
7use super::LoopState;
8
9mod chain;
10mod flatten;
11mod zip;
12
13pub use self::chain::Chain;
14#[stable(feature = "rust1", since = "1.0.0")]
15pub use self::flatten::{FlatMap, Flatten};
16pub use self::zip::Zip;
17pub(crate) use self::zip::TrustedRandomAccess;
18
19/// A double-ended iterator with the direction inverted.
20///
21/// This `struct` is created by the [`rev`] method on [`Iterator`]. See its
22/// documentation for more.
23///
24/// [`rev`]: trait.Iterator.html#method.rev
25/// [`Iterator`]: trait.Iterator.html
26#[derive(Clone, Debug)]
27#[must_use = "iterators are lazy and do nothing unless consumed"]
28#[stable(feature = "rust1", since = "1.0.0")]
29pub struct Rev<T> {
30 iter: T
31}
32impl<T> Rev<T> {
33 pub(super) fn new(iter: T) -> Rev<T> {
34 Rev { iter }
35 }
36}
37
38#[stable(feature = "rust1", since = "1.0.0")]
39impl<I> Iterator for Rev<I> where I: DoubleEndedIterator {
40 type Item = <I as Iterator>::Item;
41
42 #[inline]
43 fn next(&mut self) -> Option<<I as Iterator>::Item> { self.iter.next_back() }
44 #[inline]
45 fn size_hint(&self) -> (usize, Option<usize>) { self.iter.size_hint() }
46
47 #[inline]
48 fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item> { self.iter.nth_back(n) }
49
50 fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R where
51 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
52 {
53 self.iter.try_rfold(init, f)
54 }
55
56 fn fold<Acc, F>(self, init: Acc, f: F) -> Acc
57 where F: FnMut(Acc, Self::Item) -> Acc,
58 {
59 self.iter.rfold(init, f)
60 }
61
62 #[inline]
63 fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
64 where P: FnMut(&Self::Item) -> bool
65 {
66 self.iter.rfind(predicate)
67 }
68
69 #[inline]
70 fn rposition<P>(&mut self, predicate: P) -> Option<usize> where
71 P: FnMut(Self::Item) -> bool
72 {
73 self.iter.position(predicate)
74 }
75}
76
77#[stable(feature = "rust1", since = "1.0.0")]
78impl<I> DoubleEndedIterator for Rev<I> where I: DoubleEndedIterator {
79 #[inline]
80 fn next_back(&mut self) -> Option<<I as Iterator>::Item> { self.iter.next() }
81
82 #[inline]
83 fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> { self.iter.nth(n) }
84
85 fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R where
86 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
87 {
88 self.iter.try_fold(init, f)
89 }
90
91 fn rfold<Acc, F>(self, init: Acc, f: F) -> Acc
92 where F: FnMut(Acc, Self::Item) -> Acc,
93 {
94 self.iter.fold(init, f)
95 }
96
97 fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
98 where P: FnMut(&Self::Item) -> bool
99 {
100 self.iter.find(predicate)
101 }
102}
103
104#[stable(feature = "rust1", since = "1.0.0")]
105impl<I> ExactSizeIterator for Rev<I>
106 where I: ExactSizeIterator + DoubleEndedIterator
107{
108 fn len(&self) -> usize {
109 self.iter.len()
110 }
111
112 fn is_empty(&self) -> bool {
113 self.iter.is_empty()
114 }
115}
116
117#[stable(feature = "fused", since = "1.26.0")]
118impl<I> FusedIterator for Rev<I>
119 where I: FusedIterator + DoubleEndedIterator {}
120
121#[unstable(feature = "trusted_len", issue = "37572")]
122unsafe impl<I> TrustedLen for Rev<I>
123 where I: TrustedLen + DoubleEndedIterator {}
124
125/// An iterator that copies the elements of an underlying iterator.
126///
127/// This `struct` is created by the [`copied`] method on [`Iterator`]. See its
128/// documentation for more.
129///
130/// [`copied`]: trait.Iterator.html#method.copied
131/// [`Iterator`]: trait.Iterator.html
132#[unstable(feature = "iter_copied", issue = "57127")]
133#[must_use = "iterators are lazy and do nothing unless consumed"]
134#[derive(Clone, Debug)]
135pub struct Copied<I> {
136 it: I,
137}
138impl<I> Copied<I> {
139 pub(super) fn new(it: I) -> Copied<I> {
140 Copied { it }
141 }
142}
143
144#[unstable(feature = "iter_copied", issue = "57127")]
145impl<'a, I, T: 'a> Iterator for Copied<I>
146 where I: Iterator<Item=&'a T>, T: Copy
147{
148 type Item = T;
149
150 fn next(&mut self) -> Option<T> {
151 self.it.next().copied()
152 }
153
154 fn size_hint(&self) -> (usize, Option<usize>) {
155 self.it.size_hint()
156 }
157
158 fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
159 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
160 {
161 self.it.try_fold(init, move |acc, &elt| f(acc, elt))
162 }
163
164 fn fold<Acc, F>(self, init: Acc, mut f: F) -> Acc
165 where F: FnMut(Acc, Self::Item) -> Acc,
166 {
167 self.it.fold(init, move |acc, &elt| f(acc, elt))
168 }
169}
170
171#[unstable(feature = "iter_copied", issue = "57127")]
172impl<'a, I, T: 'a> DoubleEndedIterator for Copied<I>
173 where I: DoubleEndedIterator<Item=&'a T>, T: Copy
174{
175 fn next_back(&mut self) -> Option<T> {
176 self.it.next_back().copied()
177 }
178
179 fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
180 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
181 {
182 self.it.try_rfold(init, move |acc, &elt| f(acc, elt))
183 }
184
185 fn rfold<Acc, F>(self, init: Acc, mut f: F) -> Acc
186 where F: FnMut(Acc, Self::Item) -> Acc,
187 {
188 self.it.rfold(init, move |acc, &elt| f(acc, elt))
189 }
190}
191
192#[unstable(feature = "iter_copied", issue = "57127")]
193impl<'a, I, T: 'a> ExactSizeIterator for Copied<I>
194 where I: ExactSizeIterator<Item=&'a T>, T: Copy
195{
196 fn len(&self) -> usize {
197 self.it.len()
198 }
199
200 fn is_empty(&self) -> bool {
201 self.it.is_empty()
202 }
203}
204
205#[unstable(feature = "iter_copied", issue = "57127")]
206impl<'a, I, T: 'a> FusedIterator for Copied<I>
207 where I: FusedIterator<Item=&'a T>, T: Copy
208{}
209
210#[doc(hidden)]
211unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Copied<I>
212 where I: TrustedRandomAccess<Item=&'a T>, T: Copy
213{
214 unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
215 *self.it.get_unchecked(i)
216 }
217
218 #[inline]
219 fn may_have_side_effect() -> bool {
220 I::may_have_side_effect()
221 }
222}
223
224#[unstable(feature = "iter_copied", issue = "57127")]
225unsafe impl<'a, I, T: 'a> TrustedLen for Copied<I>
226 where I: TrustedLen<Item=&'a T>,
227 T: Copy
228{}
229
230/// An iterator that clones the elements of an underlying iterator.
231///
232/// This `struct` is created by the [`cloned`] method on [`Iterator`]. See its
233/// documentation for more.
234///
235/// [`cloned`]: trait.Iterator.html#method.cloned
236/// [`Iterator`]: trait.Iterator.html
237#[stable(feature = "iter_cloned", since = "1.1.0")]
238#[must_use = "iterators are lazy and do nothing unless consumed"]
239#[derive(Clone, Debug)]
240pub struct Cloned<I> {
241 it: I,
242}
243impl<I> Cloned<I> {
244 pub(super) fn new(it: I) -> Cloned<I> {
245 Cloned { it }
246 }
247}
248
249#[stable(feature = "iter_cloned", since = "1.1.0")]
250impl<'a, I, T: 'a> Iterator for Cloned<I>
251 where I: Iterator<Item=&'a T>, T: Clone
252{
253 type Item = T;
254
255 fn next(&mut self) -> Option<T> {
256 self.it.next().cloned()
257 }
258
259 fn size_hint(&self) -> (usize, Option<usize>) {
260 self.it.size_hint()
261 }
262
263 fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
264 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
265 {
266 self.it.try_fold(init, move |acc, elt| f(acc, elt.clone()))
267 }
268
269 fn fold<Acc, F>(self, init: Acc, mut f: F) -> Acc
270 where F: FnMut(Acc, Self::Item) -> Acc,
271 {
272 self.it.fold(init, move |acc, elt| f(acc, elt.clone()))
273 }
274}
275
276#[stable(feature = "iter_cloned", since = "1.1.0")]
277impl<'a, I, T: 'a> DoubleEndedIterator for Cloned<I>
278 where I: DoubleEndedIterator<Item=&'a T>, T: Clone
279{
280 fn next_back(&mut self) -> Option<T> {
281 self.it.next_back().cloned()
282 }
283
284 fn try_rfold<B, F, R>(&mut self, init: B, mut f: F) -> R where
285 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
286 {
287 self.it.try_rfold(init, move |acc, elt| f(acc, elt.clone()))
288 }
289
290 fn rfold<Acc, F>(self, init: Acc, mut f: F) -> Acc
291 where F: FnMut(Acc, Self::Item) -> Acc,
292 {
293 self.it.rfold(init, move |acc, elt| f(acc, elt.clone()))
294 }
295}
296
297#[stable(feature = "iter_cloned", since = "1.1.0")]
298impl<'a, I, T: 'a> ExactSizeIterator for Cloned<I>
299 where I: ExactSizeIterator<Item=&'a T>, T: Clone
300{
301 fn len(&self) -> usize {
302 self.it.len()
303 }
304
305 fn is_empty(&self) -> bool {
306 self.it.is_empty()
307 }
308}
309
310#[stable(feature = "fused", since = "1.26.0")]
311impl<'a, I, T: 'a> FusedIterator for Cloned<I>
312 where I: FusedIterator<Item=&'a T>, T: Clone
313{}
314
315#[doc(hidden)]
316unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
317 where I: TrustedRandomAccess<Item=&'a T>, T: Clone
318{
319 default unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
320 self.it.get_unchecked(i).clone()
321 }
322
323 #[inline]
324 default fn may_have_side_effect() -> bool { true }
325}
326
327#[doc(hidden)]
328unsafe impl<'a, I, T: 'a> TrustedRandomAccess for Cloned<I>
329 where I: TrustedRandomAccess<Item=&'a T>, T: Copy
330{
331 unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
332 *self.it.get_unchecked(i)
333 }
334
335 #[inline]
336 fn may_have_side_effect() -> bool {
337 I::may_have_side_effect()
338 }
339}
340
341#[unstable(feature = "trusted_len", issue = "37572")]
342unsafe impl<'a, I, T: 'a> TrustedLen for Cloned<I>
343 where I: TrustedLen<Item=&'a T>,
344 T: Clone
345{}
346
347/// An iterator that repeats endlessly.
348///
349/// This `struct` is created by the [`cycle`] method on [`Iterator`]. See its
350/// documentation for more.
351///
352/// [`cycle`]: trait.Iterator.html#method.cycle
353/// [`Iterator`]: trait.Iterator.html
354#[derive(Clone, Debug)]
355#[must_use = "iterators are lazy and do nothing unless consumed"]
356#[stable(feature = "rust1", since = "1.0.0")]
357pub struct Cycle<I> {
358 orig: I,
359 iter: I,
360}
361impl<I: Clone> Cycle<I> {
362 pub(super) fn new(iter: I) -> Cycle<I> {
363 Cycle { orig: iter.clone(), iter }
364 }
365}
366
367#[stable(feature = "rust1", since = "1.0.0")]
368impl<I> Iterator for Cycle<I> where I: Clone + Iterator {
369 type Item = <I as Iterator>::Item;
370
371 #[inline]
372 fn next(&mut self) -> Option<<I as Iterator>::Item> {
373 match self.iter.next() {
374 None => { self.iter = self.orig.clone(); self.iter.next() }
375 y => y
376 }
377 }
378
379 #[inline]
380 fn size_hint(&self) -> (usize, Option<usize>) {
381 // the cycle iterator is either empty or infinite
382 match self.orig.size_hint() {
383 sz @ (0, Some(0)) => sz,
384 (0, _) => (0, None),
385 _ => (usize::MAX, None)
386 }
387 }
388}
389
390#[stable(feature = "fused", since = "1.26.0")]
391impl<I> FusedIterator for Cycle<I> where I: Clone + Iterator {}
392
393/// An iterator for stepping iterators by a custom amount.
394///
395/// This `struct` is created by the [`step_by`] method on [`Iterator`]. See
396/// its documentation for more.
397///
398/// [`step_by`]: trait.Iterator.html#method.step_by
399/// [`Iterator`]: trait.Iterator.html
400#[must_use = "iterators are lazy and do nothing unless consumed"]
401#[stable(feature = "iterator_step_by", since = "1.28.0")]
402#[derive(Clone, Debug)]
403pub struct StepBy<I> {
404 iter: I,
405 step: usize,
406 first_take: bool,
407}
408impl<I> StepBy<I> {
409 pub(super) fn new(iter: I, step: usize) -> StepBy<I> {
410 assert!(step != 0);
411 StepBy { iter, step: step - 1, first_take: true }
412 }
413}
414
415#[stable(feature = "iterator_step_by", since = "1.28.0")]
416impl<I> Iterator for StepBy<I> where I: Iterator {
417 type Item = I::Item;
418
419 #[inline]
420 fn next(&mut self) -> Option<Self::Item> {
421 if self.first_take {
422 self.first_take = false;
423 self.iter.next()
424 } else {
425 self.iter.nth(self.step)
426 }
427 }
428
429 #[inline]
430 fn size_hint(&self) -> (usize, Option<usize>) {
431 let inner_hint = self.iter.size_hint();
432
433 if self.first_take {
434 let f = |n| if n == 0 { 0 } else { 1 + (n-1)/(self.step+1) };
435 (f(inner_hint.0), inner_hint.1.map(f))
436 } else {
437 let f = |n| n / (self.step+1);
438 (f(inner_hint.0), inner_hint.1.map(f))
439 }
440 }
441
442 #[inline]
443 fn nth(&mut self, mut n: usize) -> Option<Self::Item> {
444 if self.first_take {
445 self.first_take = false;
446 let first = self.iter.next();
447 if n == 0 {
448 return first;
449 }
450 n -= 1;
451 }
452 // n and self.step are indices, we need to add 1 to get the amount of elements
453 // When calling `.nth`, we need to subtract 1 again to convert back to an index
454 // step + 1 can't overflow because `.step_by` sets `self.step` to `step - 1`
455 let mut step = self.step + 1;
456 // n + 1 could overflow
457 // thus, if n is usize::MAX, instead of adding one, we call .nth(step)
458 if n == usize::MAX {
459 self.iter.nth(step - 1);
460 } else {
461 n += 1;
462 }
463
464 // overflow handling
465 loop {
466 let mul = n.checked_mul(step);
467 if unsafe { intrinsics::likely(mul.is_some()) } {
468 return self.iter.nth(mul.unwrap() - 1);
469 }
470 let div_n = usize::MAX / n;
471 let div_step = usize::MAX / step;
472 let nth_n = div_n * n;
473 let nth_step = div_step * step;
474 let nth = if nth_n > nth_step {
475 step -= div_n;
476 nth_n
477 } else {
478 n -= div_step;
479 nth_step
480 };
481 self.iter.nth(nth - 1);
482 }
483 }
484}
485
486// StepBy can only make the iterator shorter, so the len will still fit.
487#[stable(feature = "iterator_step_by", since = "1.28.0")]
488impl<I> ExactSizeIterator for StepBy<I> where I: ExactSizeIterator {}
489
490/// An iterator that maps the values of `iter` with `f`.
491///
492/// This `struct` is created by the [`map`] method on [`Iterator`]. See its
493/// documentation for more.
494///
495/// [`map`]: trait.Iterator.html#method.map
496/// [`Iterator`]: trait.Iterator.html
497///
498/// # Notes about side effects
499///
500/// The [`map`] iterator implements [`DoubleEndedIterator`], meaning that
501/// you can also [`map`] backwards:
502///
503/// ```rust
504/// let v: Vec<i32> = vec![1, 2, 3].into_iter().map(|x| x + 1).rev().collect();
505///
506/// assert_eq!(v, [4, 3, 2]);
507/// ```
508///
509/// [`DoubleEndedIterator`]: trait.DoubleEndedIterator.html
510///
511/// But if your closure has state, iterating backwards may act in a way you do
512/// not expect. Let's go through an example. First, in the forward direction:
513///
514/// ```rust
515/// let mut c = 0;
516///
517/// for pair in vec!['a', 'b', 'c'].into_iter()
518/// .map(|letter| { c += 1; (letter, c) }) {
519/// println!("{:?}", pair);
520/// }
521/// ```
522///
523/// This will print "('a', 1), ('b', 2), ('c', 3)".
524///
525/// Now consider this twist where we add a call to `rev`. This version will
526/// print `('c', 1), ('b', 2), ('a', 3)`. Note that the letters are reversed,
527/// but the values of the counter still go in order. This is because `map()` is
528/// still being called lazily on each item, but we are popping items off the
529/// back of the vector now, instead of shifting them from the front.
530///
531/// ```rust
532/// let mut c = 0;
533///
534/// for pair in vec!['a', 'b', 'c'].into_iter()
535/// .map(|letter| { c += 1; (letter, c) })
536/// .rev() {
537/// println!("{:?}", pair);
538/// }
539/// ```
540#[must_use = "iterators are lazy and do nothing unless consumed"]
541#[stable(feature = "rust1", since = "1.0.0")]
542#[derive(Clone)]
543pub struct Map<I, F> {
544 iter: I,
545 f: F,
546}
547impl<I, F> Map<I, F> {
548 pub(super) fn new(iter: I, f: F) -> Map<I, F> {
549 Map { iter, f }
550 }
551}
552
553#[stable(feature = "core_impl_debug", since = "1.9.0")]
554impl<I: fmt::Debug, F> fmt::Debug for Map<I, F> {
555 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
556 f.debug_struct("Map")
557 .field("iter", &self.iter)
558 .finish()
559 }
560}
561
562#[stable(feature = "rust1", since = "1.0.0")]
563impl<B, I: Iterator, F> Iterator for Map<I, F> where F: FnMut(I::Item) -> B {
564 type Item = B;
565
566 #[inline]
567 fn next(&mut self) -> Option<B> {
568 self.iter.next().map(&mut self.f)
569 }
570
571 #[inline]
572 fn size_hint(&self) -> (usize, Option<usize>) {
573 self.iter.size_hint()
574 }
575
576 fn try_fold<Acc, G, R>(&mut self, init: Acc, mut g: G) -> R where
577 Self: Sized, G: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
578 {
579 let f = &mut self.f;
580 self.iter.try_fold(init, move |acc, elt| g(acc, f(elt)))
581 }
582
583 fn fold<Acc, G>(self, init: Acc, mut g: G) -> Acc
584 where G: FnMut(Acc, Self::Item) -> Acc,
585 {
586 let mut f = self.f;
587 self.iter.fold(init, move |acc, elt| g(acc, f(elt)))
588 }
589}
590
591#[stable(feature = "rust1", since = "1.0.0")]
592impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for Map<I, F> where
593 F: FnMut(I::Item) -> B,
594{
595 #[inline]
596 fn next_back(&mut self) -> Option<B> {
597 self.iter.next_back().map(&mut self.f)
598 }
599
600 fn try_rfold<Acc, G, R>(&mut self, init: Acc, mut g: G) -> R where
601 Self: Sized, G: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
602 {
603 let f = &mut self.f;
604 self.iter.try_rfold(init, move |acc, elt| g(acc, f(elt)))
605 }
606
607 fn rfold<Acc, G>(self, init: Acc, mut g: G) -> Acc
608 where G: FnMut(Acc, Self::Item) -> Acc,
609 {
610 let mut f = self.f;
611 self.iter.rfold(init, move |acc, elt| g(acc, f(elt)))
612 }
613}
614
615#[stable(feature = "rust1", since = "1.0.0")]
616impl<B, I: ExactSizeIterator, F> ExactSizeIterator for Map<I, F>
617 where F: FnMut(I::Item) -> B
618{
619 fn len(&self) -> usize {
620 self.iter.len()
621 }
622
623 fn is_empty(&self) -> bool {
624 self.iter.is_empty()
625 }
626}
627
628#[stable(feature = "fused", since = "1.26.0")]
629impl<B, I: FusedIterator, F> FusedIterator for Map<I, F>
630 where F: FnMut(I::Item) -> B {}
631
632#[unstable(feature = "trusted_len", issue = "37572")]
633unsafe impl<B, I, F> TrustedLen for Map<I, F>
634 where I: TrustedLen,
635 F: FnMut(I::Item) -> B {}
636
637#[doc(hidden)]
638unsafe impl<B, I, F> TrustedRandomAccess for Map<I, F>
639 where I: TrustedRandomAccess,
640 F: FnMut(I::Item) -> B,
641{
642 unsafe fn get_unchecked(&mut self, i: usize) -> Self::Item {
643 (self.f)(self.iter.get_unchecked(i))
644 }
645 #[inline]
646 fn may_have_side_effect() -> bool { true }
647}
648
649/// An iterator that filters the elements of `iter` with `predicate`.
650///
651/// This `struct` is created by the [`filter`] method on [`Iterator`]. See its
652/// documentation for more.
653///
654/// [`filter`]: trait.Iterator.html#method.filter
655/// [`Iterator`]: trait.Iterator.html
656#[must_use = "iterators are lazy and do nothing unless consumed"]
657#[stable(feature = "rust1", since = "1.0.0")]
658#[derive(Clone)]
659pub struct Filter<I, P> {
660 iter: I,
661 predicate: P,
662}
663impl<I, P> Filter<I, P> {
664 pub(super) fn new(iter: I, predicate: P) -> Filter<I, P> {
665 Filter { iter, predicate }
666 }
667}
668
669#[stable(feature = "core_impl_debug", since = "1.9.0")]
670impl<I: fmt::Debug, P> fmt::Debug for Filter<I, P> {
671 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
672 f.debug_struct("Filter")
673 .field("iter", &self.iter)
674 .finish()
675 }
676}
677
678#[stable(feature = "rust1", since = "1.0.0")]
679impl<I: Iterator, P> Iterator for Filter<I, P> where P: FnMut(&I::Item) -> bool {
680 type Item = I::Item;
681
682 #[inline]
683 fn next(&mut self) -> Option<I::Item> {
532ac7d7 684 self.try_for_each(Err).err()
9fa01778
XL
685 }
686
687 #[inline]
688 fn size_hint(&self) -> (usize, Option<usize>) {
689 let (_, upper) = self.iter.size_hint();
690 (0, upper) // can't know a lower bound, due to the predicate
691 }
692
693 // this special case allows the compiler to make `.filter(_).count()`
694 // branchless. Barring perfect branch prediction (which is unattainable in
695 // the general case), this will be much faster in >90% of cases (containing
696 // virtually all real workloads) and only a tiny bit slower in the rest.
697 //
698 // Having this specialization thus allows us to write `.filter(p).count()`
699 // where we would otherwise write `.map(|x| p(x) as usize).sum()`, which is
700 // less readable and also less backwards-compatible to Rust before 1.10.
701 //
702 // Using the branchless version will also simplify the LLVM byte code, thus
703 // leaving more budget for LLVM optimizations.
704 #[inline]
532ac7d7
XL
705 fn count(self) -> usize {
706 let mut predicate = self.predicate;
707 self.iter.map(|x| predicate(&x) as usize).sum()
9fa01778
XL
708 }
709
710 #[inline]
711 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
712 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
713 {
714 let predicate = &mut self.predicate;
715 self.iter.try_fold(init, move |acc, item| if predicate(&item) {
716 fold(acc, item)
717 } else {
718 Try::from_ok(acc)
719 })
720 }
721
722 #[inline]
723 fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
724 where Fold: FnMut(Acc, Self::Item) -> Acc,
725 {
726 let mut predicate = self.predicate;
727 self.iter.fold(init, move |acc, item| if predicate(&item) {
728 fold(acc, item)
729 } else {
730 acc
731 })
732 }
733}
734
735#[stable(feature = "rust1", since = "1.0.0")]
736impl<I: DoubleEndedIterator, P> DoubleEndedIterator for Filter<I, P>
737 where P: FnMut(&I::Item) -> bool,
738{
739 #[inline]
740 fn next_back(&mut self) -> Option<I::Item> {
532ac7d7 741 self.try_rfold((), |_, x| Err(x)).err()
9fa01778
XL
742 }
743
744 #[inline]
745 fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
746 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
747 {
748 let predicate = &mut self.predicate;
749 self.iter.try_rfold(init, move |acc, item| if predicate(&item) {
750 fold(acc, item)
751 } else {
752 Try::from_ok(acc)
753 })
754 }
755
756 #[inline]
757 fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
758 where Fold: FnMut(Acc, Self::Item) -> Acc,
759 {
760 let mut predicate = self.predicate;
761 self.iter.rfold(init, move |acc, item| if predicate(&item) {
762 fold(acc, item)
763 } else {
764 acc
765 })
766 }
767}
768
769#[stable(feature = "fused", since = "1.26.0")]
770impl<I: FusedIterator, P> FusedIterator for Filter<I, P>
771 where P: FnMut(&I::Item) -> bool {}
772
773/// An iterator that uses `f` to both filter and map elements from `iter`.
774///
775/// This `struct` is created by the [`filter_map`] method on [`Iterator`]. See its
776/// documentation for more.
777///
778/// [`filter_map`]: trait.Iterator.html#method.filter_map
779/// [`Iterator`]: trait.Iterator.html
780#[must_use = "iterators are lazy and do nothing unless consumed"]
781#[stable(feature = "rust1", since = "1.0.0")]
782#[derive(Clone)]
783pub struct FilterMap<I, F> {
784 iter: I,
785 f: F,
786}
787impl<I, F> FilterMap<I, F> {
788 pub(super) fn new(iter: I, f: F) -> FilterMap<I, F> {
789 FilterMap { iter, f }
790 }
791}
792
793#[stable(feature = "core_impl_debug", since = "1.9.0")]
794impl<I: fmt::Debug, F> fmt::Debug for FilterMap<I, F> {
795 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
796 f.debug_struct("FilterMap")
797 .field("iter", &self.iter)
798 .finish()
799 }
800}
801
802#[stable(feature = "rust1", since = "1.0.0")]
803impl<B, I: Iterator, F> Iterator for FilterMap<I, F>
804 where F: FnMut(I::Item) -> Option<B>,
805{
806 type Item = B;
807
808 #[inline]
809 fn next(&mut self) -> Option<B> {
532ac7d7 810 self.try_for_each(Err).err()
9fa01778
XL
811 }
812
813 #[inline]
814 fn size_hint(&self) -> (usize, Option<usize>) {
815 let (_, upper) = self.iter.size_hint();
816 (0, upper) // can't know a lower bound, due to the predicate
817 }
818
819 #[inline]
820 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
821 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
822 {
823 let f = &mut self.f;
824 self.iter.try_fold(init, move |acc, item| match f(item) {
825 Some(x) => fold(acc, x),
826 None => Try::from_ok(acc),
827 })
828 }
829
830 #[inline]
831 fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
832 where Fold: FnMut(Acc, Self::Item) -> Acc,
833 {
834 let mut f = self.f;
835 self.iter.fold(init, move |acc, item| match f(item) {
836 Some(x) => fold(acc, x),
837 None => acc,
838 })
839 }
840}
841
842#[stable(feature = "rust1", since = "1.0.0")]
843impl<B, I: DoubleEndedIterator, F> DoubleEndedIterator for FilterMap<I, F>
844 where F: FnMut(I::Item) -> Option<B>,
845{
846 #[inline]
847 fn next_back(&mut self) -> Option<B> {
532ac7d7 848 self.try_rfold((), |_, x| Err(x)).err()
9fa01778
XL
849 }
850
851 #[inline]
852 fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
853 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
854 {
855 let f = &mut self.f;
856 self.iter.try_rfold(init, move |acc, item| match f(item) {
857 Some(x) => fold(acc, x),
858 None => Try::from_ok(acc),
859 })
860 }
861
862 #[inline]
863 fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
864 where Fold: FnMut(Acc, Self::Item) -> Acc,
865 {
866 let mut f = self.f;
867 self.iter.rfold(init, move |acc, item| match f(item) {
868 Some(x) => fold(acc, x),
869 None => acc,
870 })
871 }
872}
873
874#[stable(feature = "fused", since = "1.26.0")]
875impl<B, I: FusedIterator, F> FusedIterator for FilterMap<I, F>
876 where F: FnMut(I::Item) -> Option<B> {}
877
878/// An iterator that yields the current count and the element during iteration.
879///
880/// This `struct` is created by the [`enumerate`] method on [`Iterator`]. See its
881/// documentation for more.
882///
883/// [`enumerate`]: trait.Iterator.html#method.enumerate
884/// [`Iterator`]: trait.Iterator.html
885#[derive(Clone, Debug)]
886#[must_use = "iterators are lazy and do nothing unless consumed"]
887#[stable(feature = "rust1", since = "1.0.0")]
888pub struct Enumerate<I> {
889 iter: I,
890 count: usize,
891}
892impl<I> Enumerate<I> {
893 pub(super) fn new(iter: I) -> Enumerate<I> {
894 Enumerate { iter, count: 0 }
895 }
896}
897
898#[stable(feature = "rust1", since = "1.0.0")]
899impl<I> Iterator for Enumerate<I> where I: Iterator {
900 type Item = (usize, <I as Iterator>::Item);
901
902 /// # Overflow Behavior
903 ///
904 /// The method does no guarding against overflows, so enumerating more than
905 /// `usize::MAX` elements either produces the wrong result or panics. If
906 /// debug assertions are enabled, a panic is guaranteed.
907 ///
908 /// # Panics
909 ///
910 /// Might panic if the index of the element overflows a `usize`.
911 #[inline]
912 #[rustc_inherit_overflow_checks]
913 fn next(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
914 self.iter.next().map(|a| {
915 let ret = (self.count, a);
916 // Possible undefined overflow.
917 self.count += 1;
918 ret
919 })
920 }
921
922 #[inline]
923 fn size_hint(&self) -> (usize, Option<usize>) {
924 self.iter.size_hint()
925 }
926
927 #[inline]
928 #[rustc_inherit_overflow_checks]
929 fn nth(&mut self, n: usize) -> Option<(usize, I::Item)> {
930 self.iter.nth(n).map(|a| {
931 let i = self.count + n;
932 self.count = i + 1;
933 (i, a)
934 })
935 }
936
937 #[inline]
938 fn count(self) -> usize {
939 self.iter.count()
940 }
941
942 #[inline]
943 #[rustc_inherit_overflow_checks]
944 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
945 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
946 {
947 let count = &mut self.count;
948 self.iter.try_fold(init, move |acc, item| {
949 let acc = fold(acc, (*count, item));
950 *count += 1;
951 acc
952 })
953 }
954
955 #[inline]
956 #[rustc_inherit_overflow_checks]
957 fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
958 where Fold: FnMut(Acc, Self::Item) -> Acc,
959 {
960 let mut count = self.count;
961 self.iter.fold(init, move |acc, item| {
962 let acc = fold(acc, (count, item));
963 count += 1;
964 acc
965 })
966 }
967}
968
969#[stable(feature = "rust1", since = "1.0.0")]
970impl<I> DoubleEndedIterator for Enumerate<I> where
971 I: ExactSizeIterator + DoubleEndedIterator
972{
973 #[inline]
974 fn next_back(&mut self) -> Option<(usize, <I as Iterator>::Item)> {
975 self.iter.next_back().map(|a| {
976 let len = self.iter.len();
977 // Can safely add, `ExactSizeIterator` promises that the number of
978 // elements fits into a `usize`.
979 (self.count + len, a)
980 })
981 }
982
983 #[inline]
984 fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
985 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
986 {
987 // Can safely add and subtract the count, as `ExactSizeIterator` promises
988 // that the number of elements fits into a `usize`.
989 let mut count = self.count + self.iter.len();
990 self.iter.try_rfold(init, move |acc, item| {
991 count -= 1;
992 fold(acc, (count, item))
993 })
994 }
995
996 #[inline]
997 fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
998 where Fold: FnMut(Acc, Self::Item) -> Acc,
999 {
1000 // Can safely add and subtract the count, as `ExactSizeIterator` promises
1001 // that the number of elements fits into a `usize`.
1002 let mut count = self.count + self.iter.len();
1003 self.iter.rfold(init, move |acc, item| {
1004 count -= 1;
1005 fold(acc, (count, item))
1006 })
1007 }
1008}
1009
1010#[stable(feature = "rust1", since = "1.0.0")]
1011impl<I> ExactSizeIterator for Enumerate<I> where I: ExactSizeIterator {
1012 fn len(&self) -> usize {
1013 self.iter.len()
1014 }
1015
1016 fn is_empty(&self) -> bool {
1017 self.iter.is_empty()
1018 }
1019}
1020
1021#[doc(hidden)]
1022unsafe impl<I> TrustedRandomAccess for Enumerate<I>
1023 where I: TrustedRandomAccess
1024{
1025 unsafe fn get_unchecked(&mut self, i: usize) -> (usize, I::Item) {
1026 (self.count + i, self.iter.get_unchecked(i))
1027 }
1028
1029 fn may_have_side_effect() -> bool {
1030 I::may_have_side_effect()
1031 }
1032}
1033
1034#[stable(feature = "fused", since = "1.26.0")]
1035impl<I> FusedIterator for Enumerate<I> where I: FusedIterator {}
1036
1037#[unstable(feature = "trusted_len", issue = "37572")]
1038unsafe impl<I> TrustedLen for Enumerate<I>
1039 where I: TrustedLen,
1040{}
1041
1042
1043/// An iterator with a `peek()` that returns an optional reference to the next
1044/// element.
1045///
1046/// This `struct` is created by the [`peekable`] method on [`Iterator`]. See its
1047/// documentation for more.
1048///
1049/// [`peekable`]: trait.Iterator.html#method.peekable
1050/// [`Iterator`]: trait.Iterator.html
1051#[derive(Clone, Debug)]
1052#[must_use = "iterators are lazy and do nothing unless consumed"]
1053#[stable(feature = "rust1", since = "1.0.0")]
1054pub struct Peekable<I: Iterator> {
1055 iter: I,
1056 /// Remember a peeked value, even if it was None.
1057 peeked: Option<Option<I::Item>>,
1058}
1059impl<I: Iterator> Peekable<I> {
1060 pub(super) fn new(iter: I) -> Peekable<I> {
1061 Peekable { iter, peeked: None }
1062 }
1063}
1064
1065// Peekable must remember if a None has been seen in the `.peek()` method.
1066// It ensures that `.peek(); .peek();` or `.peek(); .next();` only advances the
1067// underlying iterator at most once. This does not by itself make the iterator
1068// fused.
1069#[stable(feature = "rust1", since = "1.0.0")]
1070impl<I: Iterator> Iterator for Peekable<I> {
1071 type Item = I::Item;
1072
1073 #[inline]
1074 fn next(&mut self) -> Option<I::Item> {
1075 match self.peeked.take() {
1076 Some(v) => v,
1077 None => self.iter.next(),
1078 }
1079 }
1080
1081 #[inline]
1082 #[rustc_inherit_overflow_checks]
1083 fn count(mut self) -> usize {
1084 match self.peeked.take() {
1085 Some(None) => 0,
1086 Some(Some(_)) => 1 + self.iter.count(),
1087 None => self.iter.count(),
1088 }
1089 }
1090
1091 #[inline]
1092 fn nth(&mut self, n: usize) -> Option<I::Item> {
1093 match self.peeked.take() {
1094 Some(None) => None,
1095 Some(v @ Some(_)) if n == 0 => v,
1096 Some(Some(_)) => self.iter.nth(n - 1),
1097 None => self.iter.nth(n),
1098 }
1099 }
1100
1101 #[inline]
1102 fn last(mut self) -> Option<I::Item> {
1103 let peek_opt = match self.peeked.take() {
1104 Some(None) => return None,
1105 Some(v) => v,
1106 None => None,
1107 };
1108 self.iter.last().or(peek_opt)
1109 }
1110
1111 #[inline]
1112 fn size_hint(&self) -> (usize, Option<usize>) {
1113 let peek_len = match self.peeked {
1114 Some(None) => return (0, Some(0)),
1115 Some(Some(_)) => 1,
1116 None => 0,
1117 };
1118 let (lo, hi) = self.iter.size_hint();
1119 let lo = lo.saturating_add(peek_len);
1120 let hi = hi.and_then(|x| x.checked_add(peek_len));
1121 (lo, hi)
1122 }
1123
1124 #[inline]
1125 fn try_fold<B, F, R>(&mut self, init: B, mut f: F) -> R where
1126 Self: Sized, F: FnMut(B, Self::Item) -> R, R: Try<Ok=B>
1127 {
1128 let acc = match self.peeked.take() {
1129 Some(None) => return Try::from_ok(init),
1130 Some(Some(v)) => f(init, v)?,
1131 None => init,
1132 };
1133 self.iter.try_fold(acc, f)
1134 }
1135
1136 #[inline]
1137 fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
1138 where Fold: FnMut(Acc, Self::Item) -> Acc,
1139 {
1140 let acc = match self.peeked {
1141 Some(None) => return init,
1142 Some(Some(v)) => fold(init, v),
1143 None => init,
1144 };
1145 self.iter.fold(acc, fold)
1146 }
1147}
1148
1149#[stable(feature = "rust1", since = "1.0.0")]
1150impl<I: ExactSizeIterator> ExactSizeIterator for Peekable<I> {}
1151
1152#[stable(feature = "fused", since = "1.26.0")]
1153impl<I: FusedIterator> FusedIterator for Peekable<I> {}
1154
1155impl<I: Iterator> Peekable<I> {
1156 /// Returns a reference to the next() value without advancing the iterator.
1157 ///
1158 /// Like [`next`], if there is a value, it is wrapped in a `Some(T)`.
1159 /// But if the iteration is over, `None` is returned.
1160 ///
1161 /// [`next`]: trait.Iterator.html#tymethod.next
1162 ///
1163 /// Because `peek()` returns a reference, and many iterators iterate over
1164 /// references, there can be a possibly confusing situation where the
1165 /// return value is a double reference. You can see this effect in the
1166 /// examples below.
1167 ///
1168 /// # Examples
1169 ///
1170 /// Basic usage:
1171 ///
1172 /// ```
1173 /// let xs = [1, 2, 3];
1174 ///
1175 /// let mut iter = xs.iter().peekable();
1176 ///
1177 /// // peek() lets us see into the future
1178 /// assert_eq!(iter.peek(), Some(&&1));
1179 /// assert_eq!(iter.next(), Some(&1));
1180 ///
1181 /// assert_eq!(iter.next(), Some(&2));
1182 ///
1183 /// // The iterator does not advance even if we `peek` multiple times
1184 /// assert_eq!(iter.peek(), Some(&&3));
1185 /// assert_eq!(iter.peek(), Some(&&3));
1186 ///
1187 /// assert_eq!(iter.next(), Some(&3));
1188 ///
1189 /// // After the iterator is finished, so is `peek()`
1190 /// assert_eq!(iter.peek(), None);
1191 /// assert_eq!(iter.next(), None);
1192 /// ```
1193 #[inline]
1194 #[stable(feature = "rust1", since = "1.0.0")]
1195 pub fn peek(&mut self) -> Option<&I::Item> {
1196 let iter = &mut self.iter;
1197 self.peeked.get_or_insert_with(|| iter.next()).as_ref()
1198 }
1199}
1200
532ac7d7 1201/// An iterator that rejects elements while `predicate` returns `true`.
9fa01778
XL
1202///
1203/// This `struct` is created by the [`skip_while`] method on [`Iterator`]. See its
1204/// documentation for more.
1205///
1206/// [`skip_while`]: trait.Iterator.html#method.skip_while
1207/// [`Iterator`]: trait.Iterator.html
1208#[must_use = "iterators are lazy and do nothing unless consumed"]
1209#[stable(feature = "rust1", since = "1.0.0")]
1210#[derive(Clone)]
1211pub struct SkipWhile<I, P> {
1212 iter: I,
1213 flag: bool,
1214 predicate: P,
1215}
1216impl<I, P> SkipWhile<I, P> {
1217 pub(super) fn new(iter: I, predicate: P) -> SkipWhile<I, P> {
1218 SkipWhile { iter, flag: false, predicate }
1219 }
1220}
1221
1222#[stable(feature = "core_impl_debug", since = "1.9.0")]
1223impl<I: fmt::Debug, P> fmt::Debug for SkipWhile<I, P> {
1224 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1225 f.debug_struct("SkipWhile")
1226 .field("iter", &self.iter)
1227 .field("flag", &self.flag)
1228 .finish()
1229 }
1230}
1231
1232#[stable(feature = "rust1", since = "1.0.0")]
1233impl<I: Iterator, P> Iterator for SkipWhile<I, P>
1234 where P: FnMut(&I::Item) -> bool
1235{
1236 type Item = I::Item;
1237
1238 #[inline]
1239 fn next(&mut self) -> Option<I::Item> {
1240 let flag = &mut self.flag;
1241 let pred = &mut self.predicate;
1242 self.iter.find(move |x| {
1243 if *flag || !pred(x) {
1244 *flag = true;
1245 true
1246 } else {
1247 false
1248 }
1249 })
1250 }
1251
1252 #[inline]
1253 fn size_hint(&self) -> (usize, Option<usize>) {
1254 let (_, upper) = self.iter.size_hint();
1255 (0, upper) // can't know a lower bound, due to the predicate
1256 }
1257
1258 #[inline]
1259 fn try_fold<Acc, Fold, R>(&mut self, mut init: Acc, mut fold: Fold) -> R where
1260 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1261 {
1262 if !self.flag {
1263 match self.next() {
1264 Some(v) => init = fold(init, v)?,
1265 None => return Try::from_ok(init),
1266 }
1267 }
1268 self.iter.try_fold(init, fold)
1269 }
1270
1271 #[inline]
1272 fn fold<Acc, Fold>(mut self, mut init: Acc, mut fold: Fold) -> Acc
1273 where Fold: FnMut(Acc, Self::Item) -> Acc,
1274 {
1275 if !self.flag {
1276 match self.next() {
1277 Some(v) => init = fold(init, v),
1278 None => return init,
1279 }
1280 }
1281 self.iter.fold(init, fold)
1282 }
1283}
1284
1285#[stable(feature = "fused", since = "1.26.0")]
1286impl<I, P> FusedIterator for SkipWhile<I, P>
1287 where I: FusedIterator, P: FnMut(&I::Item) -> bool {}
1288
532ac7d7 1289/// An iterator that only accepts elements while `predicate` returns `true`.
9fa01778
XL
1290///
1291/// This `struct` is created by the [`take_while`] method on [`Iterator`]. See its
1292/// documentation for more.
1293///
1294/// [`take_while`]: trait.Iterator.html#method.take_while
1295/// [`Iterator`]: trait.Iterator.html
1296#[must_use = "iterators are lazy and do nothing unless consumed"]
1297#[stable(feature = "rust1", since = "1.0.0")]
1298#[derive(Clone)]
1299pub struct TakeWhile<I, P> {
1300 iter: I,
1301 flag: bool,
1302 predicate: P,
1303}
1304impl<I, P> TakeWhile<I, P> {
1305 pub(super) fn new(iter: I, predicate: P) -> TakeWhile<I, P> {
1306 TakeWhile { iter, flag: false, predicate }
1307 }
1308}
1309
1310#[stable(feature = "core_impl_debug", since = "1.9.0")]
1311impl<I: fmt::Debug, P> fmt::Debug for TakeWhile<I, P> {
1312 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1313 f.debug_struct("TakeWhile")
1314 .field("iter", &self.iter)
1315 .field("flag", &self.flag)
1316 .finish()
1317 }
1318}
1319
1320#[stable(feature = "rust1", since = "1.0.0")]
1321impl<I: Iterator, P> Iterator for TakeWhile<I, P>
1322 where P: FnMut(&I::Item) -> bool
1323{
1324 type Item = I::Item;
1325
1326 #[inline]
1327 fn next(&mut self) -> Option<I::Item> {
1328 if self.flag {
1329 None
1330 } else {
1331 self.iter.next().and_then(|x| {
1332 if (self.predicate)(&x) {
1333 Some(x)
1334 } else {
1335 self.flag = true;
1336 None
1337 }
1338 })
1339 }
1340 }
1341
1342 #[inline]
1343 fn size_hint(&self) -> (usize, Option<usize>) {
1344 if self.flag {
1345 (0, Some(0))
1346 } else {
1347 let (_, upper) = self.iter.size_hint();
1348 (0, upper) // can't know a lower bound, due to the predicate
1349 }
1350 }
1351
1352 #[inline]
1353 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1354 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1355 {
1356 if self.flag {
1357 Try::from_ok(init)
1358 } else {
1359 let flag = &mut self.flag;
1360 let p = &mut self.predicate;
1361 self.iter.try_fold(init, move |acc, x|{
1362 if p(&x) {
1363 LoopState::from_try(fold(acc, x))
1364 } else {
1365 *flag = true;
1366 LoopState::Break(Try::from_ok(acc))
1367 }
1368 }).into_try()
1369 }
1370 }
1371}
1372
1373#[stable(feature = "fused", since = "1.26.0")]
1374impl<I, P> FusedIterator for TakeWhile<I, P>
1375 where I: FusedIterator, P: FnMut(&I::Item) -> bool {}
1376
1377/// An iterator that skips over `n` elements of `iter`.
1378///
1379/// This `struct` is created by the [`skip`] method on [`Iterator`]. See its
1380/// documentation for more.
1381///
1382/// [`skip`]: trait.Iterator.html#method.skip
1383/// [`Iterator`]: trait.Iterator.html
1384#[derive(Clone, Debug)]
1385#[must_use = "iterators are lazy and do nothing unless consumed"]
1386#[stable(feature = "rust1", since = "1.0.0")]
1387pub struct Skip<I> {
1388 iter: I,
1389 n: usize
1390}
1391impl<I> Skip<I> {
1392 pub(super) fn new(iter: I, n: usize) -> Skip<I> {
1393 Skip { iter, n }
1394 }
1395}
1396
1397#[stable(feature = "rust1", since = "1.0.0")]
1398impl<I> Iterator for Skip<I> where I: Iterator {
1399 type Item = <I as Iterator>::Item;
1400
1401 #[inline]
1402 fn next(&mut self) -> Option<I::Item> {
1403 if self.n == 0 {
1404 self.iter.next()
1405 } else {
1406 let old_n = self.n;
1407 self.n = 0;
1408 self.iter.nth(old_n)
1409 }
1410 }
1411
1412 #[inline]
1413 fn nth(&mut self, n: usize) -> Option<I::Item> {
1414 // Can't just add n + self.n due to overflow.
1415 if self.n == 0 {
1416 self.iter.nth(n)
1417 } else {
1418 let to_skip = self.n;
1419 self.n = 0;
1420 // nth(n) skips n+1
1421 if self.iter.nth(to_skip-1).is_none() {
1422 return None;
1423 }
1424 self.iter.nth(n)
1425 }
1426 }
1427
1428 #[inline]
1429 fn count(self) -> usize {
1430 self.iter.count().saturating_sub(self.n)
1431 }
1432
1433 #[inline]
1434 fn last(mut self) -> Option<I::Item> {
1435 if self.n == 0 {
1436 self.iter.last()
1437 } else {
1438 let next = self.next();
1439 if next.is_some() {
1440 // recurse. n should be 0.
1441 self.last().or(next)
1442 } else {
1443 None
1444 }
1445 }
1446 }
1447
1448 #[inline]
1449 fn size_hint(&self) -> (usize, Option<usize>) {
1450 let (lower, upper) = self.iter.size_hint();
1451
1452 let lower = lower.saturating_sub(self.n);
1453 let upper = upper.map(|x| x.saturating_sub(self.n));
1454
1455 (lower, upper)
1456 }
1457
1458 #[inline]
1459 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1460 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1461 {
1462 let n = self.n;
1463 self.n = 0;
1464 if n > 0 {
1465 // nth(n) skips n+1
1466 if self.iter.nth(n - 1).is_none() {
1467 return Try::from_ok(init);
1468 }
1469 }
1470 self.iter.try_fold(init, fold)
1471 }
1472
1473 #[inline]
1474 fn fold<Acc, Fold>(mut self, init: Acc, fold: Fold) -> Acc
1475 where Fold: FnMut(Acc, Self::Item) -> Acc,
1476 {
1477 if self.n > 0 {
1478 // nth(n) skips n+1
1479 if self.iter.nth(self.n - 1).is_none() {
1480 return init;
1481 }
1482 }
1483 self.iter.fold(init, fold)
1484 }
1485}
1486
1487#[stable(feature = "rust1", since = "1.0.0")]
1488impl<I> ExactSizeIterator for Skip<I> where I: ExactSizeIterator {}
1489
1490#[stable(feature = "double_ended_skip_iterator", since = "1.9.0")]
1491impl<I> DoubleEndedIterator for Skip<I> where I: DoubleEndedIterator + ExactSizeIterator {
1492 fn next_back(&mut self) -> Option<Self::Item> {
1493 if self.len() > 0 {
1494 self.iter.next_back()
1495 } else {
1496 None
1497 }
1498 }
1499
1500 fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1501 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1502 {
1503 let mut n = self.len();
1504 if n == 0 {
1505 Try::from_ok(init)
1506 } else {
1507 self.iter.try_rfold(init, move |acc, x| {
1508 n -= 1;
1509 let r = fold(acc, x);
1510 if n == 0 { LoopState::Break(r) }
1511 else { LoopState::from_try(r) }
1512 }).into_try()
1513 }
1514 }
1515}
1516
1517#[stable(feature = "fused", since = "1.26.0")]
1518impl<I> FusedIterator for Skip<I> where I: FusedIterator {}
1519
1520/// An iterator that only iterates over the first `n` iterations of `iter`.
1521///
1522/// This `struct` is created by the [`take`] method on [`Iterator`]. See its
1523/// documentation for more.
1524///
1525/// [`take`]: trait.Iterator.html#method.take
1526/// [`Iterator`]: trait.Iterator.html
1527#[derive(Clone, Debug)]
1528#[must_use = "iterators are lazy and do nothing unless consumed"]
1529#[stable(feature = "rust1", since = "1.0.0")]
1530pub struct Take<I> {
1531 pub(super) iter: I,
1532 pub(super) n: usize
1533}
1534impl<I> Take<I> {
1535 pub(super) fn new(iter: I, n: usize) -> Take<I> {
1536 Take { iter, n }
1537 }
1538}
1539
1540#[stable(feature = "rust1", since = "1.0.0")]
1541impl<I> Iterator for Take<I> where I: Iterator{
1542 type Item = <I as Iterator>::Item;
1543
1544 #[inline]
1545 fn next(&mut self) -> Option<<I as Iterator>::Item> {
1546 if self.n != 0 {
1547 self.n -= 1;
1548 self.iter.next()
1549 } else {
1550 None
1551 }
1552 }
1553
1554 #[inline]
1555 fn nth(&mut self, n: usize) -> Option<I::Item> {
1556 if self.n > n {
1557 self.n -= n + 1;
1558 self.iter.nth(n)
1559 } else {
1560 if self.n > 0 {
1561 self.iter.nth(self.n - 1);
1562 self.n = 0;
1563 }
1564 None
1565 }
1566 }
1567
1568 #[inline]
1569 fn size_hint(&self) -> (usize, Option<usize>) {
1570 if self.n == 0 {
1571 return (0, Some(0));
1572 }
1573
1574 let (lower, upper) = self.iter.size_hint();
1575
1576 let lower = cmp::min(lower, self.n);
1577
1578 let upper = match upper {
1579 Some(x) if x < self.n => Some(x),
1580 _ => Some(self.n)
1581 };
1582
1583 (lower, upper)
1584 }
1585
1586 #[inline]
1587 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1588 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1589 {
1590 if self.n == 0 {
1591 Try::from_ok(init)
1592 } else {
1593 let n = &mut self.n;
1594 self.iter.try_fold(init, move |acc, x| {
1595 *n -= 1;
1596 let r = fold(acc, x);
1597 if *n == 0 { LoopState::Break(r) }
1598 else { LoopState::from_try(r) }
1599 }).into_try()
1600 }
1601 }
1602}
1603
1604#[stable(feature = "rust1", since = "1.0.0")]
1605impl<I> ExactSizeIterator for Take<I> where I: ExactSizeIterator {}
1606
1607#[stable(feature = "fused", since = "1.26.0")]
1608impl<I> FusedIterator for Take<I> where I: FusedIterator {}
1609
1610#[unstable(feature = "trusted_len", issue = "37572")]
1611unsafe impl<I: TrustedLen> TrustedLen for Take<I> {}
1612
1613/// An iterator to maintain state while iterating another iterator.
1614///
1615/// This `struct` is created by the [`scan`] method on [`Iterator`]. See its
1616/// documentation for more.
1617///
1618/// [`scan`]: trait.Iterator.html#method.scan
1619/// [`Iterator`]: trait.Iterator.html
1620#[must_use = "iterators are lazy and do nothing unless consumed"]
1621#[stable(feature = "rust1", since = "1.0.0")]
1622#[derive(Clone)]
1623pub struct Scan<I, St, F> {
1624 iter: I,
1625 f: F,
1626 state: St,
1627}
1628impl<I, St, F> Scan<I, St, F> {
1629 pub(super) fn new(iter: I, state: St, f: F) -> Scan<I, St, F> {
1630 Scan { iter, state, f }
1631 }
1632}
1633
1634#[stable(feature = "core_impl_debug", since = "1.9.0")]
1635impl<I: fmt::Debug, St: fmt::Debug, F> fmt::Debug for Scan<I, St, F> {
1636 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1637 f.debug_struct("Scan")
1638 .field("iter", &self.iter)
1639 .field("state", &self.state)
1640 .finish()
1641 }
1642}
1643
1644#[stable(feature = "rust1", since = "1.0.0")]
1645impl<B, I, St, F> Iterator for Scan<I, St, F> where
1646 I: Iterator,
1647 F: FnMut(&mut St, I::Item) -> Option<B>,
1648{
1649 type Item = B;
1650
1651 #[inline]
1652 fn next(&mut self) -> Option<B> {
1653 self.iter.next().and_then(|a| (self.f)(&mut self.state, a))
1654 }
1655
1656 #[inline]
1657 fn size_hint(&self) -> (usize, Option<usize>) {
1658 let (_, upper) = self.iter.size_hint();
1659 (0, upper) // can't know a lower bound, due to the scan function
1660 }
1661
1662 #[inline]
1663 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1664 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1665 {
1666 let state = &mut self.state;
1667 let f = &mut self.f;
1668 self.iter.try_fold(init, move |acc, x| {
1669 match f(state, x) {
1670 None => LoopState::Break(Try::from_ok(acc)),
1671 Some(x) => LoopState::from_try(fold(acc, x)),
1672 }
1673 }).into_try()
1674 }
1675}
1676
1677/// An iterator that yields `None` forever after the underlying iterator
1678/// yields `None` once.
1679///
1680/// This `struct` is created by the [`fuse`] method on [`Iterator`]. See its
1681/// documentation for more.
1682///
1683/// [`fuse`]: trait.Iterator.html#method.fuse
1684/// [`Iterator`]: trait.Iterator.html
1685#[derive(Clone, Debug)]
1686#[must_use = "iterators are lazy and do nothing unless consumed"]
1687#[stable(feature = "rust1", since = "1.0.0")]
1688pub struct Fuse<I> {
1689 iter: I,
1690 done: bool
1691}
1692impl<I> Fuse<I> {
1693 pub(super) fn new(iter: I) -> Fuse<I> {
1694 Fuse { iter, done: false }
1695 }
1696}
1697
1698#[stable(feature = "fused", since = "1.26.0")]
1699impl<I> FusedIterator for Fuse<I> where I: Iterator {}
1700
1701#[stable(feature = "rust1", since = "1.0.0")]
1702impl<I> Iterator for Fuse<I> where I: Iterator {
1703 type Item = <I as Iterator>::Item;
1704
1705 #[inline]
1706 default fn next(&mut self) -> Option<<I as Iterator>::Item> {
1707 if self.done {
1708 None
1709 } else {
1710 let next = self.iter.next();
1711 self.done = next.is_none();
1712 next
1713 }
1714 }
1715
1716 #[inline]
1717 default fn nth(&mut self, n: usize) -> Option<I::Item> {
1718 if self.done {
1719 None
1720 } else {
1721 let nth = self.iter.nth(n);
1722 self.done = nth.is_none();
1723 nth
1724 }
1725 }
1726
1727 #[inline]
1728 default fn last(self) -> Option<I::Item> {
1729 if self.done {
1730 None
1731 } else {
1732 self.iter.last()
1733 }
1734 }
1735
1736 #[inline]
1737 default fn count(self) -> usize {
1738 if self.done {
1739 0
1740 } else {
1741 self.iter.count()
1742 }
1743 }
1744
1745 #[inline]
1746 default fn size_hint(&self) -> (usize, Option<usize>) {
1747 if self.done {
1748 (0, Some(0))
1749 } else {
1750 self.iter.size_hint()
1751 }
1752 }
1753
1754 #[inline]
1755 default fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1756 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1757 {
1758 if self.done {
1759 Try::from_ok(init)
1760 } else {
1761 let acc = self.iter.try_fold(init, fold)?;
1762 self.done = true;
1763 Try::from_ok(acc)
1764 }
1765 }
1766
1767 #[inline]
1768 default fn fold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1769 where Fold: FnMut(Acc, Self::Item) -> Acc,
1770 {
1771 if self.done {
1772 init
1773 } else {
1774 self.iter.fold(init, fold)
1775 }
1776 }
1777}
1778
1779#[stable(feature = "rust1", since = "1.0.0")]
1780impl<I> DoubleEndedIterator for Fuse<I> where I: DoubleEndedIterator {
1781 #[inline]
1782 default fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
1783 if self.done {
1784 None
1785 } else {
1786 let next = self.iter.next_back();
1787 self.done = next.is_none();
1788 next
1789 }
1790 }
1791
1792 #[inline]
1793 default fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1794 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1795 {
1796 if self.done {
1797 Try::from_ok(init)
1798 } else {
1799 let acc = self.iter.try_rfold(init, fold)?;
1800 self.done = true;
1801 Try::from_ok(acc)
1802 }
1803 }
1804
1805 #[inline]
1806 default fn rfold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1807 where Fold: FnMut(Acc, Self::Item) -> Acc,
1808 {
1809 if self.done {
1810 init
1811 } else {
1812 self.iter.rfold(init, fold)
1813 }
1814 }
1815}
1816
1817unsafe impl<I> TrustedRandomAccess for Fuse<I>
1818 where I: TrustedRandomAccess,
1819{
1820 unsafe fn get_unchecked(&mut self, i: usize) -> I::Item {
1821 self.iter.get_unchecked(i)
1822 }
1823
1824 fn may_have_side_effect() -> bool {
1825 I::may_have_side_effect()
1826 }
1827}
1828
1829#[stable(feature = "fused", since = "1.26.0")]
1830impl<I> Iterator for Fuse<I> where I: FusedIterator {
1831 #[inline]
1832 fn next(&mut self) -> Option<<I as Iterator>::Item> {
1833 self.iter.next()
1834 }
1835
1836 #[inline]
1837 fn nth(&mut self, n: usize) -> Option<I::Item> {
1838 self.iter.nth(n)
1839 }
1840
1841 #[inline]
1842 fn last(self) -> Option<I::Item> {
1843 self.iter.last()
1844 }
1845
1846 #[inline]
1847 fn count(self) -> usize {
1848 self.iter.count()
1849 }
1850
1851 #[inline]
1852 fn size_hint(&self) -> (usize, Option<usize>) {
1853 self.iter.size_hint()
1854 }
1855
1856 #[inline]
1857 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1858 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1859 {
1860 self.iter.try_fold(init, fold)
1861 }
1862
1863 #[inline]
1864 fn fold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1865 where Fold: FnMut(Acc, Self::Item) -> Acc,
1866 {
1867 self.iter.fold(init, fold)
1868 }
1869}
1870
1871#[stable(feature = "fused", since = "1.26.0")]
1872impl<I> DoubleEndedIterator for Fuse<I>
1873 where I: DoubleEndedIterator + FusedIterator
1874{
1875 #[inline]
1876 fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
1877 self.iter.next_back()
1878 }
1879
1880 #[inline]
1881 fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, fold: Fold) -> R where
1882 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1883 {
1884 self.iter.try_rfold(init, fold)
1885 }
1886
1887 #[inline]
1888 fn rfold<Acc, Fold>(self, init: Acc, fold: Fold) -> Acc
1889 where Fold: FnMut(Acc, Self::Item) -> Acc,
1890 {
1891 self.iter.rfold(init, fold)
1892 }
1893}
1894
1895
1896#[stable(feature = "rust1", since = "1.0.0")]
1897impl<I> ExactSizeIterator for Fuse<I> where I: ExactSizeIterator {
1898 fn len(&self) -> usize {
1899 self.iter.len()
1900 }
1901
1902 fn is_empty(&self) -> bool {
1903 self.iter.is_empty()
1904 }
1905}
1906
1907/// An iterator that calls a function with a reference to each element before
1908/// yielding it.
1909///
1910/// This `struct` is created by the [`inspect`] method on [`Iterator`]. See its
1911/// documentation for more.
1912///
1913/// [`inspect`]: trait.Iterator.html#method.inspect
1914/// [`Iterator`]: trait.Iterator.html
1915#[must_use = "iterators are lazy and do nothing unless consumed"]
1916#[stable(feature = "rust1", since = "1.0.0")]
1917#[derive(Clone)]
1918pub struct Inspect<I, F> {
1919 iter: I,
1920 f: F,
1921}
1922impl<I, F> Inspect<I, F> {
1923 pub(super) fn new(iter: I, f: F) -> Inspect<I, F> {
1924 Inspect { iter, f }
1925 }
1926}
1927
1928#[stable(feature = "core_impl_debug", since = "1.9.0")]
1929impl<I: fmt::Debug, F> fmt::Debug for Inspect<I, F> {
1930 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
1931 f.debug_struct("Inspect")
1932 .field("iter", &self.iter)
1933 .finish()
1934 }
1935}
1936
1937impl<I: Iterator, F> Inspect<I, F> where F: FnMut(&I::Item) {
1938 #[inline]
1939 fn do_inspect(&mut self, elt: Option<I::Item>) -> Option<I::Item> {
1940 if let Some(ref a) = elt {
1941 (self.f)(a);
1942 }
1943
1944 elt
1945 }
1946}
1947
1948#[stable(feature = "rust1", since = "1.0.0")]
1949impl<I: Iterator, F> Iterator for Inspect<I, F> where F: FnMut(&I::Item) {
1950 type Item = I::Item;
1951
1952 #[inline]
1953 fn next(&mut self) -> Option<I::Item> {
1954 let next = self.iter.next();
1955 self.do_inspect(next)
1956 }
1957
1958 #[inline]
1959 fn size_hint(&self) -> (usize, Option<usize>) {
1960 self.iter.size_hint()
1961 }
1962
1963 #[inline]
1964 fn try_fold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1965 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1966 {
1967 let f = &mut self.f;
1968 self.iter.try_fold(init, move |acc, item| { f(&item); fold(acc, item) })
1969 }
1970
1971 #[inline]
1972 fn fold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
1973 where Fold: FnMut(Acc, Self::Item) -> Acc,
1974 {
1975 let mut f = self.f;
1976 self.iter.fold(init, move |acc, item| { f(&item); fold(acc, item) })
1977 }
1978}
1979
1980#[stable(feature = "rust1", since = "1.0.0")]
1981impl<I: DoubleEndedIterator, F> DoubleEndedIterator for Inspect<I, F>
1982 where F: FnMut(&I::Item),
1983{
1984 #[inline]
1985 fn next_back(&mut self) -> Option<I::Item> {
1986 let next = self.iter.next_back();
1987 self.do_inspect(next)
1988 }
1989
1990 #[inline]
1991 fn try_rfold<Acc, Fold, R>(&mut self, init: Acc, mut fold: Fold) -> R where
1992 Self: Sized, Fold: FnMut(Acc, Self::Item) -> R, R: Try<Ok=Acc>
1993 {
1994 let f = &mut self.f;
1995 self.iter.try_rfold(init, move |acc, item| { f(&item); fold(acc, item) })
1996 }
1997
1998 #[inline]
1999 fn rfold<Acc, Fold>(self, init: Acc, mut fold: Fold) -> Acc
2000 where Fold: FnMut(Acc, Self::Item) -> Acc,
2001 {
2002 let mut f = self.f;
2003 self.iter.rfold(init, move |acc, item| { f(&item); fold(acc, item) })
2004 }
2005}
2006
2007#[stable(feature = "rust1", since = "1.0.0")]
2008impl<I: ExactSizeIterator, F> ExactSizeIterator for Inspect<I, F>
2009 where F: FnMut(&I::Item)
2010{
2011 fn len(&self) -> usize {
2012 self.iter.len()
2013 }
2014
2015 fn is_empty(&self) -> bool {
2016 self.iter.is_empty()
2017 }
2018}
2019
2020#[stable(feature = "fused", since = "1.26.0")]
2021impl<I: FusedIterator, F> FusedIterator for Inspect<I, F>
2022 where F: FnMut(&I::Item) {}