use std::mem::MaybeUninit;
use std::slice;
#[inline]
pub(crate) fn maybe_uninit_write_from_exact_size_iter<T: Copy>(
slice: &mut [MaybeUninit<T>],
iter: impl IntoIterator<Item = T>,
write_on_panic: T,
) {
struct WriteRemOnDrop<'a, T: Copy>(slice::IterMut<'a, MaybeUninit<T>>, T);
impl<'a, T: Copy> Drop for WriteRemOnDrop<'a, T> {
fn drop(&mut self) {
for elem in &mut self.0 {
elem.write(self.1);
}
}
}
let mut slice = WriteRemOnDrop(slice.iter_mut(), write_on_panic);
let mut iter = iter.into_iter();
for (elem_place, elem) in slice.0.by_ref().zip(iter.by_ref()) {
elem_place.write(elem);
}
assert!(
slice.0.next().is_none() && iter.next().is_none(),
"iterator provided size_hint incorrectly",
);
drop(slice);
}