1use crate::{Result, Error};
4
5pub trait ReadBytes {
9 fn peek<F, R>(&mut self, n: usize, f: F) -> Result<R> where F: FnOnce(&[u8]) -> Result<R>;
11
12 fn advance(&mut self, n: usize);
14
15 fn read<F, R>(&mut self, n: usize, f: F) -> Result<R> where F: FnOnce(&[u8]) -> Result<R> {
17 let r = self.peek(n, f)?;
18 self.advance(n);
19 Ok(r)
20 }
21 fn remaining_buffer(&mut self) -> &'_[u8];
23
24 fn is_complete(&mut self) -> Result {
26 if self.remaining_buffer().is_empty() {
27 Ok(())
28 } else {
29 Err(Error::BufferUnderflow)
30 }
31 }
32}
33
34pub trait TailReadBytes: ReadBytes {
36 fn peek_tail<F, R>(&mut self, n: usize, f: F) -> Result<R> where F: FnOnce(&[u8]) -> Result<R>;
37
38 fn advance_tail(&mut self, n: usize);
40
41 fn read_tail<F, R>(&mut self, n: usize, f: F) -> Result<R> where F: FnOnce(&[u8]) -> Result<R> {
43 let r = self.peek_tail(n, f)?;
44 self.advance_tail(n);
45 Ok(r)
46 }
47}
48
49impl<'a, T> ReadBytes for &'a mut T where T: ReadBytes {
51 fn peek<F, R>(&mut self, n: usize, f: F) -> Result<R> where F: FnOnce(&[u8]) -> Result<R> {
52 (*self).peek(n, f)
53 }
54 fn advance(&mut self, n: usize) {
55 (*self).advance(n)
56 }
57 fn remaining_buffer(&mut self) -> &'_[u8] { (*self).remaining_buffer() }
58}
59
60impl<'a, T> TailReadBytes for &'a mut T where T: TailReadBytes {
62 fn peek_tail<F, R>(&mut self, n: usize, f: F) -> Result<R> where F: FnOnce(&[u8]) -> Result<R> {
63 (*self).peek_tail(n, f)
64 }
65 fn advance_tail(&mut self, n: usize) {
66 (*self).advance_tail(n)
67 }
68}
69
70pub struct DeBytesReader<'a> {
74 buf: &'a [u8],
75}
76
77impl<'a> DeBytesReader<'a> {
78 #[must_use] pub fn new(buf: &'a [u8]) -> Self { Self { buf } }
80}
81
82impl <'a> ReadBytes for DeBytesReader<'a> {
83 fn peek<F, R>(&mut self, n: usize, f: F) -> Result<R>
84 where F: FnOnce(&[u8]) -> Result<R>,
85 {
86 if n <= self.buf.len() {
87 f(&self.buf[..n])
88 } else {
89 Err(Error::PrematureEndOfInput)
90 }
91 }
92 fn advance(&mut self, n: usize) {
93 self.buf = &self.buf[n..];
94 }
97 fn remaining_buffer(&mut self) -> &'_[u8] { self.buf }
98}
99
100impl<'a> TailReadBytes for DeBytesReader<'a> {
101 fn peek_tail<F, R>(&mut self, n: usize, f: F) -> Result<R>
102 where F: FnOnce(&[u8]) -> Result<R>,
103 {
104 if n <= self.buf.len() {
105 f(&self.buf[(self.buf.len() - n)..])
106 } else {
107 Err(Error::PrematureEndOfInput)
108 }
109 }
110 fn advance_tail(&mut self, n: usize) {
111 self.buf = &self.buf[..self.buf.len() - n];
112 }
114}
115
116pub struct ReadFromTail<'a, R>(pub &'a mut R) where R: TailReadBytes;
124
125impl <'a, R> ReadBytes for ReadFromTail<'a, R>
126 where R: TailReadBytes,
127{
128 fn peek<F, RV>(&mut self, n: usize, f: F) -> Result<RV>
129 where F: FnOnce(&[u8]) -> Result<RV>,
130 {
131 self.0.peek_tail(n, f)
132 }
133 fn advance(&mut self, n: usize) {
134 self.0.advance_tail(n)
135 }
136 fn remaining_buffer(&mut self) -> &'_[u8] { self.0.remaining_buffer() }
137}
138
139#[cfg(feature="std")]
140impl std::io::Read for DeBytesReader<'_> {
141 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
142 self.buf.read(buf)
143 }
144}
145
146pub trait WriteBytes {
148 fn write(&mut self, value: &[u8]) -> Result;
150}
151
152pub trait TailWriteBytes: WriteBytes {
154 fn write_tail(&mut self, value: &[u8]) -> Result;
156}
157
158pub struct DeBytesWriter<'a> {
162 buf: &'a mut [u8],
163 head: usize,
164 tail: usize,
165}
166
167impl<'a> DeBytesWriter<'a> {
168 pub fn new(buf: &'a mut [u8]) -> Self {
170 let tail = buf.len();
171 Self { buf, head: 0, tail }
172 }
173 pub fn finalize(&mut self) -> Result<usize> {
177 if self.head == self.tail {
178 Ok(self.buf.len())
179 } else {
180 self.buf.copy_within(self.tail.., self.head);
181 let len = self.buf.len() - (self.tail - self.head);
182 self.head = self.tail;
183 Ok(len)
184 }
185 }
186 pub fn is_complete(&self) -> Result {
188 if self.head == self.tail {
189 Ok(())
190 } else {
191 Err(Error::BufferUnderflow)
192 }
193 }
194}
195
196impl<'a> WriteBytes for DeBytesWriter<'a> {
197 fn write(&mut self, value: &[u8]) -> Result {
198 if (self.head + value.len()) > self.tail {
199 Err(Error::BufferOverflow)
200 } else {
201 self.buf[self.head..(self.head + value.len())].copy_from_slice(value);
202 self.head += value.len();
203 Ok(())
204 }
205 }
206}
207
208impl<'a> TailWriteBytes for DeBytesWriter<'a> {
209 fn write_tail(&mut self, value: &[u8]) -> Result {
210 if (self.head + value.len()) > self.tail {
211 Err(Error::BufferOverflow)
212 } else {
213 let end_offs = self.tail - value.len();
214 self.buf[end_offs..self.tail].copy_from_slice(value);
215 self.tail = end_offs;
216 Ok(())
217 }
218 }
219}
220
221pub struct WriteToTail<'a, W>(pub &'a mut W) where W: TailWriteBytes;
230
231impl<'a, W> WriteBytes for WriteToTail<'a, W>
232 where W: TailWriteBytes
233{
234 fn write(&mut self, value: &[u8]) -> Result {
235 self.0.write_tail(value)
236 }
237}
238
239impl<T> WriteBytes for &mut T where T: WriteBytes {
241 fn write(&mut self, buf: &[u8]) -> Result { (*self).write(buf) }
242}
243
244impl<T> TailWriteBytes for &mut T where T: TailWriteBytes {
245 fn write_tail(&mut self, buf: &[u8]) -> Result { (*self).write_tail(buf) }
246}
247
248#[cfg(feature="std")]
250impl WriteBytes for Vec<u8> {
251 fn write(&mut self, buf: &[u8]) -> Result {
252 self.extend_from_slice(buf);
253 Ok(())
254 }
255}
256
257#[cfg(feature="std")]
262impl TailWriteBytes for Vec<u8> {
263 fn write_tail(&mut self, buf: &[u8]) -> Result {
264 self.extend_from_slice(buf);
265 Ok(())
266 }
267}
268
269pub struct WriteToHead<'a, W>(pub &'a mut W) where W: WriteBytes;
273
274impl<'a, W> WriteBytes for WriteToHead<'a, W>
275 where W: TailWriteBytes
276{
277 fn write(&mut self, value: &[u8]) -> Result {
278 self.0.write(value)
279 }
280}
281
282impl<'a, W> TailWriteBytes for WriteToHead<'a, W>
283 where W: TailWriteBytes
284{
285 fn write_tail(&mut self, value: &[u8]) -> Result {
286 self.0.write(value)
287 }
288}
289
290#[test]
291fn test_debuffer() {
292 let mut byte_buf = [0_u8; 7];
293 let mut bib = DeBytesWriter::new(byte_buf.as_mut());
294 bib.write(b"aa").unwrap();
295 bib.write_tail(b"1").unwrap();
296 bib.write(b"bb").unwrap();
297 bib.write_tail(b"2").unwrap();
298 bib.write(b"d").unwrap();
299 bib.is_complete().unwrap();
300 assert_eq!(byte_buf.as_ref(), b"aabbd21");
301 let mut rb = DeBytesReader::new(byte_buf.as_mut());
302 assert_eq!(rb.read(3, |b| Ok(b == b"aab")).unwrap(), true);
303 assert_eq!(rb.read_tail(1, |b| Ok(b == b"1")).unwrap(), true);
304 assert_eq!(rb.read_tail(1, |b| Ok(b == b"2")).unwrap(), true);
305 assert_eq!(rb.read(2, |b| Ok(b == b"bd")).unwrap(), true);
306 rb.is_complete().unwrap();
307}