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
#[macro_export]
macro_rules! unsafe_clone_slices (
() => {{ vec![] }};
($size:expr; $($e:expr),*) => {{
let list = vec![$($e),*];
let mut sizes = vec![];
let mut size = $size;
for slice in &list {
let mut len = slice.len();
len = std::cmp::min(size, len);
size -= len;
sizes.push(len);
if size == 0 {
break;
}
}
let capacity = sizes.iter().sum();
let mut out = Vec::with_capacity(capacity);
{
out.set_len(capacity);
let mut dst_ptr = out.as_mut_ptr();
for (slice, len) in list.iter().zip(&sizes)
{
let src_ptr = slice.as_ptr();
std::ptr::copy_nonoverlapping(src_ptr, dst_ptr, *len);
dst_ptr = dst_ptr.add(*len);
}
}
out
}};
($($e:expr),*) => {{
unsafe_clone_slices!(usize::MAX; $($e),*)
}};
);