2 #![feature(const_generics)]
3 #![allow(incomplete_features)]
5 use std::mem::MaybeUninit;
7 trait CollectSlice<'a>: Iterator {
8 fn inner_array<const N: usize>(&mut self) -> [Self::Item; N];
10 fn collect_array<const N: usize>(&mut self) -> [Self::Item; N] {
11 let result = self.inner_array();
12 assert!(self.next().is_none());
17 impl<'a, I: ?Sized> CollectSlice<'a> for I
21 fn inner_array<const N: usize>(&mut self) -> [Self::Item; N] {
22 let mut result: [MaybeUninit<Self::Item>; N] =
23 unsafe { MaybeUninit::uninit().assume_init() };
26 for (dest, item) in result.iter_mut().zip(self) {
27 *dest = MaybeUninit::new(item);
33 let temp_ptr: *const [MaybeUninit<Self::Item>; N] = &result;
34 unsafe { std::ptr::read(temp_ptr as *const [Self::Item; N]) }
39 let mut foos = [0u64; 9].iter().cloned();
40 let _bar: [u64; 9] = foos.collect_array::<9_usize>();