trillium_http/
buffer.rs

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}