use super::*;
#[derive(Clone, Debug, Default)]
pub struct Vec<M> {
mutator: M,
}
pub fn vec<M>(mutator: M) -> Vec<M> {
Vec { mutator }
}
impl<M, T> Mutate<alloc::vec::Vec<T>> for Vec<M>
where
M: Generate<T>,
{
#[inline]
fn mutate(&mut self, c: &mut Candidates, value: &mut alloc::vec::Vec<T>) -> Result<()> {
if !c.shrink() {
c.mutation(|ctx| {
let index = ctx.rng().gen_index(value.len() + 1).unwrap();
let elem = self.mutator.generate(ctx)?;
value.insert(index, elem);
Ok(())
})?;
}
if !value.is_empty() {
c.mutation(|ctx| {
let index = ctx.rng().gen_index(value.len()).unwrap();
value.remove(index);
Ok(())
})?;
}
if value.len() >= 2 {
c.mutation(|ctx| {
let i = ctx.rng().gen_index(value.len()).unwrap();
let j = ctx.rng().gen_index(value.len()).unwrap();
value.swap(i, j);
Ok(())
})?;
}
for x in value {
self.mutator.mutate(c, x)?;
}
Ok(())
}
#[inline]
fn mutation_count(
&self,
value: &alloc::vec::Vec<T>,
shrink: bool,
) -> core::option::Option<u32> {
let mut count = 0u32;
if !shrink {
count += 1;
}
if !value.is_empty() {
count += 1;
}
if value.len() >= 2 {
count += 1;
}
for x in value {
count += self.mutator.mutation_count(x, shrink)?;
}
Some(count)
}
}
impl<M, T> Generate<alloc::vec::Vec<T>> for Vec<M>
where
M: Generate<T>,
{
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<alloc::vec::Vec<T>> {
self.generate_via_mutate(ctx, 1)
}
}
impl<T> DefaultMutate for alloc::vec::Vec<T>
where
T: DefaultMutate,
T::DefaultMutate: Generate<T>,
{
type DefaultMutate = Vec<T::DefaultMutate>;
}