Trait rayon::iter::ParallelDrainRange[][src]

pub trait ParallelDrainRange<Idx = usize> {
    type Iter: ParallelIterator<Item = Self::Item>;
    type Item: Send;
    fn par_drain<R: RangeBounds<Idx>>(self, range: R) -> Self::Iter;
}
Expand description

ParallelDrainRange creates a parallel iterator that moves a range of items from a collection while retaining the original capacity.

Types which are not indexable may implement ParallelDrainFull instead.

Associated Types

type Iter: ParallelIterator<Item = Self::Item>[src]

Expand description

The draining parallel iterator type that will be created.

type Item: Send[src]

Expand description

The type of item that the parallel iterator will produce. This is usually the same as IntoParallelIterator::Item.

Required methods

fn par_drain<R: RangeBounds<Idx>>(self, range: R) -> Self::Iter[src]

Expand description

Returns a draining parallel iterator over a range of the collection.

When the iterator is dropped, all items in the range are removed, even if the iterator was not fully consumed. If the iterator is leaked, for example using std::mem::forget, it is unspecified how many items are removed.

Examples

use rayon::prelude::*;

let squares: Vec<i32> = (0..10).map(|x| x * x).collect();

println!("RangeFull");
let mut vec = squares.clone();
assert!(vec.par_drain(..)
           .eq(squares.par_iter().copied()));
assert!(vec.is_empty());
assert!(vec.capacity() >= squares.len());

println!("RangeFrom");
let mut vec = squares.clone();
assert!(vec.par_drain(5..)
           .eq(squares[5..].par_iter().copied()));
assert_eq!(&vec[..], &squares[..5]);
assert!(vec.capacity() >= squares.len());

println!("RangeTo");
let mut vec = squares.clone();
assert!(vec.par_drain(..5)
           .eq(squares[..5].par_iter().copied()));
assert_eq!(&vec[..], &squares[5..]);
assert!(vec.capacity() >= squares.len());

println!("RangeToInclusive");
let mut vec = squares.clone();
assert!(vec.par_drain(..=5)
           .eq(squares[..=5].par_iter().copied()));
assert_eq!(&vec[..], &squares[6..]);
assert!(vec.capacity() >= squares.len());

println!("Range");
let mut vec = squares.clone();
assert!(vec.par_drain(3..7)
           .eq(squares[3..7].par_iter().copied()));
assert_eq!(&vec[..3], &squares[..3]);
assert_eq!(&vec[3..], &squares[7..]);
assert!(vec.capacity() >= squares.len());

println!("RangeInclusive");
let mut vec = squares.clone();
assert!(vec.par_drain(3..=7)
           .eq(squares[3..=7].par_iter().copied()));
assert_eq!(&vec[..3], &squares[..3]);
assert_eq!(&vec[3..], &squares[8..]);
assert!(vec.capacity() >= squares.len());

Implementations on Foreign Types

impl<'a, T: Send> ParallelDrainRange<usize> for &'a mut VecDeque<T>[src]

type Iter = Drain<'a, T>

type Item = T

fn par_drain<R: RangeBounds<usize>>(self, range: R) -> Self::Iter[src]

impl<'a> ParallelDrainRange<usize> for &'a mut String[src]

type Iter = Drain<'a>

type Item = char

fn par_drain<R: RangeBounds<usize>>(self, range: R) -> Self::Iter[src]

impl<'data, T: Send> ParallelDrainRange<usize> for &'data mut Vec<T>[src]

type Iter = Drain<'data, T>

type Item = T

fn par_drain<R: RangeBounds<usize>>(self, range: R) -> Self::Iter[src]

Implementors