1pub trait VecExt<T> {
4 fn copy_overlapped(&mut self, src: usize, dst: usize, len: usize);
6}
7
8pub trait VecExt2<T> {
9 fn pop_first(&mut self) -> Option<T>;
11}
12
13impl<T: Copy> VecExt<T> for Vec<T> {
14 fn copy_overlapped(&mut self, src: usize, dst: usize, mut len: usize) {
15 let mut src = src.min(self.len());
16 let mut dst = dst.min(self.len());
17 if dst > src {
18 while len > 0 {
19 let preceding = (dst - src).min(len);
20 for i in 0..preceding {
21 self[dst + i] = self[src + i];
22 }
23 len -= preceding;
24 src += preceding;
25 dst += preceding;
26 }
27 } else {
28 for i in 0..len {
29 self[dst + i] = self[src + i];
30 }
31 }
32 }
33}
34
35impl<T> VecExt2<T> for Vec<T> {
36 fn pop_first(&mut self) -> Option<T> {
37 if self.is_empty() {
38 None
39 } else {
40 Some(self.remove(0))
41 }
42 }
43}