1 use crate::iter::{FusedIterator, TrustedLen};
4 /// A double-ended iterator with the direction inverted.
6 /// This `struct` is created by the [`rev`] method on [`Iterator`]. See its
7 /// documentation for more.
9 /// [`rev`]: Iterator::rev
10 /// [`Iterator`]: trait.Iterator.html
11 #[derive(Clone, Debug)]
12 #[must_use = "iterators are lazy and do nothing unless consumed"]
13 #[stable(feature = "rust1", since = "1.0.0")]
19 pub(in crate::iter) fn new(iter: T) -> Rev<T> {
24 #[stable(feature = "rust1", since = "1.0.0")]
25 impl<I> Iterator for Rev<I>
27 I: DoubleEndedIterator,
29 type Item = <I as Iterator>::Item;
32 fn next(&mut self) -> Option<<I as Iterator>::Item> {
36 fn size_hint(&self) -> (usize, Option<usize>) {
41 fn advance_by(&mut self, n: usize) -> Result<(), usize> {
42 self.iter.advance_back_by(n)
46 fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
50 fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
53 F: FnMut(B, Self::Item) -> R,
56 self.iter.try_rfold(init, f)
59 fn fold<Acc, F>(self, init: Acc, f: F) -> Acc
61 F: FnMut(Acc, Self::Item) -> Acc,
63 self.iter.rfold(init, f)
67 fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
69 P: FnMut(&Self::Item) -> bool,
71 self.iter.rfind(predicate)
75 #[stable(feature = "rust1", since = "1.0.0")]
76 impl<I> DoubleEndedIterator for Rev<I>
78 I: DoubleEndedIterator,
81 fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
86 fn advance_back_by(&mut self, n: usize) -> Result<(), usize> {
87 self.iter.advance_by(n)
91 fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
95 fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
98 F: FnMut(B, Self::Item) -> R,
101 self.iter.try_fold(init, f)
104 fn rfold<Acc, F>(self, init: Acc, f: F) -> Acc
106 F: FnMut(Acc, Self::Item) -> Acc,
108 self.iter.fold(init, f)
111 fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
113 P: FnMut(&Self::Item) -> bool,
115 self.iter.find(predicate)
119 #[stable(feature = "rust1", since = "1.0.0")]
120 impl<I> ExactSizeIterator for Rev<I>
122 I: ExactSizeIterator + DoubleEndedIterator,
124 fn len(&self) -> usize {
128 fn is_empty(&self) -> bool {
133 #[stable(feature = "fused", since = "1.26.0")]
134 impl<I> FusedIterator for Rev<I> where I: FusedIterator + DoubleEndedIterator {}
136 #[unstable(feature = "trusted_len", issue = "37572")]
137 unsafe impl<I> TrustedLen for Rev<I> where I: TrustedLen + DoubleEndedIterator {}