in lain/src/mutatable.rs [130:164]
fn shrink_vec<T, R: Rng>(vec: &mut Vec<T>, mutator: &mut Mutator<R>) {
if vec.is_empty() {
return;
}
let resize_count = VecResizeCount::new_fuzzed(mutator, None);
let mut num_elements = match resize_count {
VecResizeCount::Quarter => vec.len() / 4,
VecResizeCount::Half => vec.len() / 2,
VecResizeCount::ThreeQuarters => vec.len() - (vec.len() / 4),
VecResizeCount::FixedBytes => mutator.gen_range(1, 9),
VecResizeCount::AllBytes => vec.len(),
};
if num_elements == 0 {
num_elements = mutator.gen_range(0, vec.len() + 1);
}
num_elements = std::cmp::min(num_elements, vec.len());
// Special case probably isn't required here, but better to be explicit
if num_elements == vec.len() {
vec.drain(..);
return;
}
match VecResizeDirection::new_fuzzed(mutator, None) {
VecResizeDirection::FromBeginning => {
vec.drain(0..num_elements);
}
VecResizeDirection::FromEnd => {
vec.drain(vec.len() - num_elements..);
}
}
}