io_at/
vec.rs

1/* TODO: provide a wrapper type impl for Deref<[u8]> and DerefMut<[u8]> */
2use super::*;
3use std::{usize,cmp};
4
5/* TODO: see if there is a cannonical way of handling this for any 2 numerics (without an extra
6 * crate) */
7fn as_usize(v: u64) -> usize {
8    /* clamping cast */
9    if v > (usize::MAX as u64) {
10        usize::MAX
11    } else {
12        v as usize
13    }
14}
15
16/* TODO: eliminate duplication here */
17impl<'a> ReadAt for Vec<u8> {
18    #[inline]
19    fn read_at(&self, buf: &mut[u8], offs: u64) -> Result<usize> {
20        /* use &[u8] impl */
21        (&self[..]).read_at(buf, offs)
22    }
23}
24
25impl WriteAt for Vec<u8> {
26    fn write_at(&mut self, buf: &[u8], offs: u64) -> Result<usize> {
27        let offs = as_usize(offs);
28        if buf.len() == 0 {
29            return Ok(0);
30        }
31        if offs > self.len() {
32            /* fill extra space with zeros */
33            self.resize(offs, 0);
34            self.extend_from_slice(buf);
35        } else {
36            /* 2 pieces:
37             *  - copy_from_slice() what fits
38             *  - extend_from_slice() what doesn't
39             */
40            let l = {
41                let r = &mut self[offs..];
42                let l = cmp::min(buf.len(), r.len());
43                let r = &mut r[..l];
44                let buf = &buf[..l];
45                r.copy_from_slice(buf);
46                l
47            };
48
49            if l < buf.len() {
50                self.extend_from_slice(&buf[l..]);
51            }
52        }
53        Ok(buf.len())
54    }
55}
56
57#[test]
58fn do_t() {
59    let x = vec![];
60    super::test_impl(x);
61}
62
63#[test]
64fn ref_vec() {
65    let mut x = vec![];
66    super::test_impl(&mut x);
67}