use std::io;
use std::mem::MaybeUninit;
pub(crate) fn read_into_uninit<R: io::Read>(
buffer: &mut Vec<u8>,
reader: &mut R,
target_len: usize,
) -> io::Result<usize> {
let old_len = buffer.len();
debug_assert!(target_len >= old_len);
if buffer.capacity() < target_len {
buffer.reserve(target_len - old_len);
}
let spare = &mut buffer.spare_capacity_mut()[..target_len - old_len];
let spare: &mut [u8] = unsafe { &mut *(spare as *mut [MaybeUninit<u8>] as *mut [u8]) };
let n = reader.read(spare)?;
unsafe { buffer.set_len(old_len + n) };
Ok(n)
}