skimmer/reader/
bytes_reader.rs1use 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}