1use crate::Error;
2use memchr::memchr;
3use std::io::BufRead;
4use std::mem;
5use std::ops::{Deref, DerefMut};
6
7pub(crate) mod private {
8 pub trait Sealed {}
9}
10
11pub trait Read<'de>: private::Sealed {
16 #[doc(hidden)]
17 fn next(&mut self) -> Result<Option<u8>, Error>;
18
19 #[doc(hidden)]
20 fn peek(&mut self) -> Result<Option<u8>, Error>;
21
22 #[doc(hidden)]
23 fn consume(&mut self);
24
25 #[doc(hidden)]
26 fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error>;
27
28 #[doc(hidden)]
29 fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error>;
30
31 #[doc(hidden)]
32 fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error>;
33}
34
35pub enum Buf<'a, 'de> {
36 Short(&'a [u8]),
37 Long(&'de [u8]),
38}
39
40impl Deref for Buf<'_, '_> {
41 type Target = [u8];
42
43 #[inline]
44 fn deref(&self) -> &Self::Target {
45 match self {
46 Buf::Short(buf) => buf,
47 Buf::Long(buf) => buf,
48 }
49 }
50}
51
52pub enum MutBuf<'a, 'de> {
53 Short(&'a mut [u8]),
54 Long(&'de mut [u8]),
55}
56
57impl Deref for MutBuf<'_, '_> {
58 type Target = [u8];
59
60 #[inline]
61 fn deref(&self) -> &Self::Target {
62 match self {
63 MutBuf::Short(buf) => buf,
64 MutBuf::Long(buf) => buf,
65 }
66 }
67}
68
69impl DerefMut for MutBuf<'_, '_> {
70 #[inline]
71 fn deref_mut(&mut self) -> &mut Self::Target {
72 match self {
73 MutBuf::Short(buf) => buf,
74 MutBuf::Long(buf) => buf,
75 }
76 }
77}
78
79pub struct SliceRead<'a> {
81 slice: &'a [u8],
82 index: usize,
83 buf: Vec<u8>,
84}
85
86impl<'a> SliceRead<'a> {
87 pub fn new(slice: &'a [u8]) -> Self {
89 SliceRead {
90 slice,
91 index: 0,
92 buf: vec![],
93 }
94 }
95}
96
97impl private::Sealed for SliceRead<'_> {}
98
99impl<'de> Read<'de> for SliceRead<'de> {
100 #[inline]
101 fn next(&mut self) -> Result<Option<u8>, Error> {
102 if self.index < self.slice.len() {
103 let ch = self.slice[self.index];
104 self.index += 1;
105 Ok(Some(ch))
106 } else {
107 Ok(None)
108 }
109 }
110
111 #[inline]
112 fn peek(&mut self) -> Result<Option<u8>, Error> {
113 if self.index < self.slice.len() {
114 Ok(Some(self.slice[self.index]))
115 } else {
116 Ok(None)
117 }
118 }
119
120 #[inline]
121 fn consume(&mut self) {
122 self.index += 1;
123 }
124
125 #[inline]
126 fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error> {
127 let s = &self.slice[self.index..];
128 if n <= s.len() {
129 self.index += n;
130 Ok(Some(Buf::Long(&s[..n])))
131 } else {
132 Ok(None)
133 }
134 }
135
136 fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error> {
137 let s = &self.slice[self.index..];
138 if n <= s.len() {
139 self.index += n;
140 self.buf.clear();
141 self.buf.extend_from_slice(&s[..n]);
142 Ok(Some(MutBuf::Short(&mut self.buf)))
143 } else {
144 Ok(None)
145 }
146 }
147
148 fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error> {
149 let s = &self.slice[self.index..];
150 match memchr(end, s) {
151 Some(end) => {
152 self.index += end + 1;
153 Ok(Some(Buf::Long(&s[..end])))
154 }
155 None => Ok(None),
156 }
157 }
158}
159
160pub struct MutSliceRead<'a> {
162 slice: &'a mut [u8],
163}
164
165impl<'a> MutSliceRead<'a> {
166 pub fn new(slice: &'a mut [u8]) -> Self {
168 MutSliceRead { slice }
169 }
170}
171
172impl private::Sealed for MutSliceRead<'_> {}
173
174impl<'de> Read<'de> for MutSliceRead<'de> {
175 fn next(&mut self) -> Result<Option<u8>, Error> {
176 if !self.slice.is_empty() {
177 let slice = mem::take(&mut self.slice);
178 let b = slice[0];
179
180 self.slice = &mut slice[1..];
181 Ok(Some(b))
182 } else {
183 Ok(None)
184 }
185 }
186
187 fn peek(&mut self) -> Result<Option<u8>, Error> {
188 if !self.slice.is_empty() {
189 Ok(Some(self.slice[0]))
190 } else {
191 Ok(None)
192 }
193 }
194
195 fn consume(&mut self) {
196 let slice = mem::take(&mut self.slice);
197 self.slice = &mut slice[1..];
198 }
199
200 fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error> {
201 if n <= self.slice.len() {
202 let (a, b) = mem::take(&mut self.slice).split_at_mut(n);
203 self.slice = b;
204 Ok(Some(Buf::Long(a)))
205 } else {
206 Ok(None)
207 }
208 }
209
210 fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error> {
211 if n <= self.slice.len() {
212 let (a, b) = mem::take(&mut self.slice).split_at_mut(n);
213 self.slice = b;
214 Ok(Some(MutBuf::Long(a)))
215 } else {
216 Ok(None)
217 }
218 }
219
220 fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error> {
221 match memchr(end, self.slice) {
222 Some(end) => {
223 let (a, b) = mem::take(&mut self.slice).split_at_mut(end);
224 self.slice = &mut b[1..];
225 Ok(Some(Buf::Long(a)))
226 }
227 None => Ok(None),
228 }
229 }
230}
231
232pub struct IoRead<R> {
234 reader: R,
235 buf: Vec<u8>,
236}
237
238impl<R> IoRead<R>
239where
240 R: BufRead,
241{
242 pub fn new(reader: R) -> Self {
244 IoRead {
245 reader,
246 buf: vec![],
247 }
248 }
249
250 pub fn get_ref(&self) -> &R {
252 &self.reader
253 }
254
255 pub fn get_mut(&mut self) -> &mut R {
257 &mut self.reader
258 }
259
260 pub fn into_inner(self) -> R {
262 self.reader
263 }
264
265 fn fill_buf(&mut self, n: usize) -> Result<bool, Error> {
266 self.buf.clear();
267 self.buf.reserve(usize::min(n, 16 * 1024));
269
270 let mut remaining = n;
271 while remaining > 0 {
272 let buf = self.reader.fill_buf().map_err(Error::io)?;
273 if buf.is_empty() {
274 return Ok(false);
275 }
276
277 let len = usize::min(remaining, buf.len());
278 self.buf.extend_from_slice(&buf[..len]);
279 self.reader.consume(len);
280 remaining -= len;
281 }
282
283 Ok(true)
284 }
285}
286
287impl<R> private::Sealed for IoRead<R> {}
288
289impl<'de, R> Read<'de> for IoRead<R>
290where
291 R: BufRead,
292{
293 fn next(&mut self) -> Result<Option<u8>, Error> {
294 let r = self.peek();
295 if let Ok(Some(_)) = r {
296 self.consume();
297 }
298 r
299 }
300
301 fn peek(&mut self) -> Result<Option<u8>, Error> {
302 let buf = self.reader.fill_buf().map_err(Error::io)?;
303 if buf.is_empty() {
304 Ok(None)
305 } else {
306 Ok(Some(buf[0]))
307 }
308 }
309
310 fn consume(&mut self) {
311 self.reader.consume(1);
312 }
313
314 fn read<'a>(&'a mut self, n: usize) -> Result<Option<Buf<'a, 'de>>, Error> {
317 if self.fill_buf(n)? {
318 Ok(Some(Buf::Short(&self.buf)))
319 } else {
320 Ok(None)
321 }
322 }
323
324 fn read_mut<'a>(&'a mut self, n: usize) -> Result<Option<MutBuf<'a, 'de>>, Error> {
325 if self.fill_buf(n)? {
326 Ok(Some(MutBuf::Short(&mut self.buf)))
327 } else {
328 Ok(None)
329 }
330 }
331
332 fn read_until<'a>(&'a mut self, end: u8) -> Result<Option<Buf<'a, 'de>>, Error> {
333 self.buf.clear();
334
335 loop {
336 let buf = self.reader.fill_buf().map_err(Error::io)?;
337 if buf.is_empty() {
338 return Ok(None);
339 }
340
341 match memchr(end, buf) {
342 Some(end) => {
343 self.buf.extend_from_slice(&buf[..end]);
344 self.reader.consume(end + 1);
345 return Ok(Some(Buf::Short(&self.buf)));
346 }
347 None => {
348 self.buf.extend_from_slice(buf);
349 let len = buf.len();
350 self.reader.consume(len);
351 }
352 }
353 }
354 }
355}