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