]> git.lizzy.rs Git - rust.git/blob - tests/ui/const-generics/type-dependent/issue-70507.rs
Rollup merge of #106113 - krasimirgg:llvm-16-ext-tyid, r=nikic
[rust.git] / tests / ui / const-generics / type-dependent / issue-70507.rs
1 // run-pass
2
3 trait ConstChunksExactTrait<T> {
4     fn const_chunks_exact<const N: usize>(&self) -> ConstChunksExact<'_, T, {N}>;
5 }
6
7 impl <T> ConstChunksExactTrait<T> for [T] {
8     fn const_chunks_exact<const N: usize>(&self) -> ConstChunksExact<'_, T, {N}> {
9         assert!(N != 0);
10         let rem = self.len() % N;
11         let len = self.len() - rem;
12         let (fst, _) = self.split_at(len);
13         ConstChunksExact { v: fst, }
14     }
15 }
16
17 struct ConstChunksExact<'a, T: 'a, const N: usize> {
18     v: &'a [T],
19 }
20
21 impl <'a, T: std::fmt::Debug, const N: usize> Iterator for ConstChunksExact<'a, T, {N}> {
22     type Item = &'a [T; N];
23
24     fn next(&mut self) -> Option<Self::Item> {
25         if self.v.len() < N {
26             None
27         } else {
28             let (fst, snd) = self.v.split_at(N);
29
30             self.v = snd;
31             let ptr = fst.as_ptr() as *const _;
32             Some(unsafe { &*ptr})
33         }
34     }
35 }
36
37 fn main() {
38     let slice = &[1i32, 2, 3, 4, 5, 6, 7, 8, 9, 10];
39
40     let mut iter = [[1, 2, 3], [4, 5, 6], [7, 8, 9]].iter();
41
42     for a in slice.const_chunks_exact::<3>() {
43         assert_eq!(a, iter.next().unwrap());
44     }
45 }