buf_ref_reader/buffer/
vec.rs1use copy_in_place::*;
3
4pub struct VecBuffer {
6 buf: Vec<u8>,
7 start: usize,
9 end: usize,
10}
11impl super::Buffer for VecBuffer {
12 type Error = ();
13 fn new(size: usize) -> Result<Self, ()> {
14 let mut buf = Vec::with_capacity(size);
15 unsafe { buf.set_len(size); }
16 Ok(VecBuffer {
17 buf,
18 start: 0, end: 0,
19 })
20 }
21 fn enlarge(&mut self) -> Result<(), ()> {
23 if self.len() == self.buf.len() {
25 self.buf.reserve(self.buf.len());
27 unsafe { self.buf.set_len(self.buf.len() * 2) };
28 } else {
29 if self.end - self.start != 0 {
31 copy_in_place(&mut self.buf, self.start..self.end, 0);
33 }
34 self.end -= self.start;
35 self.start = 0;
36 }
37 Ok(())
38 }
39 fn len(&self) -> usize {
40 self.end - self.start
41 }
42 fn filled(&self) -> &[u8] {
43 &self.buf[ self.start .. self.end ]
44 }
45 fn appendable(&mut self) -> &mut [u8] {
46 &mut self.buf[ self.end .. ]
47 }
48 fn grow(&mut self, amount: usize) {
49 self.end += amount;
50 }
51 fn consume(&mut self, amount: usize) -> &[u8] {
64 let amount = std::cmp::min(amount, self.len());
65 let start = self.start;
66 self.start += amount;
67 &self.buf[ start .. (start+amount) ]
68 }
69}