core/iter/adapters/
rev.rs1#[cfg(not(feature = "ferrocene_certified"))]
2use crate::iter::{FusedIterator, TrustedLen};
3use crate::num::NonZero;
4use crate::ops::Try;
5
6#[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 #[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 fn default() -> Self {
175 Rev::new(Default::default())
176 }
177}