core/iter/adapters/
rev.rs

1#[cfg(not(feature = "ferrocene_certified"))]
2use crate::iter::{FusedIterator, TrustedLen};
3use crate::num::NonZero;
4use crate::ops::Try;
5
6/// A double-ended iterator with the direction inverted.
7///
8/// This `struct` is created by the [`rev`] method on [`Iterator`]. See its
9/// documentation for more.
10///
11/// [`rev`]: Iterator::rev
12/// [`Iterator`]: trait.Iterator.html
13#[cfg_attr(not(feature = "ferrocene_certified"), derive(Clone, Debug))]
14#[must_use = "iterators are lazy and do nothing unless consumed"]
15#[stable(feature = "rust1", since = "1.0.0")]
16pub struct Rev<T> {
17    iter: T,
18}
19
20impl<T> Rev<T> {
21    pub(in crate::iter) fn new(iter: T) -> Rev<T> {
22        Rev { iter }
23    }
24
25    /// Consumes the `Rev`, returning the inner iterator.
26    ///
27    /// # Examples
28    ///
29    /// ```rust
30    /// #![feature(rev_into_inner)]
31    ///
32    /// let s = "foobar";
33    /// let mut rev = s.chars().rev();
34    /// assert_eq!(rev.next(), Some('r'));
35    /// assert_eq!(rev.next(), Some('a'));
36    /// assert_eq!(rev.next(), Some('b'));
37    /// assert_eq!(rev.into_inner().collect::<String>(), "foo");
38    /// ```
39    #[unstable(feature = "rev_into_inner", issue = "144277")]
40    #[cfg(not(feature = "ferrocene_certified"))]
41    pub fn into_inner(self) -> T {
42        self.iter
43    }
44}
45
46#[stable(feature = "rust1", since = "1.0.0")]
47impl<I> Iterator for Rev<I>
48where
49    I: DoubleEndedIterator,
50{
51    type Item = <I as Iterator>::Item;
52
53    #[inline]
54    fn next(&mut self) -> Option<<I as Iterator>::Item> {
55        self.iter.next_back()
56    }
57    #[inline]
58    fn size_hint(&self) -> (usize, Option<usize>) {
59        self.iter.size_hint()
60    }
61
62    #[inline]
63    fn advance_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
64        self.iter.advance_back_by(n)
65    }
66
67    #[inline]
68    fn nth(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
69        self.iter.nth_back(n)
70    }
71
72    fn try_fold<B, F, R>(&mut self, init: B, f: F) -> R
73    where
74        Self: Sized,
75        F: FnMut(B, Self::Item) -> R,
76        R: Try<Output = B>,
77    {
78        self.iter.try_rfold(init, f)
79    }
80
81    fn fold<Acc, F>(self, init: Acc, f: F) -> Acc
82    where
83        F: FnMut(Acc, Self::Item) -> Acc,
84    {
85        self.iter.rfold(init, f)
86    }
87
88    #[inline]
89    fn find<P>(&mut self, predicate: P) -> Option<Self::Item>
90    where
91        P: FnMut(&Self::Item) -> bool,
92    {
93        self.iter.rfind(predicate)
94    }
95}
96
97#[stable(feature = "rust1", since = "1.0.0")]
98impl<I> DoubleEndedIterator for Rev<I>
99where
100    I: DoubleEndedIterator,
101{
102    #[inline]
103    fn next_back(&mut self) -> Option<<I as Iterator>::Item> {
104        self.iter.next()
105    }
106
107    #[inline]
108    fn advance_back_by(&mut self, n: usize) -> Result<(), NonZero<usize>> {
109        self.iter.advance_by(n)
110    }
111
112    #[inline]
113    fn nth_back(&mut self, n: usize) -> Option<<I as Iterator>::Item> {
114        self.iter.nth(n)
115    }
116
117    fn try_rfold<B, F, R>(&mut self, init: B, f: F) -> R
118    where
119        Self: Sized,
120        F: FnMut(B, Self::Item) -> R,
121        R: Try<Output = B>,
122    {
123        self.iter.try_fold(init, f)
124    }
125
126    fn rfold<Acc, F>(self, init: Acc, f: F) -> Acc
127    where
128        F: FnMut(Acc, Self::Item) -> Acc,
129    {
130        self.iter.fold(init, f)
131    }
132
133    fn rfind<P>(&mut self, predicate: P) -> Option<Self::Item>
134    where
135        P: FnMut(&Self::Item) -> bool,
136    {
137        self.iter.find(predicate)
138    }
139}
140
141#[stable(feature = "rust1", since = "1.0.0")]
142#[cfg(not(feature = "ferrocene_certified"))]
143impl<I> ExactSizeIterator for Rev<I>
144where
145    I: ExactSizeIterator + DoubleEndedIterator,
146{
147    fn len(&self) -> usize {
148        self.iter.len()
149    }
150
151    fn is_empty(&self) -> bool {
152        self.iter.is_empty()
153    }
154}
155
156#[stable(feature = "fused", since = "1.26.0")]
157#[cfg(not(feature = "ferrocene_certified"))]
158impl<I> FusedIterator for Rev<I> where I: FusedIterator + DoubleEndedIterator {}
159
160#[unstable(feature = "trusted_len", issue = "37572")]
161#[cfg(not(feature = "ferrocene_certified"))]
162unsafe impl<I> TrustedLen for Rev<I> where I: TrustedLen + DoubleEndedIterator {}
163
164#[stable(feature = "default_iters", since = "1.70.0")]
165#[cfg(not(feature = "ferrocene_certified"))]
166impl<I: Default> Default for Rev<I> {
167    /// Creates a `Rev` iterator from the default value of `I`
168    /// ```
169    /// # use core::slice;
170    /// # use core::iter::Rev;
171    /// let iter: Rev<slice::Iter<'_, u8>> = Default::default();
172    /// assert_eq!(iter.len(), 0);
173    /// ```
174    fn default() -> Self {
175        Rev::new(Default::default())
176    }
177}