pub use super::clone::Clone as CrossoverClone;
pub use super::single_gene::SingleGene as CrossoverSingleGene;
pub use super::single_point::SinglePoint as CrossoverSinglePoint;
pub use super::uniform::Uniform as CrossoverUniform;
pub use super::Crossover;
use crate::genotype::Genotype;
use crate::population::Population;
use rand::Rng;
#[derive(Clone, Debug)]
pub enum Wrapper {
Clone(CrossoverClone),
SingleGene(CrossoverSingleGene),
SinglePoint(CrossoverSinglePoint),
Uniform(CrossoverUniform),
}
impl Crossover for Wrapper {
fn call<T: Genotype, R: Rng>(
&mut self,
genotype: &T,
population: &mut Population<T>,
rng: &mut R,
) {
match self {
Wrapper::Clone(crossover) => crossover.call(genotype, population, rng),
Wrapper::SingleGene(crossover) => crossover.call(genotype, population, rng),
Wrapper::SinglePoint(crossover) => crossover.call(genotype, population, rng),
Wrapper::Uniform(crossover) => crossover.call(genotype, population, rng),
}
}
fn require_crossover_indexes(&self) -> bool {
match self {
Wrapper::Clone(crossover) => crossover.require_crossover_indexes(),
Wrapper::SingleGene(crossover) => crossover.require_crossover_indexes(),
Wrapper::SinglePoint(crossover) => crossover.require_crossover_indexes(),
Wrapper::Uniform(crossover) => crossover.require_crossover_indexes(),
}
}
fn require_crossover_points(&self) -> bool {
match self {
Wrapper::Clone(crossover) => crossover.require_crossover_points(),
Wrapper::SingleGene(crossover) => crossover.require_crossover_points(),
Wrapper::SinglePoint(crossover) => crossover.require_crossover_points(),
Wrapper::Uniform(crossover) => crossover.require_crossover_points(),
}
}
}
impl From<CrossoverClone> for Wrapper {
fn from(crossover: CrossoverClone) -> Self {
Wrapper::Clone(crossover)
}
}
impl From<CrossoverSingleGene> for Wrapper {
fn from(crossover: CrossoverSingleGene) -> Self {
Wrapper::SingleGene(crossover)
}
}
impl From<CrossoverSinglePoint> for Wrapper {
fn from(crossover: CrossoverSinglePoint) -> Self {
Wrapper::SinglePoint(crossover)
}
}
impl From<CrossoverUniform> for Wrapper {
fn from(crossover: CrossoverUniform) -> Self {
Wrapper::Uniform(crossover)
}
}