1use std::{iter::Rev, vec};
2
3use super::buffer::{MsbFirst, OrderConfig};
4
5pub trait ByteWriter: Sized {
8 fn write_u8(&mut self, value: u8);
9 fn write_u16(&mut self, value: u16) {
10 self.write_u8(value as u8);
11 self.write_u8((value >> 8) as u8);
12 }
13 fn write_u24(&mut self, value: u32) {
14 self.write_u8(value as u8);
15 self.write_u8((value >> 8) as u8);
16 self.write_u8((value >> 16) as u8);
17 }
18 fn write_u32(&mut self, value: u32) {
19 self.write_u16(value as u16);
20 self.write_u16((value >> 16) as u16);
21 }
22 fn write_u64(&mut self, value: u64) {
23 self.write_u32(value as u32);
24 self.write_u32((value >> 32) as u32);
25 }
26}
27
28impl ByteWriter for Vec<u8> {
29 fn write_u8(&mut self, value: u8) {
30 self.push(value);
31 }
32
33 fn write_u16(&mut self, value: u16) {
34 self.extend_from_slice(&value.to_le_bytes());
35 }
36
37 fn write_u24(&mut self, value: u32) {
38 self.extend_from_slice(&value.to_le_bytes()[..3]);
39 }
40
41 fn write_u32(&mut self, value: u32) {
42 self.extend_from_slice(&value.to_le_bytes());
43 }
44
45 fn write_u64(&mut self, value: u64) {
46 self.extend_from_slice(&value.to_le_bytes());
47 }
48}
49
50pub struct FunctionalByteWriter<R> {
53 write_fn: R,
54}
55
56impl<R: FnMut(u8)> ByteWriter for FunctionalByteWriter<R> {
57 fn write_u8(&mut self, value: u8) {
58 (self.write_fn)(value);
59 }
60
61 fn write_u16(&mut self, value: u16) {
62 self.write_u8(value as u8);
64 self.write_u8((value >> 8) as u8);
65 }
66
67 fn write_u24(&mut self, value: u32) {
68 self.write_u8(value as u8);
69 self.write_u8((value >> 8) as u8);
70 self.write_u8((value >> 16) as u8);
71 }
72
73 fn write_u32(&mut self, value: u32) {
74 self.write_u16(value as u16);
75 self.write_u16((value >> 16) as u16);
76 }
77
78 fn write_u64(&mut self, value: u64) {
79 self.write_u32(value as u32);
80 self.write_u32((value >> 32) as u32);
81 }
82}
83
84impl<R: FnMut(u8)> FunctionalByteWriter<R> {
85 pub fn new(write_fn: R) -> Self {
86 FunctionalByteWriter { write_fn }
87 }
88}
89
90pub struct BitWriter<'buffer, Buffer: ByteWriter, Order: OrderConfig = MsbFirst> {
91 buffer: &'buffer mut Buffer,
92
93 pos_in_curr_byte: u8,
96
97 curr_byte: u8,
99
100 phantom: std::marker::PhantomData<Order>,
101}
102
103impl<'buffer, Buffer: ByteWriter, Order: OrderConfig> BitWriter<'buffer, Buffer, Order> {
104 pub fn spown_from(buffer: &mut Buffer) -> BitWriter<'_, Buffer, Order> {
105 BitWriter {
106 buffer,
107 pos_in_curr_byte: 0,
108 curr_byte: 0,
109 phantom: std::marker::PhantomData,
110 }
111 }
112
113 pub fn write_bits(&mut self, (size, value): (u8, u64)) {
114 let mut offset = if Order::IS_MSB_FIRST { size } else { 0 };
115
116 if self.pos_in_curr_byte != 0 {
117 let num_remaining_in_curr_byte = unsafe { 8_u8.unchecked_sub(self.pos_in_curr_byte) };
119 if size <= num_remaining_in_curr_byte {
120 self.curr_byte |= if Order::IS_MSB_FIRST {
121 unsafe {
123 (value & ((1 << num_remaining_in_curr_byte) - 1))
124 << num_remaining_in_curr_byte.unchecked_sub(size)
125 }
126 } else {
127 value << self.pos_in_curr_byte
128 } as u8;
129 self.pos_in_curr_byte = if size == num_remaining_in_curr_byte {
130 self.buffer.write_u8(self.curr_byte);
131 self.curr_byte = 0;
132 0
133 } else {
134 unsafe { self.pos_in_curr_byte.unchecked_add(size) }
135 };
136 return;
137 }
138 self.curr_byte |= if Order::IS_MSB_FIRST {
139 unsafe {
141 (value >> size.unchecked_sub(num_remaining_in_curr_byte))
142 & ((1 << num_remaining_in_curr_byte) - 1)
143 }
144 } else {
145 value << self.pos_in_curr_byte
146 } as u8;
147 self.buffer.write_u8(self.curr_byte);
148 self.curr_byte = 0;
149 offset = if Order::IS_MSB_FIRST {
150 unsafe { size.unchecked_sub(num_remaining_in_curr_byte) }
152 } else {
153 num_remaining_in_curr_byte
154 }
155 }
156
157 for _ in 0..if Order::IS_MSB_FIRST {
164 offset
165 } else {
166 unsafe { size.unchecked_sub(offset) }
167 } >> 3
168 {
169 unsafe {
170 if Order::IS_MSB_FIRST {
171 offset = offset.unchecked_sub(8)
172 };
173 self.buffer.write_u8((value >> offset) as u8);
174 if !Order::IS_MSB_FIRST {
175 offset = offset.unchecked_add(8)
176 };
177 }
178 }
179 self.curr_byte = if Order::IS_MSB_FIRST {
180 unsafe { (value & ((1 << offset) - 1)) << (8_u8.unchecked_sub(offset)) }
182 } else {
183 value >> offset
184 } as u8;
185 self.pos_in_curr_byte = if Order::IS_MSB_FIRST {
186 offset
187 } else {
188 unsafe { size.unchecked_sub(offset) & 7 }
190 };
191 }
192}
193
194impl<'buffer, Buffer: ByteWriter, Order: OrderConfig> Drop for BitWriter<'buffer, Buffer, Order> {
195 fn drop(&mut self) {
196 if self.pos_in_curr_byte > 0 {
198 self.buffer.write_u8(self.curr_byte);
199 }
200 }
201}
202
203pub trait ByteReader {
204 type Rev: ReverseByteReader;
205 fn read_u8(&mut self) -> Result<u8, ReaderErr>;
206 fn read_u16(&mut self) -> Result<u16, ReaderErr> {
207 let out = [self.read_u8()?, self.read_u8()?];
208 Ok(u16::from_le_bytes(out))
209 }
210 fn read_u24(&mut self) -> Result<u32, ReaderErr> {
211 let out = [self.read_u8()?, self.read_u8()?, self.read_u8()?];
212 Ok(u32::from_le_bytes([out[0], out[1], out[2], 0]))
213 }
214 fn read_u32(&mut self) -> Result<u32, ReaderErr> {
215 let out = [
216 self.read_u8()?,
217 self.read_u8()?,
218 self.read_u8()?,
219 self.read_u8()?,
220 ];
221 Ok(u32::from_le_bytes(out))
222 }
223 fn read_u64(&mut self) -> Result<u64, ReaderErr> {
224 let out = [
225 self.read_u8()?,
226 self.read_u8()?,
227 self.read_u8()?,
228 self.read_u8()?,
229 self.read_u8()?,
230 self.read_u8()?,
231 self.read_u8()?,
232 self.read_u8()?,
233 ];
234 Ok(u64::from_le_bytes(out))
235 }
236
237 fn spown_reverse_reader_at(&mut self, offset: usize) -> Result<Self::Rev, ReaderErr>;
238}
239
240impl ByteReader for vec::IntoIter<u8> {
241 fn read_u8(&mut self) -> Result<u8, ReaderErr> {
242 self.next().ok_or(ReaderErr::NotEnoughData)
243 }
244
245 fn read_u16(&mut self) -> Result<u16, ReaderErr> {
246 let out = [
247 self.next().ok_or(ReaderErr::NotEnoughData)?,
248 self.next().ok_or(ReaderErr::NotEnoughData)?,
249 ];
250 Ok(u16::from_le_bytes(out))
251 }
252
253 fn read_u32(&mut self) -> Result<u32, ReaderErr> {
254 let out = [
255 self.next().ok_or(ReaderErr::NotEnoughData)?,
256 self.next().ok_or(ReaderErr::NotEnoughData)?,
257 self.next().ok_or(ReaderErr::NotEnoughData)?,
258 self.next().ok_or(ReaderErr::NotEnoughData)?,
259 ];
260 Ok(u32::from_le_bytes(out))
261 }
262
263 fn read_u64(&mut self) -> Result<u64, ReaderErr> {
264 let out = [
265 self.next().ok_or(ReaderErr::NotEnoughData)?,
266 self.next().ok_or(ReaderErr::NotEnoughData)?,
267 self.next().ok_or(ReaderErr::NotEnoughData)?,
268 self.next().ok_or(ReaderErr::NotEnoughData)?,
269 self.next().ok_or(ReaderErr::NotEnoughData)?,
270 self.next().ok_or(ReaderErr::NotEnoughData)?,
271 self.next().ok_or(ReaderErr::NotEnoughData)?,
272 self.next().ok_or(ReaderErr::NotEnoughData)?,
273 ];
274 Ok(u64::from_le_bytes(out))
275 }
276
277 type Rev = Rev<vec::IntoIter<u8>>;
278 fn spown_reverse_reader_at(&mut self, offset: usize) -> Result<Self::Rev, ReaderErr> {
279 let mut vec: Vec<_> = self.collect();
280 if offset > vec.len() {
281 return Err(ReaderErr::NotEnoughData);
282 }
283 let rest = vec.split_off(offset);
284 let rev = vec.into_iter().rev();
285 *self = rest.into_iter();
286 Ok(rev)
287 }
288}
289
290pub struct FunctionalByteReader<R> {
293 read_fn: R,
294}
295
296impl<R: FnMut() -> Result<u8, ReaderErr>> ByteReader for FunctionalByteReader<R> {
297 fn read_u8(&mut self) -> Result<u8, ReaderErr> {
298 (self.read_fn)()
299 }
300
301 fn read_u16(&mut self) -> Result<u16, ReaderErr> {
302 let out = [self.read_u8()?, self.read_u8()?];
303 Ok(u16::from_le_bytes(out))
304 }
305
306 fn read_u32(&mut self) -> Result<u32, ReaderErr> {
307 let out = [
308 self.read_u8()?,
309 self.read_u8()?,
310 self.read_u8()?,
311 self.read_u8()?,
312 ];
313 Ok(u32::from_le_bytes(out))
314 }
315
316 fn read_u64(&mut self) -> Result<u64, ReaderErr> {
317 let out = [
318 self.read_u8()?,
319 self.read_u8()?,
320 self.read_u8()?,
321 self.read_u8()?,
322 self.read_u8()?,
323 self.read_u8()?,
324 self.read_u8()?,
325 self.read_u8()?,
326 ];
327 Ok(u64::from_le_bytes(out))
328 }
329
330 type Rev = Rev<vec::IntoIter<u8>>;
331
332 fn spown_reverse_reader_at(&mut self, offset: usize) -> Result<Self::Rev, ReaderErr> {
333 let mut vec = Vec::new();
334 for _ in 0..offset {
335 vec.push(self.read_u8()?);
336 }
337 let rest = vec.into_iter().rev();
338 Ok(rest)
339 }
340}
341
342impl<R: FnMut() -> Result<u8, ReaderErr>> FunctionalByteReader<R> {
343 pub fn new(read_fn: R) -> Self {
344 FunctionalByteReader { read_fn }
345 }
346}
347
348#[allow(unused)] pub struct BitReader<'buffer, Buffer, Order: OrderConfig = MsbFirst> {
350 buffer: &'buffer mut Buffer,
351
352 pos_in_curr_byte: u8,
355
356 curr_byte: u8,
358
359 phantom: std::marker::PhantomData<Order>,
360}
361
362#[allow(unused)] impl<'buffer, Buffer: ByteReader, Order: OrderConfig> BitReader<'buffer, Buffer, Order> {
364 pub fn spown_from(buffer: &'buffer mut Buffer) -> Option<BitReader<'buffer, Buffer, Order>> {
367 Some(BitReader {
368 buffer,
369 pos_in_curr_byte: 0,
370 curr_byte: 0,
371 phantom: std::marker::PhantomData,
372 })
373 }
374
375 pub fn read_bits(&mut self, size: u8) -> Result<u64, ReaderErr> {
378 debug_assert!(
379 size > 0 && size <= 64,
380 "Size must be between 1 and 64 bits."
381 );
382
383 let mut offset = if Order::IS_MSB_FIRST { size } else { 0 };
384 let mut value: u64 = 0;
385
386 if self.pos_in_curr_byte != 0 {
387 let num_remaining_in_curr_byte = unsafe { 8_u8.unchecked_sub(self.pos_in_curr_byte) };
389 if size <= num_remaining_in_curr_byte {
390 value = unsafe {
391 if Order::IS_MSB_FIRST {
392 (self.curr_byte & ((1 << num_remaining_in_curr_byte) - 1))
393 >> (num_remaining_in_curr_byte.unchecked_sub(size))
394 } else {
395 self.curr_byte >> self.pos_in_curr_byte
396 }
397 } as u64;
398 self.pos_in_curr_byte = if size == num_remaining_in_curr_byte {
399 0
400 } else {
401 unsafe { self.pos_in_curr_byte.unchecked_add(size) }
402 };
403 return Ok(value & ((1 << size) - 1));
404 }
405 value = if Order::IS_MSB_FIRST {
406 ((self.curr_byte as usize) & ((1 << num_remaining_in_curr_byte) - 1))
407 << unsafe { size.unchecked_sub(num_remaining_in_curr_byte) }
408 } else {
409 (self.curr_byte >> self.pos_in_curr_byte) as usize
410 } as u64;
411 offset = if Order::IS_MSB_FIRST {
412 unsafe { offset.unchecked_sub(num_remaining_in_curr_byte) }
413 } else {
414 num_remaining_in_curr_byte
415 };
416 }
417
418 for _ in 0..if Order::IS_MSB_FIRST {
419 offset
420 } else {
421 unsafe { size.unchecked_sub(offset) }
422 } >> 3
423 {
424 self.curr_byte = self.buffer.read_u8()?;
425 if Order::IS_MSB_FIRST {
426 offset = unsafe { offset.unchecked_sub(8) };
427 }
428 value |= (self.curr_byte as u64) << offset;
429 if !Order::IS_MSB_FIRST {
430 offset = unsafe { offset.unchecked_add(8) };
431 }
432 }
433
434 if (Order::IS_MSB_FIRST && offset > 0) || (!Order::IS_MSB_FIRST && size - offset > 0) {
436 self.curr_byte = self.buffer.read_u8()?;
437 value |= unsafe {
438 if Order::IS_MSB_FIRST {
439 (self.curr_byte as u64 >> (8_u8.unchecked_sub(offset))) & ((1 << offset) - 1)
440 } else {
441 (self.curr_byte as u64 & ((1 << size.unchecked_sub(offset)) - 1)) << offset
442 }
443 };
444 }
445
446 self.pos_in_curr_byte = if Order::IS_MSB_FIRST {
447 offset
448 } else {
449 (size - offset) & 7
450 };
451 Ok(value)
452 }
453}
454
455#[derive(thiserror::Error, Debug, Clone, Copy, PartialEq, Eq)]
456pub enum ReaderErr {
457 #[error("Not enough data to read")]
458 NotEnoughData,
459}
460
461#[allow(unused)] pub trait ReverseByteReader {
463 fn read_u8_back(&mut self) -> Result<u8, ReaderErr>;
464 fn read_u16_back(&mut self) -> Result<u16, ReaderErr> {
465 let mut out = [self.read_u8_back()?, self.read_u8_back()?];
466 out.reverse();
467 Ok(u16::from_le_bytes(out))
468 }
469 fn read_u24_back(&mut self) -> Result<u32, ReaderErr> {
470 let mut out = [
471 self.read_u8_back()?,
472 self.read_u8_back()?,
473 self.read_u8_back()?,
474 ];
475 out.reverse();
476 Ok(u32::from_le_bytes([out[0], out[1], out[2], 0]))
477 }
478 fn read_u32_back(&mut self) -> Result<u32, ReaderErr> {
479 let mut out = [
480 self.read_u8_back()?,
481 self.read_u8_back()?,
482 self.read_u8_back()?,
483 self.read_u8_back()?,
484 ];
485 out.reverse();
486 Ok(u32::from_le_bytes(out))
487 }
488 fn read_u64_back(&mut self) -> Result<u64, ReaderErr> {
489 let mut out = [
490 self.read_u8_back()?,
491 self.read_u8_back()?,
492 self.read_u8_back()?,
493 self.read_u8_back()?,
494 self.read_u8_back()?,
495 self.read_u8_back()?,
496 self.read_u8_back()?,
497 self.read_u8_back()?,
498 ];
499 out.reverse();
500 Ok(u64::from_le_bytes(out))
501 }
502}
503
504impl<I: DoubleEndedIterator<Item = u8>> ReverseByteReader for Rev<I> {
505 fn read_u8_back(&mut self) -> Result<u8, ReaderErr> {
506 self.next().ok_or(ReaderErr::NotEnoughData)
507 }
508}
509
510#[cfg(test)]
511mod tests {
512 use super::BitWriter;
513 use crate::core::{bit_coder::BitReader, buffer::*};
514 use crate::prelude::ByteWriter;
515
516 #[test]
517 fn test_writer_reader_msb_first() {
518 let mut buffer = Vec::new();
519 let mut writer = BitWriter::<_, MsbFirst>::spown_from(&mut buffer);
520 writer.write_bits((2, 0b10));
521 writer.write_bits((3, 0b011));
522 drop(writer); assert_eq!(buffer.len(), 1);
524 let mut reader = buffer.into_iter();
525 let mut reader = BitReader::<_, MsbFirst>::spown_from(&mut reader).unwrap();
526 assert_eq!(reader.read_bits(2).unwrap(), 0b10);
527 assert_eq!(reader.read_bits(3).unwrap(), 0b011);
528
529 let mut buffer = Vec::new();
530 let mut writer = BitWriter::<_, MsbFirst>::spown_from(&mut buffer);
531 writer.write_bits((7, 0b0111010));
532 drop(writer); assert_eq!(buffer.len(), 1);
534 let mut reader = buffer.into_iter();
535 let mut reader = BitReader::<_, MsbFirst>::spown_from(&mut reader).unwrap();
536 assert_eq!(reader.read_bits(7).unwrap(), 0b0111010);
537
538 let mut buffer = Vec::new();
539 let mut writer: BitWriter<_> = BitWriter::spown_from(&mut buffer);
540 writer.write_bits((8, 0b10111010));
541 drop(writer); assert_eq!(buffer[0], 0b10111010);
543 let mut reader = buffer.into_iter();
544 let mut reader: BitReader<_> = BitReader::spown_from(&mut reader).unwrap();
545 assert_eq!(reader.read_bits(8).unwrap(), 0b10111010);
546
547 let mut buffer = Vec::new();
548 let mut writer: BitWriter<_> = BitWriter::spown_from(&mut buffer);
549 writer.write_bits((9, 0b110111011));
550 drop(writer); assert_eq!(buffer.len(), 2);
552 assert_eq!(buffer[0], 0b11011101);
553 assert_eq!(buffer[1], 0b10000000);
554 let mut reader = buffer.into_iter();
555 let mut reader: BitReader<_> = BitReader::spown_from(&mut reader).unwrap();
556 assert_eq!(reader.read_bits(9).unwrap(), 0b110111011);
557
558 let mut buffer = Vec::new();
559 let mut writer: BitWriter<_> = BitWriter::spown_from(&mut buffer);
560 writer.write_bits((9, 0b101010100));
561 writer.write_bits((8, 0b10101110));
562 writer.write_bits((7, 0b0101010));
563 writer.write_bits((6, 0b111100));
564 writer.write_bits((5, 0b00001));
565 writer.write_bits((4, 0b1100));
566 drop(writer); assert_eq!(buffer.len(), (9 + 8 + 7 + 6 + 5 + 4) / 8 + 1);
568 assert_eq!(buffer[0], 0b10101010);
569 assert_eq!(buffer[1], 0b01010111);
570 assert_eq!(buffer[2], 0b00101010);
571 assert_eq!(buffer[3], 0b11110000);
572 assert_eq!(buffer[4], 0b00111000);
573 let mut reader = buffer.into_iter();
574 let mut reader: BitReader<_> = BitReader::spown_from(&mut reader).unwrap();
575 assert_eq!(reader.read_bits(9).unwrap(), 0b101010100);
576 assert_eq!(reader.read_bits(8).unwrap(), 0b10101110);
577 assert_eq!(reader.read_bits(7).unwrap(), 0b0101010);
578 assert_eq!(reader.read_bits(6).unwrap(), 0b111100);
579 assert_eq!(reader.read_bits(5).unwrap(), 0b00001);
580 assert_eq!(reader.read_bits(4).unwrap(), 0b1100);
581
582 let mut buffer = Vec::new();
583 let mut writer: BitWriter<_> = BitWriter::spown_from(&mut buffer);
584 writer.write_bits((11, 0b10111010110));
585 drop(writer); assert_eq!(buffer.len(), 2);
587 let mut reader = buffer.into_iter();
588 let mut reader: BitReader<_> = BitReader::spown_from(&mut reader).unwrap();
589 assert_eq!(reader.read_bits(2).unwrap(), 0b10);
590 assert_eq!(reader.read_bits(1).unwrap(), 0b1);
591 assert_eq!(reader.read_bits(3).unwrap(), 0b110);
592 assert_eq!(reader.read_bits(3).unwrap(), 0b101);
593 assert_eq!(reader.read_bits(2).unwrap(), 0b10);
594 }
595
596 #[test]
597 fn test_writer_reader_lsb_first() {
598 let mut buffer = Vec::new();
599 {
600 let mut writer = BitWriter::<_, LsbFirst>::spown_from(&mut buffer);
601 writer.write_bits((9, 0b101010100));
602 writer.write_bits((8, 0b10101010));
603 writer.write_bits((7, 0b0101010));
604 writer.write_bits((6, 0b111100));
605 writer.write_bits((5, 0b00001));
606 writer.write_bits((4, 0b1100));
607 }
608 assert_eq!(buffer.len(), (9 + 8 + 7 + 6 + 5 + 4) / 8 + 1);
609 let mut reader = buffer.into_iter();
610 let mut reader = BitReader::<_, LsbFirst>::spown_from(&mut reader).unwrap();
611 assert_eq!(reader.read_bits(9).unwrap(), 0b101010100);
612 assert_eq!(reader.read_bits(8).unwrap(), 0b10101010);
613 assert_eq!(reader.read_bits(7).unwrap(), 0b0101010);
614 assert_eq!(reader.read_bits(6).unwrap(), 0b111100);
615 assert_eq!(reader.read_bits(5).unwrap(), 0b00001);
616 assert_eq!(reader.read_bits(4).unwrap(), 0b1100);
617
618 let mut buffer = Vec::new();
619 {
620 let mut writer = BitWriter::<_, LsbFirst>::spown_from(&mut buffer);
621 writer.write_bits((10, 0b1010101010));
622 }
623 assert_eq!(buffer.len(), 2);
624 let mut reader = buffer.into_iter();
625 let mut reader = BitReader::<_, LsbFirst>::spown_from(&mut reader).unwrap();
626 for _ in 0..5 {
627 assert_eq!(reader.read_bits(2).unwrap(), 0b10);
628 }
629 }
630
631 use crate::core::bit_coder::ByteReader;
632 use crate::core::bit_coder::ReaderErr::NotEnoughData;
633 use crate::core::bit_coder::ReverseByteReader;
634 #[test]
635 fn test_reverse_reader1() {
636 let buffer = vec![1_u8, 2, 3, 4, 5];
637 let mut reader = buffer.into_iter();
638 let mut reverse_reader = reader.spown_reverse_reader_at(2).unwrap();
639 assert_eq!(reverse_reader.read_u8_back().unwrap(), 2);
640 assert_eq!(reverse_reader.read_u8_back().unwrap(), 1);
641 assert_eq!(reverse_reader.read_u8_back(), Err(NotEnoughData));
642 assert!(reader.next().unwrap() == 3);
643 assert!(reader.next().unwrap() == 4);
644 assert!(reader.next().unwrap() == 5);
645 assert!(reader.next().is_none());
646 }
647
648 #[test]
649 fn test_reverse_reader2() {
650 let mut buffer = Vec::new();
651 buffer.write_u8(200);
652 buffer.write_u16(201);
653 buffer.write_u24(202);
654 buffer.write_u32(203);
655 assert!(buffer.len() == 10);
656 let mut reader = buffer.into_iter();
657 let mut reverse_reader = reader.spown_reverse_reader_at(10).unwrap();
658 assert_eq!(reverse_reader.read_u32_back().unwrap(), 203);
659 assert_eq!(reverse_reader.read_u24_back().unwrap(), 202);
660 assert_eq!(reverse_reader.read_u16_back().unwrap(), 201);
661 assert_eq!(reverse_reader.read_u8_back().unwrap(), 200);
662 assert_eq!(reverse_reader.read_u8_back(), Err(NotEnoughData));
663 assert!(reader.next().is_none());
664 }
665}