use super::*;
#[derive(Clone, Debug, Default)]
pub struct BinaryHeap<M> {
mutator: M,
}
pub fn binary_heap<M>(mutator: M) -> BinaryHeap<M> {
BinaryHeap { mutator }
}
impl<M, T> Mutate<alloc::collections::BinaryHeap<T>> for BinaryHeap<M>
where
M: Generate<T>,
T: Ord,
{
#[inline]
fn mutation_count(
&self,
value: &alloc::collections::BinaryHeap<T>,
shrink: bool,
) -> core::option::Option<u32> {
let mut count = 0u32;
count += !shrink as u32;
count += !value.is_empty() as u32;
count += !value.is_empty() as u32;
Some(count)
}
#[inline]
fn mutate(
&mut self,
c: &mut Candidates,
value: &mut alloc::collections::BinaryHeap<T>,
) -> Result<()> {
if !c.shrink() {
c.mutation(|ctx| {
let elem = self.mutator.generate(ctx)?;
value.push(elem);
Ok(())
})?;
}
if !value.is_empty() {
c.mutation(|_ctx| {
value.pop();
Ok(())
})?;
}
if !value.is_empty() {
c.mutation(|ctx| {
let mut vec = core::mem::take(value).into_vec();
let index = ctx.rng().gen_index(vec.len()).unwrap();
vec[index] = self.mutator.generate(ctx)?;
*value = alloc::collections::BinaryHeap::from(vec);
Ok(())
})?;
}
Ok(())
}
}
impl<M, T> Generate<alloc::collections::BinaryHeap<T>> for BinaryHeap<M>
where
M: Generate<T>,
T: Ord,
{
#[inline]
fn generate(&mut self, ctx: &mut Context) -> Result<alloc::collections::BinaryHeap<T>> {
self.generate_via_mutate(ctx, 1)
}
}
impl<T> DefaultMutate for alloc::collections::BinaryHeap<T>
where
T: DefaultMutate + Ord,
T::DefaultMutate: Generate<T>,
{
type DefaultMutate = BinaryHeap<T::DefaultMutate>;
}