]>
Commit | Line | Data |
---|---|---|
3dfed10e | 1 | // run-pass |
1b1a35ee XL |
2 | // revisions: full min |
3 | #![cfg_attr(full, feature(const_generics))] | |
4 | #![cfg_attr(full, allow(incomplete_features))] | |
5 | #![cfg_attr(min, feature(min_const_generics))] | |
3dfed10e XL |
6 | |
7 | use std::mem::MaybeUninit; | |
8 | ||
9 | trait CollectSlice<'a>: Iterator { | |
10 | fn inner_array<const N: usize>(&mut self) -> [Self::Item; N]; | |
11 | ||
12 | fn collect_array<const N: usize>(&mut self) -> [Self::Item; N] { | |
13 | let result = self.inner_array(); | |
14 | assert!(self.next().is_none()); | |
15 | result | |
16 | } | |
17 | } | |
18 | ||
19 | impl<'a, I: ?Sized> CollectSlice<'a> for I | |
20 | where | |
21 | I: Iterator, | |
22 | { | |
23 | fn inner_array<const N: usize>(&mut self) -> [Self::Item; N] { | |
24 | let mut result: [MaybeUninit<Self::Item>; N] = | |
25 | unsafe { MaybeUninit::uninit().assume_init() }; | |
26 | ||
27 | let mut count = 0; | |
28 | for (dest, item) in result.iter_mut().zip(self) { | |
29 | *dest = MaybeUninit::new(item); | |
30 | count += 1; | |
31 | } | |
32 | ||
33 | assert_eq!(N, count); | |
34 | ||
35 | let temp_ptr: *const [MaybeUninit<Self::Item>; N] = &result; | |
36 | unsafe { std::ptr::read(temp_ptr as *const [Self::Item; N]) } | |
37 | } | |
38 | } | |
39 | ||
40 | fn main() { | |
41 | let mut foos = [0u64; 9].iter().cloned(); | |
42 | let _bar: [u64; 9] = foos.collect_array::<9_usize>(); | |
43 | } |