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
8impl<T: Copy> VecExt<T> for Vec<T> {
9    fn copy_overlapped(&mut self, src: usize, dst: usize, mut len: usize) {
10        let mut src = src.min(self.len());
11        let mut dst = dst.min(self.len());
12        if dst > src {
13            while len > 0 {
14                let preceding = (dst - src).min(len);
15                for i in 0..preceding {
16                    self[dst + i] = self[src + i];
17                }
18                len -= preceding;
19                src += preceding;
20                dst += preceding;
21            }
22        } else {
23            for i in 0..len {
24                self[dst + i] = self[src + i];
25            }
26        }
27    }
28}