msg_tool\ext/
vec.rs

1//!Extensions for vector operations.
2/// Extensions for vector operations.
3pub trait VecExt<T> {
4    /// Copy potentially overlapping sequence of elements from `src` to `dst`.
5    fn copy_overlapped(&mut self, src: usize, dst: usize, len: usize);
6}
7
8pub trait VecExt2<T> {
9    /// Pop the first element of the vector, returning `None` if empty.
10    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}