binreader_internal_macros/
adders.rs

1#[cfg(feature = "nom")]
2#[macro_use]
3mod nom;
4
5make_add_macro! {
6    name: add_borrow;
7    type: ::std::borrow::Borrow<[u8]>;
8    body: {
9        fn borrow(&self) -> &[u8] {
10            self.as_ref()
11        }
12    }
13}
14
15make_add_macro! {
16    name: add_read;
17    type: ::std::io::Read;
18    body: {
19        fn read(&mut self, buf: &mut [u8]) -> ::std::io::Result<usize> {
20            if self.remaining() > buf.len() {
21                self.next_bytes(buf)?;
22                Ok(buf.len())
23            } else {
24                let read = self.remaining();
25                for i in 0..read {
26                    buf[i] = self.next_u8()?;
27                }
28                Ok(read)
29            }
30        }
31    }
32}
33
34make_add_macro! {
35    name: add_seek;
36    type: ::std::io::Seek;
37    body: {
38        fn seek(&mut self, pos: ::std::io::SeekFrom) -> ::std::io::Result<u64> {
39            match pos {
40                ::std::io::SeekFrom::Start(to) => self.advance_to(to as usize)?,
41                ::std::io::SeekFrom::Current(by) => self.advance_to(
42                    (self.current_offset() as i64 + by) as usize)?,
43                ::std::io::SeekFrom::End(point) => self.advance_to(
44                    (self.upper_offset_limit() as i64 - point) as usize)?,
45            };
46            Ok(self.current_offset() as u64)
47        }
48    }
49}
50
51make_add_macro! {
52    name: add_bufread;
53    type: ::std::io::BufRead;
54    body: {
55        fn fill_buf(&mut self) -> ::std::io::Result<&[u8]> {
56            if self.remaining() >= 4096 {
57                Ok(self.subseq(self.current_offset(), 4096)?)
58            } else {
59                Ok(self.subseq(self.current_offset(), self.remaining())?)
60            }
61        }
62
63        fn consume(&mut self, amt: usize) {
64            if !self.is_empty() {
65                if self.remaining() < amt {
66                    self.advance_by(self.remaining() as isize).unwrap();
67                } else {
68                    self.advance_by(amt as isize).unwrap();
69                }
70            }
71        }
72    }
73}