1use super::*;
3use std::{usize,cmp};
4
5fn as_usize(v: u64) -> usize {
8 if v > (usize::MAX as u64) {
10 usize::MAX
11 } else {
12 v as usize
13 }
14}
15
16impl<'a> ReadAt for Vec<u8> {
18 #[inline]
19 fn read_at(&self, buf: &mut[u8], offs: u64) -> Result<usize> {
20 (&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 self.resize(offs, 0);
34 self.extend_from_slice(buf);
35 } else {
36 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}