use std::collections::TryReserveError;
pub(crate) fn reserve_exact_cleared<T>(
buf: &mut Vec<T>,
target: usize,
) -> Result<(), TryReserveError> {
buf.clear();
buf.try_reserve_exact(target)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn warm_buffer_reaches_target_capacity_without_realloc_during_fill() {
let target = 1000usize;
let mut buf: Vec<u32> = Vec::with_capacity(600);
buf.extend(0..600);
assert!(buf.capacity() >= 600 && buf.capacity() < target);
reserve_exact_cleared(&mut buf, target).expect("reservation must succeed");
assert_eq!(buf.len(), 0, "buffer must be cleared");
assert!(
buf.capacity() >= target,
"warm buffer must reach target capacity (got {}, want >= {target})",
buf.capacity()
);
let cap_before_fill = buf.capacity();
buf.extend(0..target as u32);
assert_eq!(
buf.capacity(),
cap_before_fill,
"a single target-sized fill must not reallocate after reserve_exact_cleared"
);
}
#[test]
fn cold_buffer_reaches_target_capacity() {
let mut buf: Vec<u8> = Vec::new();
reserve_exact_cleared(&mut buf, 256).expect("reservation must succeed");
assert_eq!(buf.len(), 0);
assert!(buf.capacity() >= 256);
}
#[test]
fn zero_target_just_clears() {
let mut buf: Vec<u64> = vec![1, 2, 3];
reserve_exact_cleared(&mut buf, 0).expect("zero reservation must succeed");
assert!(buf.is_empty());
}
}