2 use std
::mem
::MaybeUninit
;
4 trait CollectSlice
<'a
>: Iterator
{
5 fn inner_array
<const N
: usize>(&mut self) -> [Self::Item
; N
];
7 fn collect_array
<const N
: usize>(&mut self) -> [Self::Item
; N
] {
8 let result
= self.inner_array();
9 assert
!(self.next().is_none());
14 impl<'a
, I
: ?Sized
> CollectSlice
<'a
> for I
18 fn inner_array
<const N
: usize>(&mut self) -> [Self::Item
; N
] {
19 let mut result
: [MaybeUninit
<Self::Item
>; N
] =
20 unsafe { MaybeUninit::uninit().assume_init() }
;
23 for (dest
, item
) in result
.iter_mut().zip(self) {
24 *dest
= MaybeUninit
::new(item
);
30 let temp_ptr
: *const [MaybeUninit
<Self::Item
>; N
] = &result
;
31 unsafe { std::ptr::read(temp_ptr as *const [Self::Item; N]) }
36 let mut foos
= [0u64; 9].iter().cloned();
37 let _bar
: [u64; 9] = foos
.collect_array
::<9_usize
>();