3 #![cfg_attr(full, feature(const_generics))]
4 #![cfg_attr(full, allow(incomplete_features))]
5 #![cfg_attr(min, feature(min_const_generics))]
7 trait SliceExt
<T
: Clone
> {
8 fn array_windows_example
<'a
, const N
: usize>(&'a
self) -> ArrayWindowsExample
<'a
, T
, N
>;
11 impl <T
: Clone
> SliceExt
<T
> for [T
] {
12 fn array_windows_example
<'a
, const N
: usize>(&'a
self) -> ArrayWindowsExample
<'a
, T
, N
> {
13 ArrayWindowsExample{ idx: 0, slice: &self }
17 struct ArrayWindowsExample
<'a
, T
, const N
: usize> {
22 impl <'a
, T
: Clone
, const N
: usize> Iterator
for ArrayWindowsExample
<'a
, T
, N
> {
24 fn next(&mut self) -> Option
<Self::Item
> {
25 // Note: this is unsound for some `T` and not meant as an example
26 // on how to implement `ArrayWindows`.
27 let mut res
= unsafe{ std::mem::zeroed() }
;
28 let mut ptr
= &mut res
as *mut [T
; N
] as *mut T
;
31 match self.slice
[self.idx
..].get(i
) {
33 Some(elem
) => unsafe { std::ptr::write_volatile(ptr, elem.clone())}
,
35 ptr
= ptr
.wrapping_add(1);
43 const FOUR
: usize = 4;
46 let v
: Vec
<usize> = vec
![0; 100];
48 for array
in v
.as_slice().array_windows_example
::<FOUR
>() {
49 assert_eq
!(array
, [0, 0, 0, 0])