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}