use std::{
ops::Index,
slice::Iter,
iter::Copied,
};
use crate::{
indexed_type::Unindexed,
immutable::iter::SeqSelectIndicesIter,
};
pub trait SelectIndices<'a> {
fn select_with_iter<Indices>(&'a self, indices: Indices) -> SeqSelectIndicesIter<'a, Self, Indices::IntoIter, Unindexed>
where
Indices: IntoIterator,
Indices::Item: Copy,
Self: Index<Indices::Item>,
{
SeqSelectIndicesIter {
data: self,
indices: indices.into_iter(),
_phantom: Default::default(),
}
}
fn select_indices<Idx>(&'a self, indices: &'a [Idx]) -> SeqSelectIndicesIter<'a, Self, Copied<Iter<'a, Idx>>, Unindexed>
where
Self: Index<Idx>,
Idx: Copy,
{
self.select_with_iter(indices.iter().copied())
}
}
impl<D> SelectIndices<'_> for D
where
D: ?Sized
{}
#[cfg(feature = "rayon")]
mod parallel {
use std::ops::Index;
use crate::{
indexed_type::Unindexed,
immutable::iter::ParSelectIndicesIter,
};
use ::rayon::{
prelude::*,
slice::Iter,
iter::Copied,
};
pub trait ParSelectIndices<'a>
{
fn par_select_with_iter<Indices>(&'a self, indices: Indices) -> ParSelectIndicesIter<'a, Self, Indices::Iter, Unindexed>
where
Indices: IntoParallelIterator,
Indices::Item: Copy,
Self: Index<Indices::Item>,
{
ParSelectIndicesIter {
data: self,
indices: indices.into_par_iter(),
_phantom: Default::default(),
}
}
fn par_select_indices<Idx>(&'a self, indices: &'a [Idx]) -> ParSelectIndicesIter<'a, Self, Copied<Iter<'a, Idx>>, Unindexed>
where
Self: Index<Idx>,
Idx: Copy + Sync + Send,
{
self.par_select_with_iter(indices.into_par_iter().copied())
}
}
impl<D> ParSelectIndices<'_> for D
where
D: ?Sized
{}
}
#[cfg(feature = "rayon")]
pub use self::parallel::ParSelectIndices;