1#[cfg(not(feature = "ferrocene_subset"))]
2use crate::iter::InPlaceIterable;
3#[cfg(not(feature = "ferrocene_subset"))]
4use crate::num::NonZero;
5#[cfg(not(feature = "ferrocene_subset"))]
6use crate::ops::{ChangeOutputType, ControlFlow, FromResidual, Residual, Try};
7
8#[cfg(not(feature = "ferrocene_subset"))]
9mod array_chunks;
10#[cfg(not(feature = "ferrocene_subset"))]
11mod by_ref_sized;
12mod chain;
13mod cloned;
14mod copied;
15#[cfg(not(feature = "ferrocene_subset"))]
16mod cycle;
17mod enumerate;
18mod filter;
19#[cfg(not(feature = "ferrocene_subset"))]
20mod filter_map;
21#[cfg(not(feature = "ferrocene_subset"))]
22mod flatten;
23#[cfg(not(feature = "ferrocene_subset"))]
24mod fuse;
25#[cfg(not(feature = "ferrocene_subset"))]
26mod inspect;
27#[cfg(not(feature = "ferrocene_subset"))]
28mod intersperse;
29mod map;
30#[cfg(not(feature = "ferrocene_subset"))]
31mod map_while;
32#[cfg(not(feature = "ferrocene_subset"))]
33mod map_windows;
34#[cfg(not(feature = "ferrocene_subset"))]
35mod peekable;
36mod rev;
37#[cfg(not(feature = "ferrocene_subset"))]
38mod scan;
39mod skip;
40#[cfg(not(feature = "ferrocene_subset"))]
41mod skip_while;
42mod step_by;
43mod take;
44#[cfg(not(feature = "ferrocene_subset"))]
45mod take_while;
46mod zip;
47
48#[unstable(feature = "iter_array_chunks", reason = "recently added", issue = "100450")]
49#[cfg(not(feature = "ferrocene_subset"))]
50pub use self::array_chunks::ArrayChunks;
51#[unstable(feature = "std_internals", issue = "none")]
52#[cfg(not(feature = "ferrocene_subset"))]
53pub use self::by_ref_sized::ByRefSized;
54#[stable(feature = "iter_chain", since = "1.91.0")]
55#[cfg(not(feature = "ferrocene_subset"))]
56pub use self::chain::chain;
57#[stable(feature = "iter_cloned", since = "1.1.0")]
58pub use self::cloned::Cloned;
59#[stable(feature = "iter_copied", since = "1.36.0")]
60pub use self::copied::Copied;
61#[stable(feature = "iterator_flatten", since = "1.29.0")]
62#[cfg(not(feature = "ferrocene_subset"))]
63pub use self::flatten::Flatten;
64#[unstable(feature = "iter_intersperse", reason = "recently added", issue = "79524")]
65#[cfg(not(feature = "ferrocene_subset"))]
66pub use self::intersperse::{Intersperse, IntersperseWith};
67#[stable(feature = "iter_map_while", since = "1.57.0")]
68#[cfg(not(feature = "ferrocene_subset"))]
69pub use self::map_while::MapWhile;
70#[unstable(feature = "iter_map_windows", reason = "recently added", issue = "87155")]
71#[cfg(not(feature = "ferrocene_subset"))]
72pub use self::map_windows::MapWindows;
73#[stable(feature = "iterator_step_by", since = "1.28.0")]
74#[cfg(not(feature = "ferrocene_subset"))]
75pub use self::step_by::StepBy;
76#[unstable(feature = "trusted_random_access", issue = "none")]
77#[cfg(not(feature = "ferrocene_subset"))]
78pub use self::zip::TrustedRandomAccess;
79#[unstable(feature = "trusted_random_access", issue = "none")]
80#[cfg(not(feature = "ferrocene_subset"))]
81pub use self::zip::TrustedRandomAccessNoCoerce;
82#[stable(feature = "iter_zip", since = "1.59.0")]
83pub use self::zip::zip;
84#[stable(feature = "rust1", since = "1.0.0")]
85#[cfg(not(feature = "ferrocene_subset"))]
86pub use self::{
87 chain::Chain, cycle::Cycle, enumerate::Enumerate, filter::Filter, filter_map::FilterMap,
88 flatten::FlatMap, fuse::Fuse, inspect::Inspect, map::Map, peekable::Peekable, rev::Rev,
89 scan::Scan, skip::Skip, skip_while::SkipWhile, take::Take, take_while::TakeWhile, zip::Zip,
90};
91
92#[stable(feature = "rust1", since = "1.0.0")]
94#[cfg(feature = "ferrocene_subset")]
95#[rustfmt::skip]
96pub use self::{
97 chain::Chain, enumerate::Enumerate, filter::Filter, map::Map, rev::Rev, skip::Skip,
98 step_by::StepBy, take::Take, zip::Zip,
99};
100
101#[unstable(issue = "none", feature = "inplace_iteration")]
140#[doc(hidden)]
141#[rustc_specialization_trait]
142#[cfg(not(feature = "ferrocene_subset"))]
143pub unsafe trait SourceIter {
144 type Source;
146
147 unsafe fn as_inner(&mut self) -> &mut Self::Source;
175}
176
177#[cfg(not(feature = "ferrocene_subset"))]
183pub(crate) struct GenericShunt<'a, I, R> {
184 iter: I,
185 residual: &'a mut Option<R>,
186}
187
188#[cfg(not(feature = "ferrocene_subset"))]
192pub(crate) fn try_process<I, T, R, F, U>(iter: I, mut f: F) -> ChangeOutputType<I::Item, U>
193where
194 I: Iterator<Item: Try<Output = T, Residual = R>>,
195 for<'a> F: FnMut(GenericShunt<'a, I, R>) -> U,
196 R: Residual<U>,
197{
198 let mut residual = None;
199 let shunt = GenericShunt { iter, residual: &mut residual };
200 let value = f(shunt);
201 match residual {
202 Some(r) => FromResidual::from_residual(r),
203 None => Try::from_output(value),
204 }
205}
206
207#[cfg(not(feature = "ferrocene_subset"))]
208impl<I, R> Iterator for GenericShunt<'_, I, R>
209where
210 I: Iterator<Item: Try<Residual = R>>,
211{
212 type Item = <I::Item as Try>::Output;
213
214 fn next(&mut self) -> Option<Self::Item> {
215 self.try_for_each(ControlFlow::Break).break_value()
216 }
217
218 fn size_hint(&self) -> (usize, Option<usize>) {
219 if self.residual.is_some() {
220 (0, Some(0))
221 } else {
222 let (_, upper) = self.iter.size_hint();
223 (0, upper)
224 }
225 }
226
227 fn try_fold<B, F, T>(&mut self, init: B, mut f: F) -> T
228 where
229 F: FnMut(B, Self::Item) -> T,
230 T: Try<Output = B>,
231 {
232 self.iter
233 .try_fold(init, |acc, x| match Try::branch(x) {
234 ControlFlow::Continue(x) => ControlFlow::from_try(f(acc, x)),
235 ControlFlow::Break(r) => {
236 *self.residual = Some(r);
237 ControlFlow::Break(try { acc })
238 }
239 })
240 .into_try()
241 }
242
243 impl_fold_via_try_fold! { fold -> try_fold }
244}
245
246#[unstable(issue = "none", feature = "inplace_iteration")]
247#[cfg(not(feature = "ferrocene_subset"))]
248unsafe impl<I, R> SourceIter for GenericShunt<'_, I, R>
249where
250 I: SourceIter,
251{
252 type Source = I::Source;
253
254 #[inline]
255 unsafe fn as_inner(&mut self) -> &mut Self::Source {
256 unsafe { SourceIter::as_inner(&mut self.iter) }
258 }
259}
260
261#[unstable(issue = "none", feature = "inplace_iteration")]
265#[cfg(not(feature = "ferrocene_subset"))]
266unsafe impl<I, R> InPlaceIterable for GenericShunt<'_, I, R>
267where
268 I: InPlaceIterable,
269{
270 const EXPAND_BY: Option<NonZero<usize>> = I::EXPAND_BY;
271 const MERGE_BY: Option<NonZero<usize>> = I::MERGE_BY;
272}