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