1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
use alloc::vec::Vec;
use std::mem::MaybeUninit;
use crate::imp_prelude::*;
use crate::low_level_util::AbortIfPanic;
impl<A, S> ArrayBase<S, Ix1>
where
S: RawData<Elem = A>,
{
pub fn to_vec(&self) -> Vec<A>
where
A: Clone,
S: Data,
{
if let Some(slc) = self.as_slice() {
slc.to_vec()
} else {
crate::iterators::to_vec(self.iter().cloned())
}
}
pub(crate) fn rotate1_front(&mut self)
where
S: DataMut,
{
let mut lane_iter = self.iter_mut();
let mut dst = if let Some(dst) = lane_iter.next() { dst } else { return };
let guard = AbortIfPanic(&"rotate1_front: temporarily moving out of owned value");
let mut slot = MaybeUninit::<A>::uninit();
unsafe {
slot.as_mut_ptr().copy_from_nonoverlapping(dst, 1);
for elt in lane_iter {
(dst as *mut A).copy_from_nonoverlapping(elt, 1);
dst = elt;
}
(dst as *mut A).copy_from_nonoverlapping(slot.as_ptr(), 1);
}
guard.defuse();
}
}