core/iter/adapters/
rev.rs1use crate::iter::{FusedIterator, TrustedLen};
2use crate::num::NonZero;
3use crate::ops::Try;
4
5#[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 #[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 fn default() -> Self {
184 Rev::new(Default::default())
185 }
186}