Skip to main content

core/iter/adapters/
rev.rs

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