positioned_io/
array.rs

1use std::{cmp::min, io};
2
3use super::{ReadAt, Size, WriteAt};
4
5impl ReadAt for &[u8] {
6    fn read_at(&self, pos: u64, buf: &mut [u8]) -> io::Result<usize> {
7        if pos >= self.len() as u64 {
8            return Ok(0);
9        }
10        let pos = pos as usize;
11        let bytes = min(buf.len(), self.len() - pos);
12        buf[..bytes].copy_from_slice(&self[pos..(pos + bytes)]);
13        Ok(bytes)
14    }
15}
16
17impl ReadAt for &mut [u8] {
18    fn read_at(&self, pos: u64, buf: &mut [u8]) -> io::Result<usize> {
19        let immutable: &[u8] = self;
20        immutable.read_at(pos, buf)
21    }
22}
23
24impl WriteAt for &mut [u8] {
25    fn write_at(&mut self, pos: u64, buf: &[u8]) -> io::Result<usize> {
26        if pos >= self.len() as u64 {
27            return Ok(0);
28        }
29        let pos = pos as usize;
30        let bytes = min(buf.len(), self.len() - pos);
31        self[pos..(pos + bytes)].copy_from_slice(&buf[..bytes]);
32        Ok(bytes)
33    }
34
35    fn flush(&mut self) -> io::Result<()> {
36        Ok(())
37    }
38}
39
40impl Size for &[u8] {
41    fn size(&self) -> io::Result<Option<u64>> {
42        Ok(Some(self.len() as u64))
43    }
44}
45
46impl Size for &mut [u8] {
47    fn size(&self) -> io::Result<Option<u64>> {
48        Ok(Some(self.len() as u64))
49    }
50}