use std::marker::PhantomData;
pub(crate) mod tag {
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum TestOperatorTag {}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum SelectionOperatorTag {}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum RecombinationOperatorTag {}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum MutationOperatorTag {}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub enum TerminationOperatorTag {}
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct ParEachOperator<OperatorTag, S, O> {
operator: O,
_solution: PhantomData<S>,
_operator_tag: PhantomData<OperatorTag>,
}
impl<OperatorTag, S, O> ParEachOperator<OperatorTag, S, O> {
pub(crate) fn operator(&self) -> &O {
&self.operator
}
}
pub trait ParEach<OperatorTag, S, const N: usize, const M: usize> {
fn par_each(self) -> ParEachOperator<OperatorTag, S, Self>
where
Self: Sized,
{
ParEachOperator {
operator: self,
_solution: PhantomData,
_operator_tag: PhantomData,
}
}
}
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
pub struct ParBatchOperator<OperatorTag, S, O> {
operator: O,
_solution: PhantomData<S>,
_operator_tag: PhantomData<OperatorTag>,
}
impl<OperatorTag, S, O> ParBatchOperator<OperatorTag, S, O> {
pub(crate) fn operator(&self) -> &O {
&self.operator
}
}
pub trait ParBatch<OperatorTag, S, const N: usize> {
fn par_batch(self) -> ParBatchOperator<OperatorTag, S, Self>
where
Self: Sized,
{
ParBatchOperator {
operator: self,
_solution: PhantomData,
_operator_tag: PhantomData,
}
}
}