1#[derive(Debug, Default)]
2#[doc(hidden)]
3pub struct Buffer(usize, Vec<u8>);
4impl From<Buffer> for Vec<u8> {
5 fn from(Buffer(offset, mut vec): Buffer) -> Self {
6 vec.copy_within(offset.., 0);
7 vec.truncate(vec.len() - offset);
8 vec
9 }
10}
11impl From<Vec<u8>> for Buffer {
12 fn from(value: Vec<u8>) -> Self {
13 Self(0, value)
14 }
15}
16impl std::ops::Deref for Buffer {
17 type Target = [u8];
18
19 fn deref(&self) -> &Self::Target {
20 &self.1[self.0..]
21 }
22}
23impl std::ops::DerefMut for Buffer {
24 fn deref_mut(&mut self) -> &mut Self::Target {
25 &mut self.1[self.0..]
26 }
27}
28#[doc(hidden)]
29impl Buffer {
30 pub fn truncate(&mut self, n: usize) {
31 if n == 0 {
32 self.0 = 0;
33 self.1.truncate(0);
34 } else {
35 self.1.truncate(self.0 + n);
36 }
37 }
38
39 pub fn extend_from_slice(&mut self, slice: &[u8]) {
40 self.1.extend_from_slice(slice);
41 }
42
43 pub fn ignore_front(&mut self, n: usize) {
44 self.0 += n;
45 if self.0 >= self.1.len() {
46 self.1.truncate(0);
47 self.0 = 0;
48 }
49 }
50
51 pub fn len(&self) -> usize {
52 self.1.len() - self.0
53 }
54
55 pub fn is_empty(&self) -> bool {
56 self.1.len() == self.0
57 }
58
59 pub fn fill_capacity(&mut self) {
60 self.1.resize(self.1.capacity(), 0);
61 }
62
63 pub fn with_capacity(capacity: usize) -> Self {
64 Self(0, Vec::with_capacity(capacity))
65 }
66
67 pub fn expand(&mut self) {
68 if self.1.len() == self.1.capacity() {
69 self.1.reserve(32);
70 }
71 self.fill_capacity();
72 }
73}