compression_core/
util.rs

1pub const fn _assert_send<T: Send>() {}
2pub const fn _assert_sync<T: Sync>() {}
3
4#[derive(Debug, Default)]
5pub struct PartialBuffer<B> {
6    buffer: B,
7    index: usize,
8}
9
10impl<B: AsRef<[u8]>> PartialBuffer<B> {
11    pub fn new(buffer: B) -> Self {
12        Self { buffer, index: 0 }
13    }
14
15    pub fn written(&self) -> &[u8] {
16        &self.buffer.as_ref()[..self.index]
17    }
18
19    pub fn unwritten(&self) -> &[u8] {
20        &self.buffer.as_ref()[self.index..]
21    }
22
23    pub fn advance(&mut self, amount: usize) {
24        self.index += amount;
25    }
26
27    pub fn get_mut(&mut self) -> &mut B {
28        &mut self.buffer
29    }
30
31    pub fn into_inner(self) -> B {
32        self.buffer
33    }
34
35    pub fn reset(&mut self) {
36        self.index = 0;
37    }
38}
39
40impl<B: AsRef<[u8]> + AsMut<[u8]>> PartialBuffer<B> {
41    pub fn unwritten_mut(&mut self) -> &mut [u8] {
42        &mut self.buffer.as_mut()[self.index..]
43    }
44
45    pub fn copy_unwritten_from<C: AsRef<[u8]>>(&mut self, other: &mut PartialBuffer<C>) -> usize {
46        let len = self.unwritten().len().min(other.unwritten().len());
47
48        self.unwritten_mut()[..len].copy_from_slice(&other.unwritten()[..len]);
49
50        self.advance(len);
51        other.advance(len);
52        len
53    }
54}
55
56impl<B: AsRef<[u8]> + Default> PartialBuffer<B> {
57    pub fn take(&mut self) -> Self {
58        std::mem::take(self)
59    }
60}
61
62impl<B: AsRef<[u8]> + AsMut<[u8]>> From<B> for PartialBuffer<B> {
63    fn from(buffer: B) -> Self {
64        Self::new(buffer)
65    }
66}