1#[cfg(feature = "std")]
2use std::io::{self, Read, Write, Seek, SeekFrom};
3use core::{
4 ops::Deref,
5 cell::Cell,
6};
7use crate::std::*;
8use crate::{
9 BufRead, BufWrite,
10 bytes::{Bytes, ToBytes},
11 };
13
14
15#[derive(Debug, Clone, PartialEq, Eq)]
39pub struct Buffer {
40 data: Vec<u8>,
41 position: Cell<usize>,
42}
43
44
45impl Buffer {
46 #[inline]
48 pub fn new() -> Self {
49 Self {
50 position: Cell::new(0),
51 data: Vec::new(),
52 }
53 }
54}
55
56
57impl ToBytes for Buffer {
58 type Target = [u8];
59
60 fn to_bytes(&self) -> Bytes<&Self::Target> {
61 Bytes::new(&(*self.data)[..])
62 }
63}
64
65
66impl Default for Buffer {
67 fn default() -> Self {
68 Self::new()
69 }
70}
71
72
73impl From<Vec<u8>> for Buffer {
74 fn from(value: Vec<u8>) -> Self {
75 Self { data: value, position: Cell::new(0) }
76 }
77}
78
79
80impl Deref for Buffer {
81 type Target = Vec<u8>;
82
83 fn deref(&self) -> &Self::Target {
84 &self.data
85 }
86}
87
88
89impl AsRef<[u8]> for Buffer {
90 fn as_ref(&self) -> &[u8] {
91 &(*self.data)[..]
92 }
93}
94
95
96impl BufRead for Buffer {
97 #[inline]
98 fn get_position(&self) -> usize {
99 self.position.get()
100 }
101
102 #[inline]
103 fn get_data(&self) -> &'_ [u8] {
104 &self.data
105 }
106
107 #[inline]
108 fn set_position(&self, position: usize) {
109 self.position.set(position);
110 }
111
112 #[inline]
113 fn reset_position(&self) {
114 self.position.set(0)
115 }
116
117 #[inline]
118 fn advance(&self, nbytes: usize) {
119 self.position.set(self.position.get() + nbytes)
120 }
121}
122
123
124impl BufWrite for Buffer {
125 #[inline]
126 fn remaining_mut(&mut self) -> &'_ mut [u8] {
127 &mut self.data[self.position.get()..]
128 }
129
130 #[inline]
131 fn resize(&mut self, nbytes: usize) -> usize {
132 let nbytes = self.position.get() + nbytes;
133
134 self.data.resize(nbytes, 0);
135
136 nbytes
137 }
138}
139
140
141#[cfg(feature = "std")]
142impl Read for Buffer {
143 fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
144 let data_len = self.data.len();
145 let position = self.position.get();
146
147 if position >= data_len {
148 return Ok(0);
149 }
150
151 let nbytes = std::cmp::min(buf.len(), data_len - position);
152 buf[..nbytes].copy_from_slice(&self.data[position..position + nbytes]);
153 self.position.set(position + nbytes);
154
155 Ok(nbytes)
156 }
157}
158
159
160#[cfg(feature = "std")]
161impl Write for Buffer {
162 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
163 let buf_len = buf.len();
164 let position = self.position.get();
165
166 if position + buf_len > self.data.len() {
167 self.data.resize(position + buf_len, 0);
168 }
169
170 self.data[position..position + buf_len].copy_from_slice(buf);
171 self.position.set(position + buf_len);
172
173 Ok(buf_len)
174 }
175
176 fn flush(&mut self) -> io::Result<()> {
177 Ok(())
178 }
179}
180
181
182#[cfg(feature = "std")]
183impl Seek for Buffer {
184 fn seek(&mut self, pos: SeekFrom) -> io::Result<u64> {
185 let position = self.position.get();
186
187 let new_position = match pos {
188 SeekFrom::Start(offset) => offset as isize,
189 SeekFrom::End(offset) => self.data.len() as isize + offset as isize,
190 SeekFrom::Current(offset) => position as isize + offset as isize,
191 };
192
193 if new_position < 0 {
194 return Err(io::Error::new(io::ErrorKind::InvalidInput, "Invalid seek to a negative position"));
195 }
196
197 self.position.set(new_position as usize);
198
199 Ok(position as u64)
200 }
201}
202
203
204#[cfg(test)]
205mod tests {
206 use super::*;
207
208 #[cfg(feature = "std")]
209 #[test]
210 fn test_buffer_read_write() {
211 let mut buffer = Buffer::from(b"Hello, world!".to_vec());
212
213 let mut read_buf = [0; 5];
215 buffer.read(&mut read_buf).unwrap();
216 assert_eq!(&read_buf, b"Hello");
217
218 buffer.seek(SeekFrom::Start(0)).unwrap();
220 assert_eq!(buffer.position.get(), 0);
221
222 buffer.write(b"Rust").unwrap();
224 assert_eq!(&buffer.data, b"Rusto, world!");
225
226 buffer.seek(SeekFrom::End(-2)).unwrap();
228 assert_eq!(buffer.position.get(), buffer.data.len() - 2);
229
230 buffer.write(b"!").unwrap();
232 assert_eq!(&buffer.data, b"Rusto, worl!!");
233 }
234
235 #[test]
236 fn test_buffer_set_position() {
237 let mut buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
238 assert_eq!(buffer.get_position(), 0);
239 buffer.advance(3);
240 assert_eq!(buffer.get_position(), 3);
241 assert_eq!(buffer.take_u16().unwrap(), 0x0405);
242 assert_eq!(buffer.get_position(), 5);
243 assert_eq!(buffer.take_u8().is_err(), true);
244
245 buffer.reset_position();
246 assert_eq!(buffer.get_position(), 0);
247 buffer.set_position(10);
248 assert_eq!(buffer.take_u8().is_err(), true);
249 buffer.push_u8(0x01).unwrap();
250 assert_eq!(buffer.get_position(), 11);
251 assert_eq!(buffer.data, vec![0x01, 0x02, 0x03, 0x04, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01]);
252 }
253
254 #[test]
255 fn test_buffer_take_u8() {
256 let buffer = Buffer::from(vec![0x01, 0x02, 0x03]);
257 assert_eq!(buffer.take_u8().unwrap(), 0x01);
258 assert_eq!(buffer.take_u8().unwrap(), 0x02);
259 assert_eq!(buffer.remaining(), [0x03]);
260 assert_eq!(buffer.take_u8().unwrap(), 0x03);
261 assert_eq!(buffer.take_u8().is_err(), true);
262 assert_eq!(buffer.get_position(), 3);
263 }
264
265 #[test]
266 fn test_buffer_take_u16() {
267 let buffer = Buffer::from(vec![0x00, 0x01, 0x00, 0x02, 0x00, 0x03, 0x04]);
268 assert_eq!(buffer.take_u16().unwrap(), 0x0001);
269 assert_eq!(buffer.take_be_u16().unwrap(), 0x0002);
270 assert_eq!(buffer.take_le_u16().unwrap(), 0x0300);
271 assert_eq!(buffer.remaining(), [0x04]);
272 assert_eq!(buffer.take_u16().is_err(), true);
273 assert_eq!(buffer.take_u8().unwrap(), 0x04);
274 assert_eq!(buffer.get_position(), 7);
275 }
276
277 #[test]
278 fn test_buffer_take_u24() {
279 let buffer = Buffer::from(vec![
280 0x00, 0x00, 0x01,
281 0x00, 0x00, 0x02,
282 0x00, 0x00, 0x03,
283 0x04
284 ]);
285 assert_eq!(buffer.take_u24().unwrap(), 0x000001);
286 assert_eq!(buffer.take_be_u24().unwrap(), 0x000002);
287 assert_eq!(buffer.take_le_u24().unwrap(), 0x030000);
288 assert_eq!(buffer.remaining(), [0x04]);
289 assert_eq!(buffer.take_u24().is_err(), true);
290 assert_eq!(buffer.take_u8().unwrap(), 0x04);
291 assert_eq!(buffer.get_position(), 10);
292 }
293
294 #[test]
295 fn test_buffer_take_u32() {
296 let buffer = Buffer::from(vec![
297 0x00, 0x00, 0x00, 0x01,
298 0x00, 0x00, 0x00, 0x02,
299 0x00, 0x00, 0x00, 0x03,
300 0x04
301 ]);
302 assert_eq!(buffer.take_u32().unwrap(), 0x00000001);
303 assert_eq!(buffer.take_be_u32().unwrap(), 0x00000002);
304 assert_eq!(buffer.take_le_u32().unwrap(), 0x03000000);
305 assert_eq!(buffer.remaining(), [0x04]);
306 assert_eq!(buffer.take_u32().is_err(), true);
307 assert_eq!(buffer.take_u8().unwrap(), 0x04);
308 assert_eq!(buffer.get_position(), 13);
309 }
310
311 #[test]
312 fn test_buffer_take_u64() {
313 let buffer = Buffer::from(vec![
314 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
315 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
316 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
317 0x04
318 ]);
319 assert_eq!(buffer.take_u64().unwrap(), 0x0000000000000001);
320 assert_eq!(buffer.take_be_u64().unwrap(), 0x0000000000000002);
321 assert_eq!(buffer.take_le_u64().unwrap(), 0x0300000000000000);
322 assert_eq!(buffer.remaining(), [0x04]);
323 assert_eq!(buffer.take_u64().is_err(), true);
324 assert_eq!(buffer.take_u8().unwrap(), 0x04);
325 assert_eq!(buffer.get_position(), buffer.len());
326 }
327
328 #[test]
329 fn test_buffer_take_u128() {
330 let buffer = Buffer::from(vec![
331 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
332 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
333 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03,
334 0x04
335 ]);
336 assert_eq!(buffer.take_u128().unwrap(), 0x00000000000000000000000000000001);
337 assert_eq!(buffer.take_be_u128().unwrap(), 0x00000000000000000000000000000002);
338 assert_eq!(buffer.take_le_u128().unwrap(), 0x03000000000000000000000000000000);
339 assert_eq!(buffer.remaining(), [0x04]);
340 assert_eq!(buffer.take_u128().is_err(), true);
341 assert_eq!(buffer.take_u8().unwrap(), 0x04);
342 assert_eq!(buffer.get_position(), buffer.len());
343 }
344
345 #[test]
346 fn test_buffer_take_uint() {
347 let buffer = Buffer::from(vec![
348 0x00, 0x00, 0x00, 0x00, 0x01,
349 0x00, 0x00, 0x00, 0x00, 0x02,
350 0x00, 0x00, 0x00, 0x00, 0x03,
351 0x04
352 ]);
353 assert_eq!(buffer.take_uint(5).unwrap(), 0x0000000001);
354 assert_eq!(buffer.take_be_uint(5).unwrap(), 0x0000000002);
355 assert_eq!(buffer.take_le_uint(5).unwrap(), 0x0300000000);
356 assert_eq!(buffer.remaining(), [0x04]);
357 assert_eq!(buffer.take_uint(5).is_err(), true);
358 assert_eq!(buffer.take_u8().unwrap(), 0x04);
359 assert_eq!(buffer.get_position(), buffer.len());
360 }
361
362 #[test]
363 fn test_buffer_take_bytes() {
364 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
365 assert_eq!(buffer.take_bytes(2).unwrap(), &[0x01, 0x02]);
366 assert_eq!(buffer.take_bytes(2).unwrap(), &[0x03, 0x04]);
367 assert_eq!(buffer.remaining(), &[0x05]);
368 assert_eq!(buffer.take_bytes(2).is_err(), true);
369 assert_eq!(buffer.take_bytes(1).unwrap(), &[0x05]);
370 assert_eq!(buffer.position.get(), 5);
371 }
372
373 #[test]
374 fn test_buffer_take_array() {
375 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
376 assert_eq!(buffer.take_array::<2>().unwrap(), [0x01, 0x02]);
377 assert_eq!(buffer.take_array::<2>().unwrap(), [0x03, 0x04]);
378 assert_eq!(buffer.remaining(), &[0x05]);
379 assert_eq!(buffer.take_array::<2>().is_err(), true);
380 assert_eq!(buffer.take_array::<1>().unwrap(), [0x05]);
381 assert_eq!(buffer.position.get(), 5);
382 }
383
384 #[test]
385 fn test_buffer_push() {
386 let mut buffer = Buffer::new();
387 buffer.push_u8(0x02).unwrap();
388 buffer.push_u16(0x03).unwrap();
389 buffer.push_u24(0x04).unwrap();
390 buffer.push_u32(0x05).unwrap();
391 buffer.push_u64(0x06).unwrap();
392 buffer.push_u128(0x07).unwrap();
393 buffer.push_uint(1, 3).unwrap();
394 buffer.push_le_uint(1, 3).unwrap();
395 buffer.push_char('1').unwrap();
396 buffer.push("23").unwrap();
397 buffer.push("45".to_string()).unwrap();
398 buffer.push([4, 5]).unwrap();
399 buffer.push(vec![6, 7]).unwrap();
400 buffer.push(&[8, 9]).unwrap();
401
402 assert_eq!(*buffer, [
403 0x02,
404 0x00, 0x03,
405 0x00, 0x00, 0x04,
406 0x00, 0x00, 0x00, 0x05,
407 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
408 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07,
409 0x00, 0x00, 0x01,
410 0x01, 0x00, 0x00,
411 0x31,
412 0x32, 0x33,
413 0x34, 0x35,
414 0x04, 0x05,
415 0x06, 0x07,
416 0x08, 0x09,
417 ]);
418 }
419
420 #[test]
421 fn test_buffer_subsequence() {
422 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
423 assert_eq!(buffer.find_subsequence(&[0x03, 0x04]).unwrap(), &[0x01, 0x02]);
424 assert_eq!(buffer.remaining_len(), 1);
425
426 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
427 assert_eq!(buffer.find_subsequence_needle(&[0x03, 0x04], false).unwrap(), &[0x01, 0x02]);
428 assert_eq!(buffer.remaining_len(), 3);
429
430 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
431 assert_eq!(buffer.find_subsequence_needle(&[0x03, 0x04], true).unwrap(), &[0x01, 0x02, 0x03, 0x04]);
432 assert_eq!(buffer.remaining_len(), 1);
433 }
434
435 #[test]
436 fn test_buffer_subsequences() {
437 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
438 assert_eq!(buffer.find_subsequences(&[&[0x03, 0x04], &[0x04, 0x05]]).unwrap(), &[0x01, 0x02]);
439 assert_eq!(buffer.remaining_len(), 1);
440
441 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
442 assert_eq!(buffer.find_subsequences(&[&[0x04, 0x04], &[0x04, 0x05]]).unwrap(), &[0x01, 0x02, 0x03]);
443 assert_eq!(buffer.remaining_len(), 0);
444
445 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
446 assert_eq!(buffer.find_subsequences_needle(&[&[0x03, 0x04], &[0x04, 0x05]], false).unwrap(), &[0x01, 0x02]);
447 assert_eq!(buffer.remaining_len(), 3);
448
449 let buffer = Buffer::from(vec![0x01, 0x02, 0x03, 0x04, 0x05]);
450 assert_eq!(buffer.find_subsequences_needle(&[&[0x03, 0x04], &[0x04, 0x05]], true).unwrap(), &[0x01, 0x02, 0x03, 0x04]);
451 assert_eq!(buffer.remaining_len(), 1);
452 }
453}