skimmer/reader/
bytes_reader.rs

1use crate::data::Datum;
2use crate::marker::Marker;
3use crate::reader::Read;
4
5use std::rc::Rc;
6
7#[derive(Clone, Debug)]
8pub struct BytesDatum {
9    content: Rc<Vec<u8>>,
10}
11
12impl Datum for BytesDatum {
13    fn len(&self) -> usize {
14        Vec::len(&*self.content)
15    }
16
17    fn as_slice(&self) -> &[u8] {
18        Vec::as_slice(&*self.content)
19    }
20}
21
22pub struct BytesReader {
23    pointer: usize,
24    content: BytesDatum,
25}
26
27impl BytesReader {
28    pub fn new(data: Vec<u8>) -> BytesReader {
29        BytesReader {
30            pointer: 0,
31            content: BytesDatum {
32                content: Rc::new(data),
33            },
34        }
35    }
36}
37
38impl Read for BytesReader {
39    type Datum = BytesDatum;
40
41    fn consume(&mut self, len: u8) -> Marker {
42        let len = self.skip(len);
43        Marker::new((0, self.pointer - len as usize), (0, self.pointer))
44    }
45
46    fn consume_long(&mut self, len: usize) -> Marker {
47        let len = self.skip_long(len);
48        Marker::new((0, self.pointer - len), (0, self.pointer))
49    }
50
51    #[inline(always)]
52    fn get_datum(&mut self, index: usize) -> Option<BytesDatum> {
53        if index == 0 {
54            Some(self.content.clone())
55        } else {
56            None
57        }
58    }
59
60    fn skip(&mut self, len: u8) -> u8 {
61        if self.pointer < self.content.len() {
62            if self.pointer + (len as usize) < self.content.len() {
63                self.pointer += len as usize;
64                len
65            } else {
66                let len = self.content.len() - self.pointer;
67                self.pointer += len;
68
69                len as u8
70            }
71        } else {
72            0
73        }
74    }
75
76    fn skip_long(&mut self, len: usize) -> usize {
77        if self.pointer < self.content.len() {
78            if self.pointer + len < self.content.len() {
79                self.pointer += len;
80                len
81            } else {
82                let len = self.content.len() - self.pointer;
83                self.pointer += len;
84
85                len
86            }
87        } else {
88            0
89        }
90    }
91
92    #[inline(always)]
93    fn has(&mut self, len: u8) -> bool {
94        self.pointer + len as usize <= self.content.len()
95    }
96
97    #[inline(always)]
98    fn has_long(&mut self, len: usize) -> bool {
99        self.pointer + len <= self.content.len()
100    }
101
102    #[inline(always)]
103    fn byte_at_start(&mut self, byte: u8) -> bool {
104        self.content.content.get(self.pointer) == Some(&byte)
105    }
106
107    #[inline(always)]
108    fn byte_at(&mut self, byte: u8, at: usize) -> bool {
109        self.content.content.get(self.pointer + at) == Some(&byte)
110    }
111
112    #[inline(always)]
113    fn bytes_2_at_start(&mut self, bytes: [u8; 2]) -> bool {
114        self.content.content.get(self.pointer..self.pointer + 2) == Some(&bytes)
115    }
116
117    #[inline(always)]
118    fn bytes_2_at(&mut self, bytes: [u8; 2], at: usize) -> bool {
119        self.content
120            .content
121            .get(self.pointer + at..self.pointer + at + 2)
122            == Some(&bytes)
123    }
124
125    #[inline(always)]
126    fn bytes_3_at_start(&mut self, bytes: [u8; 3]) -> bool {
127        self.content.content.get(self.pointer..self.pointer + 3) == Some(&bytes)
128    }
129
130    #[inline(always)]
131    fn bytes_3_at(&mut self, bytes: [u8; 3], at: usize) -> bool {
132        self.content
133            .content
134            .get(self.pointer + at..self.pointer + at + 3)
135            == Some(&bytes)
136    }
137
138    #[inline(always)]
139    fn bytes_4_at_start(&mut self, bytes: [u8; 4]) -> bool {
140        self.content.content.get(self.pointer..self.pointer + 4) == Some(&bytes)
141    }
142
143    #[inline(always)]
144    fn bytes_4_at(&mut self, bytes: [u8; 4], at: usize) -> bool {
145        self.content
146            .content
147            .get(self.pointer + at..self.pointer + at + 4)
148            == Some(&bytes)
149    }
150
151    #[inline(always)]
152    fn bytes_at_start(&mut self, bytes: &[u8]) -> bool {
153        self.content
154            .content
155            .get(self.pointer..self.pointer + bytes.len())
156            == Some(bytes)
157    }
158
159    #[inline(always)]
160    fn bytes_at(&mut self, bytes: &[u8], at: usize) -> bool {
161        self.content
162            .content
163            .get(self.pointer + at..self.pointer + at + bytes.len())
164            == Some(bytes)
165    }
166
167    #[inline(always)]
168    fn slice_at(&mut self, at: usize, len: usize) -> Option<&[u8]> {
169        self.content
170            .content
171            .get(self.pointer + at..self.pointer + at + len)
172    }
173
174    #[inline(always)]
175    fn get_byte_at(&mut self, at: usize) -> Option<u8> {
176        self.content.content.get(self.pointer + at).map(|b| *b)
177    }
178
179    #[inline(always)]
180    fn get_byte_at_start(&mut self) -> Option<u8> {
181        self.content.content.get(self.pointer).map(|b| *b)
182    }
183
184    #[inline(always)]
185    fn get_bytes_2_at(&mut self, at: usize) -> Option<(u8, u8)> {
186        self.content
187            .content
188            .get(self.pointer + at..self.pointer + at + 2)
189            .map(|ref bs| (bs[0], bs[1]))
190    }
191
192    #[inline(always)]
193    fn get_bytes_2_at_start(&mut self) -> Option<(u8, u8)> {
194        self.content
195            .content
196            .get(self.pointer..self.pointer + 2)
197            .map(|ref bs| (bs[0], bs[1]))
198    }
199
200    #[inline(always)]
201    fn get_bytes_3_at(&mut self, at: usize) -> Option<(u8, u8, u8)> {
202        self.content
203            .content
204            .get(self.pointer + at..self.pointer + at + 3)
205            .map(|ref bs| (bs[0], bs[1], bs[2]))
206    }
207
208    #[inline(always)]
209    fn get_bytes_3_at_start(&mut self) -> Option<(u8, u8, u8)> {
210        self.content
211            .content
212            .get(self.pointer..self.pointer + 3)
213            .map(|ref bs| (bs[0], bs[1], bs[2]))
214    }
215
216    #[inline(always)]
217    fn get_bytes_4_at(&mut self, at: usize) -> Option<(u8, u8, u8, u8)> {
218        self.content
219            .content
220            .get(self.pointer + at..self.pointer + at + 4)
221            .map(|ref bs| (bs[0], bs[1], bs[2], bs[3]))
222    }
223
224    #[inline(always)]
225    fn get_bytes_4_at_start(&mut self) -> Option<(u8, u8, u8, u8)> {
226        self.content
227            .content
228            .get(self.pointer..self.pointer + 4)
229            .map(|ref bs| (bs[0], bs[1], bs[2], bs[3]))
230    }
231}