io_at/
slice.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
16impl ReadAt for [u8] {
17    fn read_at(&self, buf: &mut[u8], offs: u64) -> Result<usize> {
18        let src = self;
19        let offs = as_usize(offs);
20        if offs > src.len() {
21            return Ok(0);
22        }
23
24        let r = &src[offs..];
25        let l = cmp::min(buf.len(), r.len());
26        let r = &r[..l];
27        let buf = &mut buf[..l];
28
29        buf.copy_from_slice(r);
30        Ok(l)
31    }
32}
33
34impl WriteAt for [u8] {
35    fn write_at(&mut self, buf: &[u8], offs: u64) -> Result<usize> {
36        let offs = as_usize(offs);
37        if offs > self.len() {
38            return Ok(0);
39        }
40
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
46        r.copy_from_slice(buf);
47        Ok(l)
48    }
49}
50
51#[test]
52fn do_t() {
53    let mut x = [0u8;128];
54    super::test_impl(&mut x[..]);
55}
56