make the array initialization guard available to other modules
This commit is contained in:
parent
b00666ed09
commit
eb3f001d37
@ -865,24 +865,6 @@ where
|
|||||||
return Ok(Try::from_output(unsafe { mem::zeroed() }));
|
return Ok(Try::from_output(unsafe { mem::zeroed() }));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Guard<'a, T, const N: usize> {
|
|
||||||
array_mut: &'a mut [MaybeUninit<T>; N],
|
|
||||||
initialized: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T, const N: usize> Drop for Guard<'_, T, N> {
|
|
||||||
fn drop(&mut self) {
|
|
||||||
debug_assert!(self.initialized <= N);
|
|
||||||
|
|
||||||
// SAFETY: this slice will contain only initialized objects.
|
|
||||||
unsafe {
|
|
||||||
crate::ptr::drop_in_place(MaybeUninit::slice_assume_init_mut(
|
|
||||||
&mut self.array_mut.get_unchecked_mut(..self.initialized),
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut array = MaybeUninit::uninit_array::<N>();
|
let mut array = MaybeUninit::uninit_array::<N>();
|
||||||
let mut guard = Guard { array_mut: &mut array, initialized: 0 };
|
let mut guard = Guard { array_mut: &mut array, initialized: 0 };
|
||||||
|
|
||||||
@ -920,6 +902,24 @@ where
|
|||||||
Ok(Try::from_output(output))
|
Ok(Try::from_output(output))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) struct Guard<'a, T, const N: usize> {
|
||||||
|
pub array_mut: &'a mut [MaybeUninit<T>; N],
|
||||||
|
pub initialized: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<T, const N: usize> Drop for Guard<'_, T, N> {
|
||||||
|
fn drop(&mut self) {
|
||||||
|
debug_assert!(self.initialized <= N);
|
||||||
|
|
||||||
|
// SAFETY: this slice will contain only initialized objects.
|
||||||
|
unsafe {
|
||||||
|
crate::ptr::drop_in_place(MaybeUninit::slice_assume_init_mut(
|
||||||
|
&mut self.array_mut.get_unchecked_mut(..self.initialized),
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the next chunk of `N` items from the iterator or errors with an
|
/// Returns the next chunk of `N` items from the iterator or errors with an
|
||||||
/// iterator over the remainder. Used for `Iterator::next_chunk`.
|
/// iterator over the remainder. Used for `Iterator::next_chunk`.
|
||||||
#[inline]
|
#[inline]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user