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
65
66
67
68
use crate::sealed::Sealed;

use alloc::vec::Vec;
use core::ptr;

pub trait VecExt<T>: Sealed {
    fn insert_vec(&mut self, index: usize, other: Vec<T>);

    fn remove_if<F>(&mut self, f: F)
    where
        F: FnMut(&mut T) -> bool;
}

impl<T> Sealed for Vec<T> {}

impl<T> VecExt<T> for Vec<T> {
    fn insert_vec(&mut self, index: usize, mut v: Vec<T>) {
        self.reserve_exact(v.len());

        unsafe {
            let len = self.len();
            let base = self.as_mut_ptr();
            let additional = v.len();

            // move existing elements
            ptr::copy(base.add(index), base.add(index + additional), len - index);

            // copy from `v`
            ptr::copy_nonoverlapping(v.as_ptr(), base.add(index), additional);

            // set length
            v.set_len(0);
            self.set_len(len + additional);
        }
    }

    fn remove_if<F>(&mut self, mut f: F)
    where
        F: FnMut(&mut T) -> bool,
    {
        self.retain_mut(|x| !f(x))
    }
}

#[cfg(test)]
mod tests {
    use super::*;

    fn o<T: ToOwned + ?Sized>(x: &T) -> T::Owned {
        x.to_owned()
    }

    #[test]
    fn test_insert_vec() {
        {
            let mut v = vec![1, 2, 3, 4, 5];
            v.insert_vec(2, vec![6, 7, 8]);
            assert_eq!(v, vec![1, 2, 6, 7, 8, 3, 4, 5]);
        }

        // owned strings
        {
            let mut v = vec![o("a"), o("b"), o("c"), o("d"), o("e")];
            v.insert_vec(2, vec![o("f"), o("g"), o("h")]);
            assert_eq!(v, vec![o("a"), o("b"), o("f"), o("g"), o("h"), o("c"), o("d"), o("e")]);
        }
    }
}