]>
git.proxmox.com Git - rustc.git/blob - vendor/rayon/src/iter/skip.rs
1 use super::noop
::NoopConsumer
;
2 use super::plumbing
::*;
6 /// `Skip` is an iterator that skips over the first `n` elements.
7 /// This struct is created by the [`skip()`] method on [`IndexedParallelIterator`]
9 /// [`skip()`]: trait.IndexedParallelIterator.html#method.skip
10 /// [`IndexedParallelIterator`]: trait.IndexedParallelIterator.html
11 #[must_use = "iterator adaptors are lazy and do nothing unless consumed"]
12 #[derive(Debug, Clone)]
20 I
: IndexedParallelIterator
,
22 /// Creates a new `Skip` iterator.
23 pub(super) fn new(base
: I
, n
: usize) -> Self {
24 let n
= min(base
.len(), n
);
29 impl<I
> ParallelIterator
for Skip
<I
>
31 I
: IndexedParallelIterator
,
35 fn drive_unindexed
<C
>(self, consumer
: C
) -> C
::Result
37 C
: UnindexedConsumer
<Self::Item
>,
39 bridge(self, consumer
)
42 fn opt_len(&self) -> Option
<usize> {
47 impl<I
> IndexedParallelIterator
for Skip
<I
>
49 I
: IndexedParallelIterator
,
51 fn len(&self) -> usize {
52 self.base
.len() - self.n
55 fn drive
<C
: Consumer
<Self::Item
>>(self, consumer
: C
) -> C
::Result
{
56 bridge(self, consumer
)
59 fn with_producer
<CB
>(self, callback
: CB
) -> CB
::Output
61 CB
: ProducerCallback
<Self::Item
>,
63 return self.base
.with_producer(Callback
{
73 impl<T
, CB
> ProducerCallback
<T
> for Callback
<CB
>
75 CB
: ProducerCallback
<T
>,
77 type Output
= CB
::Output
;
78 fn callback
<P
>(self, base
: P
) -> CB
::Output
80 P
: Producer
<Item
= T
>,
82 crate::in_place_scope(|scope
| {
83 let Self { callback, n }
= self;
84 let (before_skip
, after_skip
) = base
.split_at(n
);
86 // Run the skipped part separately for side effects.
87 // We'll still get any panics propagated back by the scope.
88 scope
.spawn(move |_
| bridge_producer_consumer(n
, before_skip
, NoopConsumer
));
90 callback
.callback(after_skip
)