vectorized

This commit is contained in:
nora 2023-12-04 22:05:40 +01:00
parent 4fcd930a32
commit baa75ab5dd
3 changed files with 139 additions and 2 deletions

View file

@ -15,7 +15,8 @@ pub trait IteratorExt: Iterator {
/// If `next` panics, collected items are leaked. Too bad!
fn collect_array<const N: usize>(&mut self) -> Result<[Self::Item; N], CollectArrayError> {
// SAFETY: Uninit is valid for MaybeUninit
let mut array: [MaybeUninit<Self::Item>; N] = unsafe { MaybeUninit::uninit().assume_init() };
let mut array: [MaybeUninit<Self::Item>; N] =
unsafe { MaybeUninit::uninit().assume_init() };
for i in 0..array.len() {
array[i].write(self.next().ok_or(CollectArrayError)?);
@ -28,6 +29,32 @@ pub trait IteratorExt: Iterator {
// SAFETY: All elements have been initialized
Ok(array.map(|elem| unsafe { elem.assume_init() }))
}
/// Collect an iterator into an array.
/// If `next` panics, collected items are leaked. Too bad!
fn collect_array_default<const N: usize>(
&mut self,
) -> Result<[Self::Item; N], CollectArrayError>
where
Self::Item: Default + Copy,
{
// SAFETY: Uninit is valid for MaybeUninit
let mut array: [Self::Item; N] = [Default::default(); N];
for i in 0..array.len() {
let Some(elem) = self.next() else {
break;
};
array[i] = elem;
}
if self.next().is_some() {
return Err(CollectArrayError);
}
// SAFETY: All elements have been initialized
Ok(array)
}
}
impl<I: Iterator> IteratorExt for I {}
@ -42,4 +69,4 @@ mod tests {
assert!([0, 1].into_iter().collect_array::<1>().is_err());
assert_eq!([0, 1].into_iter().collect_array().unwrap(), [0, 1]);
}
}
}