miniz_oxide/inflate/
output_buffer.rs1pub struct OutputBuffer<'a> {
7    slice: &'a mut [u8],
8    position: usize,
9}
10
11impl<'a> OutputBuffer<'a> {
12    #[inline]
13    pub fn from_slice_and_pos(slice: &'a mut [u8], position: usize) -> OutputBuffer<'a> {
14        OutputBuffer { slice, position }
15    }
16
17    #[inline(always)]
18    pub const fn position(&self) -> usize {
19        self.position
20    }
21
22    #[inline(always)]
23    pub fn set_position(&mut self, position: usize) {
24        self.position = position;
25    }
26
27    #[inline]
31    pub fn write_byte(&mut self, byte: u8) {
32        self.slice[self.position] = byte;
33        self.position += 1;
34    }
35
36    #[inline]
40    pub fn write_slice(&mut self, data: &[u8]) {
41        let len = data.len();
42        self.slice[self.position..self.position + len].copy_from_slice(data);
43        self.position += data.len();
44    }
45
46    #[inline]
47    pub const fn bytes_left(&self) -> usize {
48        self.slice.len() - self.position
49    }
50
51    #[inline(always)]
52    pub const fn get_ref(&self) -> &[u8] {
53        self.slice
54    }
55
56    #[inline(always)]
57    pub fn get_mut(&mut self) -> &mut [u8] {
58        self.slice
59    }
60}
61
62#[derive(Copy, Clone)]
68pub struct InputWrapper<'a> {
69    slice: &'a [u8],
70}
71
72impl<'a> InputWrapper<'a> {
73    #[inline(always)]
74    pub const fn as_slice(&self) -> &[u8] {
75        self.slice
76    }
77
78    #[inline(always)]
79    pub const fn from_slice(slice: &'a [u8]) -> InputWrapper<'a> {
80        InputWrapper { slice }
81    }
82
83    #[inline(always)]
84    pub fn advance(&mut self, steps: usize) {
85        self.slice = &self.slice[steps..];
86    }
87
88    #[inline]
89    pub fn read_byte(&mut self) -> Option<u8> {
90        self.slice.first().map(|n| {
91            self.advance(1);
92            *n
93        })
94    }
95
96    #[inline]
97    #[cfg(target_pointer_width = "64")]
98    pub fn read_u32_le(&mut self) -> u32 {
99        let ret = {
100            let four_bytes: [u8; 4] = self.slice[..4].try_into().unwrap_or_default();
101            u32::from_le_bytes(four_bytes)
102        };
103        self.advance(4);
104        ret
105    }
106
107    #[inline(always)]
108    pub const fn bytes_left(&self) -> usize {
109        self.slice.len()
110    }
111}