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),*)
    }};
);