2 // compile-flags:-Zmir-opt-level=3
4 use std
::mem
::MaybeUninit
;
7 trait CollectArray
<A
>: Iterator
<Item
= A
> {
8 fn inner_array(&mut self) -> [A
; N
];
9 fn collect_array(&mut self) -> [A
; N
] {
10 let result
= self.inner_array();
11 assert
!(self.next().is_none());
16 impl<A
, I
: ?Sized
> CollectArray
<A
> for I
18 I
: Iterator
<Item
= A
>,
20 fn inner_array(&mut self) -> [A
; N
] {
21 let mut result
: [MaybeUninit
<A
>; N
] = unsafe { MaybeUninit::uninit().assume_init() }
;
22 for (dest
, item
) in result
.iter_mut().zip(self) {
23 *dest
= MaybeUninit
::new(item
);
25 let temp_ptr
: *const [MaybeUninit
<A
>; N
] = &result
;
26 unsafe { std::ptr::read(temp_ptr as *const [A; N]) }
34 .map(|row
| row
.iter().collect_array())