use core::{
array,
mem::{self, MaybeUninit},
};
use crate::utils;
pub(crate) struct OutputArray<T, const N: usize> {
data: [MaybeUninit<T>; N],
}
impl<T, const N: usize> OutputArray<T, N> {
pub(crate) fn uninit() -> Self {
Self {
data: array::from_fn(|_| MaybeUninit::uninit()),
}
}
pub(crate) fn write(&mut self, idx: usize, value: T) {
self.data[idx] = MaybeUninit::new(value);
}
pub(crate) unsafe fn drop(&mut self, idx: usize) {
unsafe { self.data[idx].assume_init_drop() };
}
pub(crate) unsafe fn take(&mut self) -> [T; N] {
let mut data = array::from_fn(|_| MaybeUninit::uninit());
mem::swap(&mut self.data, &mut data);
unsafe { utils::array_assume_init(data) }
}
}