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