1use common_traits::*;
10
11use crate::codes::params::{DefaultReadParams, ReadParams};
12use crate::traits::*;
13use core::convert::Infallible;
14use core::error::Error;
15use core::{mem, ptr};
16#[cfg(feature = "mem_dbg")]
17use mem_dbg::{MemDbg, MemSize};
18
19type BB<WR> = <<WR as WordRead>::Word as DoubleType>::DoubleType;
22
23#[derive(Debug)]
50#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
51pub struct BufBitReader<E: Endianness, WR: WordRead, RP: ReadParams = DefaultReadParams>
52where
53 WR::Word: DoubleType,
54{
55 backend: WR,
57 buffer: BB<WR>,
61 bits_in_buffer: usize,
64 _marker: core::marker::PhantomData<(E, RP)>,
65}
66
67impl<E: Endianness, WR: WordRead + Clone, RP: ReadParams> core::clone::Clone
68 for BufBitReader<E, WR, RP>
69where
70 WR::Word: DoubleType,
71{
72 fn clone(&self) -> Self {
73 Self {
74 backend: self.backend.clone(),
75 buffer: self.buffer,
76 bits_in_buffer: self.bits_in_buffer,
77 _marker: core::marker::PhantomData,
78 }
79 }
80}
81
82impl<E: Endianness, WR: WordRead, RP: ReadParams> BufBitReader<E, WR, RP>
83where
84 WR::Word: DoubleType,
85{
86 #[must_use]
96 pub fn new(backend: WR) -> Self {
97 #[cfg(feature = "std")]
98 check_tables(WR::Word::BITS + 1);
99 Self {
100 backend,
101 buffer: BB::<WR>::ZERO,
102 bits_in_buffer: 0,
103 _marker: core::marker::PhantomData,
104 }
105 }
106
107 pub fn into_inner(self) -> Result<WR, Infallible> {
109 let backend = unsafe { ptr::read(&self.backend) };
111 mem::forget(self);
112 Ok(backend)
113 }
114}
115
116impl<WR: WordRead, RP: ReadParams> BufBitReader<BE, WR, RP>
121where
122 WR::Word: DoubleType,
123{
124 #[inline(always)]
128 fn refill(&mut self) -> Result<(), <WR as WordRead>::Error> {
129 debug_assert!(BB::<WR>::BITS - self.bits_in_buffer >= WR::Word::BITS);
130
131 let new_word: BB<WR> = self.backend.read_word()?.to_be().upcast();
132 self.bits_in_buffer += WR::Word::BITS;
133 self.buffer |= new_word << (BB::<WR>::BITS - self.bits_in_buffer);
134 Ok(())
135 }
136}
137
138impl<WR: WordRead, RP: ReadParams> BitRead<BE> for BufBitReader<BE, WR, RP>
139where
140 WR::Word: DoubleType + UpcastableInto<u64>,
141 BB<WR>: CastableInto<u64>,
142{
143 type Error = <WR as WordRead>::Error;
144 type PeekWord = BB<WR>;
145
146 #[inline(always)]
147 fn peek_bits(&mut self, n_bits: usize) -> Result<Self::PeekWord, Self::Error> {
148 debug_assert!(n_bits > 0);
149 debug_assert!(n_bits <= Self::PeekWord::BITS);
150
151 if n_bits > self.bits_in_buffer {
153 self.refill()?;
154 }
155
156 debug_assert!(n_bits <= self.bits_in_buffer);
157
158 Ok(self.buffer >> (BB::<WR>::BITS - n_bits))
160 }
161
162 #[inline(always)]
163 fn skip_bits_after_peek(&mut self, n_bits: usize) {
164 self.bits_in_buffer -= n_bits;
165 self.buffer <<= n_bits;
166 }
167
168 #[inline]
169 fn read_bits(&mut self, mut n_bits: usize) -> Result<u64, Self::Error> {
170 debug_assert!(n_bits <= 64);
171 debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
172
173 if n_bits <= self.bits_in_buffer {
175 let result: u64 = (self.buffer >> (BB::<WR>::BITS - n_bits - 1) >> 1_u32).cast();
177 self.bits_in_buffer -= n_bits;
178 self.buffer <<= n_bits;
179 return Ok(result);
180 }
181
182 let mut result: u64 =
183 (self.buffer >> (BB::<WR>::BITS - 1 - self.bits_in_buffer) >> 1_u8).cast();
184 n_bits -= self.bits_in_buffer;
185
186 while n_bits > WR::Word::BITS {
188 let new_word: u64 = self.backend.read_word()?.to_be().upcast();
189 result = (result << WR::Word::BITS) | new_word;
190 n_bits -= WR::Word::BITS;
191 }
192
193 debug_assert!(n_bits > 0);
194 debug_assert!(n_bits <= WR::Word::BITS);
195
196 let new_word = self.backend.read_word()?.to_be();
198 self.bits_in_buffer = WR::Word::BITS - n_bits;
199 let upcasted: u64 = new_word.upcast();
201 let final_bits: u64 = (upcasted >> self.bits_in_buffer).downcast();
202 result = (result << (n_bits - 1) << 1) | final_bits;
203 self.buffer = (UpcastableInto::<BB<WR>>::upcast(new_word)
205 << (BB::<WR>::BITS - self.bits_in_buffer - 1))
206 << 1;
207
208 Ok(result)
209 }
210
211 #[inline]
212 fn read_unary(&mut self) -> Result<u64, Self::Error> {
213 debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
214
215 let zeros: usize = self.buffer.leading_zeros() as _;
217
218 if zeros < self.bits_in_buffer {
220 self.buffer = self.buffer << zeros << 1;
221 self.bits_in_buffer -= zeros + 1;
222 return Ok(zeros as u64);
223 }
224
225 let mut result: u64 = self.bits_in_buffer as _;
226
227 loop {
228 let new_word = self.backend.read_word()?.to_be();
229
230 if new_word != WR::Word::ZERO {
231 let zeros: usize = new_word.leading_zeros() as _;
232 self.buffer =
233 UpcastableInto::<BB<WR>>::upcast(new_word) << (WR::Word::BITS + zeros) << 1;
234 self.bits_in_buffer = WR::Word::BITS - zeros - 1;
235 return Ok(result + zeros as u64);
236 }
237 result += WR::Word::BITS as u64;
238 }
239 }
240
241 #[inline]
242 fn skip_bits(&mut self, mut n_bits: usize) -> Result<(), Self::Error> {
243 debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
244 if n_bits <= self.bits_in_buffer {
246 self.bits_in_buffer -= n_bits;
247 self.buffer <<= n_bits;
248 return Ok(());
249 }
250
251 n_bits -= self.bits_in_buffer;
252
253 while n_bits > WR::Word::BITS {
255 let _ = self.backend.read_word()?;
256 n_bits -= WR::Word::BITS;
257 }
258
259 let new_word = self.backend.read_word()?.to_be();
261 self.bits_in_buffer = WR::Word::BITS - n_bits;
262
263 self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word)
264 << (BB::<WR>::BITS - 1 - self.bits_in_buffer)
265 << 1;
266
267 Ok(())
268 }
269
270 #[cfg(not(feature = "no_copy_impls"))]
271 fn copy_to<F: Endianness, W: BitWrite<F>>(
272 &mut self,
273 bit_write: &mut W,
274 mut n: u64,
275 ) -> Result<(), CopyError<Self::Error, W::Error>> {
276 let from_buffer = Ord::min(n, self.bits_in_buffer as _);
277 self.buffer = self.buffer.rotate_left(from_buffer as _);
278
279 #[allow(unused_mut)]
280 let mut self_buffer_u64: u64 = self.buffer.cast();
281
282 #[cfg(feature = "checks")]
283 {
284 if n < 64 {
286 self_buffer_u64 &= (1_u64 << n) - 1;
287 }
288 }
289
290 bit_write
291 .write_bits(self_buffer_u64, from_buffer as usize)
292 .map_err(CopyError::WriteError)?;
293 n -= from_buffer;
294
295 if n == 0 {
296 self.bits_in_buffer -= from_buffer as usize;
297 return Ok(());
298 }
299
300 while n > WR::Word::BITS as u64 {
301 bit_write
302 .write_bits(
303 self.backend
304 .read_word()
305 .map_err(CopyError::ReadError)?
306 .to_be()
307 .upcast(),
308 WR::Word::BITS,
309 )
310 .map_err(CopyError::WriteError)?;
311 n -= WR::Word::BITS as u64;
312 }
313
314 assert!(n > 0);
315 let new_word = self
316 .backend
317 .read_word()
318 .map_err(CopyError::ReadError)?
319 .to_be();
320 self.bits_in_buffer = WR::Word::BITS - n as usize;
321 bit_write
322 .write_bits((new_word >> self.bits_in_buffer).upcast(), n as usize)
323 .map_err(CopyError::WriteError)?;
324 self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word)
325 .rotate_right(WR::Word::BITS as u32 - n as u32);
326
327 Ok(())
328 }
329}
330
331impl<
332 E: Error + Send + Sync + 'static,
333 WR: WordRead<Error = E> + WordSeek<Error = E>,
334 RP: ReadParams,
335 > BitSeek for BufBitReader<BE, WR, RP>
336where
337 WR::Word: DoubleType,
338{
339 type Error = <WR as WordSeek>::Error;
340
341 #[inline]
342 fn bit_pos(&mut self) -> Result<u64, Self::Error> {
343 Ok(self.backend.word_pos()? * WR::Word::BITS as u64 - self.bits_in_buffer as u64)
344 }
345
346 #[inline]
347 fn set_bit_pos(&mut self, bit_index: u64) -> Result<(), Self::Error> {
348 self.backend
349 .set_word_pos(bit_index / WR::Word::BITS as u64)?;
350 let bit_offset = (bit_index % WR::Word::BITS as u64) as usize;
351 self.buffer = BB::<WR>::ZERO;
352 self.bits_in_buffer = 0;
353 if bit_offset != 0 {
354 let new_word: BB<WR> = self.backend.read_word()?.to_be().upcast();
355 self.bits_in_buffer = WR::Word::BITS - bit_offset;
356 self.buffer = new_word << (BB::<WR>::BITS - self.bits_in_buffer);
357 }
358 Ok(())
359 }
360}
361
362impl<WR: WordRead, RP: ReadParams> BufBitReader<LE, WR, RP>
367where
368 WR::Word: DoubleType,
369{
370 #[inline(always)]
374 fn refill(&mut self) -> Result<(), <WR as WordRead>::Error> {
375 debug_assert!(BB::<WR>::BITS - self.bits_in_buffer >= WR::Word::BITS);
376
377 let new_word: BB<WR> = self.backend.read_word()?.to_le().upcast();
378 self.buffer |= new_word << self.bits_in_buffer;
379 self.bits_in_buffer += WR::Word::BITS;
380 Ok(())
381 }
382}
383
384impl<WR: WordRead, RP: ReadParams> BitRead<LE> for BufBitReader<LE, WR, RP>
385where
386 WR::Word: DoubleType + UpcastableInto<u64>,
387 BB<WR>: CastableInto<u64>,
388{
389 type Error = <WR as WordRead>::Error;
390 type PeekWord = BB<WR>;
391
392 #[inline(always)]
393 fn peek_bits(&mut self, n_bits: usize) -> Result<Self::PeekWord, Self::Error> {
394 debug_assert!(n_bits > 0);
395 debug_assert!(n_bits <= Self::PeekWord::BITS);
396
397 if n_bits > self.bits_in_buffer {
399 self.refill()?;
400 }
401
402 debug_assert!(n_bits <= self.bits_in_buffer);
403
404 let shamt = BB::<WR>::BITS - n_bits;
406 Ok((self.buffer << shamt) >> shamt)
407 }
408
409 #[inline(always)]
410 fn skip_bits_after_peek(&mut self, n_bits: usize) {
411 self.bits_in_buffer -= n_bits;
412 self.buffer >>= n_bits;
413 }
414
415 #[inline]
416 fn read_bits(&mut self, mut n_bits: usize) -> Result<u64, Self::Error> {
417 debug_assert!(n_bits <= 64);
418 debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
419
420 if n_bits <= self.bits_in_buffer {
422 let result: u64 = (self.buffer & ((BB::<WR>::ONE << n_bits) - BB::<WR>::ONE)).cast();
423 self.bits_in_buffer -= n_bits;
424 self.buffer >>= n_bits;
425 return Ok(result);
426 }
427
428 let mut result: u64 = self.buffer.cast();
429 let mut bits_in_res = self.bits_in_buffer;
430
431 while n_bits > WR::Word::BITS + bits_in_res {
433 let new_word: u64 = self.backend.read_word()?.to_le().upcast();
434 result |= new_word << bits_in_res;
435 bits_in_res += WR::Word::BITS;
436 }
437
438 n_bits -= bits_in_res;
439
440 debug_assert!(n_bits > 0);
441 debug_assert!(n_bits <= WR::Word::BITS);
442
443 let new_word = self.backend.read_word()?.to_le();
445 self.bits_in_buffer = WR::Word::BITS - n_bits;
446 let shamt = 64 - n_bits;
448 let upcasted: u64 = new_word.upcast();
449 let final_bits: u64 = ((upcasted << shamt) >> shamt).downcast();
450 result |= final_bits << bits_in_res;
451 self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> n_bits;
453
454 Ok(result)
455 }
456
457 #[inline]
458 fn read_unary(&mut self) -> Result<u64, Self::Error> {
459 debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
460
461 let zeros: usize = self.buffer.trailing_zeros() as usize;
463
464 if zeros < self.bits_in_buffer {
466 self.buffer = self.buffer >> zeros >> 1;
467 self.bits_in_buffer -= zeros + 1;
468 return Ok(zeros as u64);
469 }
470
471 let mut result: u64 = self.bits_in_buffer as _;
472
473 loop {
474 let new_word = self.backend.read_word()?.to_le();
475
476 if new_word != WR::Word::ZERO {
477 let zeros: usize = new_word.trailing_zeros() as _;
478 self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> zeros >> 1;
479 self.bits_in_buffer = WR::Word::BITS - zeros - 1;
480 return Ok(result + zeros as u64);
481 }
482 result += WR::Word::BITS as u64;
483 }
484 }
485
486 #[inline]
487 fn skip_bits(&mut self, mut n_bits: usize) -> Result<(), Self::Error> {
488 debug_assert!(self.bits_in_buffer < BB::<WR>::BITS);
489 if n_bits <= self.bits_in_buffer {
491 self.bits_in_buffer -= n_bits;
492 self.buffer >>= n_bits;
493 return Ok(());
494 }
495
496 n_bits -= self.bits_in_buffer;
497
498 while n_bits > WR::Word::BITS {
500 let _ = self.backend.read_word()?;
501 n_bits -= WR::Word::BITS;
502 }
503
504 let new_word = self.backend.read_word()?.to_le();
506 self.bits_in_buffer = WR::Word::BITS - n_bits;
507 self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> n_bits;
508
509 Ok(())
510 }
511
512 #[cfg(not(feature = "no_copy_impls"))]
513 fn copy_to<F: Endianness, W: BitWrite<F>>(
514 &mut self,
515 bit_write: &mut W,
516 mut n: u64,
517 ) -> Result<(), CopyError<Self::Error, W::Error>> {
518 let from_buffer = Ord::min(n, self.bits_in_buffer as _);
519
520 #[allow(unused_mut)]
521 let mut self_buffer_u64: u64 = self.buffer.cast();
522
523 #[cfg(feature = "checks")]
524 {
525 if n < 64 {
527 self_buffer_u64 &= (1_u64 << n) - 1;
528 }
529 }
530
531 bit_write
532 .write_bits(self_buffer_u64, from_buffer as usize)
533 .map_err(CopyError::WriteError)?;
534
535 self.buffer >>= from_buffer;
536 n -= from_buffer;
537
538 if n == 0 {
539 self.bits_in_buffer -= from_buffer as usize;
540 return Ok(());
541 }
542
543 while n > WR::Word::BITS as u64 {
544 bit_write
545 .write_bits(
546 self.backend
547 .read_word()
548 .map_err(CopyError::ReadError)?
549 .to_le()
550 .upcast(),
551 WR::Word::BITS,
552 )
553 .map_err(CopyError::WriteError)?;
554 n -= WR::Word::BITS as u64;
555 }
556
557 assert!(n > 0);
558 let new_word = self
559 .backend
560 .read_word()
561 .map_err(CopyError::ReadError)?
562 .to_le();
563 self.bits_in_buffer = WR::Word::BITS - n as usize;
564
565 #[allow(unused_mut)]
566 let mut new_word_u64: u64 = new_word.upcast();
567
568 #[cfg(feature = "checks")]
569 {
570 if n < 64 {
572 new_word_u64 &= (1_u64 << n) - 1;
573 }
574 }
575
576 bit_write
577 .write_bits(new_word_u64, n as usize)
578 .map_err(CopyError::WriteError)?;
579 self.buffer = UpcastableInto::<BB<WR>>::upcast(new_word) >> n;
580 Ok(())
581 }
582}
583
584impl<
585 E: Error + Send + Sync + 'static,
586 WR: WordRead<Error = E> + WordSeek<Error = E>,
587 RP: ReadParams,
588 > BitSeek for BufBitReader<LE, WR, RP>
589where
590 WR::Word: DoubleType,
591{
592 type Error = <WR as WordSeek>::Error;
593
594 #[inline]
595 fn bit_pos(&mut self) -> Result<u64, Self::Error> {
596 Ok(self.backend.word_pos()? * WR::Word::BITS as u64 - self.bits_in_buffer as u64)
597 }
598
599 #[inline]
600 fn set_bit_pos(&mut self, bit_index: u64) -> Result<(), Self::Error> {
601 self.backend
602 .set_word_pos(bit_index / WR::Word::BITS as u64)?;
603
604 let bit_offset = (bit_index % WR::Word::BITS as u64) as usize;
605 self.buffer = BB::<WR>::ZERO;
606 self.bits_in_buffer = 0;
607 if bit_offset != 0 {
608 let new_word: BB<WR> = self.backend.read_word()?.to_le().upcast();
609 self.bits_in_buffer = WR::Word::BITS - bit_offset;
610 self.buffer = new_word >> bit_offset;
611 }
612 Ok(())
613 }
614}
615
616#[cfg(feature = "std")]
617impl<WR: WordRead, RP: ReadParams> std::io::Read for BufBitReader<LE, WR, RP>
618where
619 WR::Word: DoubleType + UpcastableInto<u64>,
620 BB<WR>: CastableInto<u64>,
621{
622 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
623 let mut iter = buf.chunks_exact_mut(8);
624
625 for chunk in &mut iter {
626 let word = self
627 .read_bits(64)
628 .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
629 chunk.copy_from_slice(&word.to_le_bytes());
630 }
631
632 let rem = iter.into_remainder();
633 if !rem.is_empty() {
634 let word = self
635 .read_bits(rem.len() * 8)
636 .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
637 rem.copy_from_slice(&word.to_le_bytes()[..rem.len()]);
638 }
639
640 Ok(buf.len())
641 }
642}
643
644#[cfg(feature = "std")]
645impl<WR: WordRead, RP: ReadParams> std::io::Read for BufBitReader<BE, WR, RP>
646where
647 WR::Word: DoubleType + UpcastableInto<u64>,
648 BB<WR>: CastableInto<u64>,
649{
650 fn read(&mut self, buf: &mut [u8]) -> std::io::Result<usize> {
651 let mut iter = buf.chunks_exact_mut(8);
652
653 for chunk in &mut iter {
654 let word = self
655 .read_bits(64)
656 .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
657 chunk.copy_from_slice(&word.to_be_bytes());
658 }
659
660 let rem = iter.into_remainder();
661 if !rem.is_empty() {
662 let word = self
663 .read_bits(rem.len() * 8)
664 .map_err(|_| std::io::ErrorKind::UnexpectedEof)?;
665 rem.copy_from_slice(&word.to_be_bytes()[8 - rem.len()..]);
666 }
667
668 Ok(buf.len())
669 }
670}
671
672#[cfg(test)]
673#[cfg(feature = "std")]
674mod test {
675 use super::*;
676 use crate::prelude::{MemWordReader, MemWordWriterVec};
677 use std::io::Read;
678
679 #[test]
680 fn test_read() {
681 let data = [
682 0x90, 0x2d, 0xd0, 0x26, 0xdf, 0x89, 0xbb, 0x7e, 0x3a, 0xd6, 0xc6, 0x96, 0x73, 0xe9,
683 0x9d, 0xc9, 0x2a, 0x77, 0x82, 0xa9, 0xe6, 0x4b, 0x53, 0xcc, 0x83, 0x80, 0x4a, 0xf3,
684 0xcd, 0xe3, 0x50, 0x4e, 0x45, 0x4a, 0x3a, 0x42, 0x00, 0x4b, 0x4d, 0xbe, 0x4c, 0x88,
685 0x24, 0xf2, 0x4b, 0x6b, 0xbd, 0x79, 0xeb, 0x74, 0xbc, 0xe8, 0x7d, 0xff, 0x4b, 0x3d,
686 0xa7, 0xd6, 0x0d, 0xef, 0x9c, 0x5b, 0xb3, 0xec, 0x94, 0x97, 0xcc, 0x8b, 0x41, 0xe1,
687 0x9c, 0xcc, 0x1a, 0x03, 0x58, 0xc4, 0xfb, 0xd0, 0xc0, 0x10, 0xe2, 0xa0, 0xc9, 0xac,
688 0xa7, 0xbb, 0x50, 0xf6, 0x5c, 0x87, 0x68, 0x0f, 0x42, 0x93, 0x3f, 0x2e, 0x28, 0x28,
689 0x76, 0x83, 0x9b, 0xeb, 0x12, 0xe0, 0x4f, 0xc5, 0xb0, 0x8d, 0x14, 0xda, 0x3b, 0xdf,
690 0xd3, 0x4b, 0x80, 0xd1, 0xfc, 0x87, 0x85, 0xae, 0x54, 0xc7, 0x45, 0xc9, 0x38, 0x43,
691 0xa7, 0x9f, 0xdd, 0xa9, 0x71, 0xa7, 0x52, 0x36, 0x82, 0xff, 0x49, 0x55, 0xdb, 0x84,
692 0xc2, 0x95, 0xad, 0x45, 0x80, 0xc6, 0x02, 0x80, 0xf8, 0xfc, 0x86, 0x79, 0xae, 0xb9,
693 0x57, 0xe7, 0x3b, 0x33, 0x64, 0xa8,
694 ];
695 let data_u32 = unsafe { data.align_to::<u32>().1 };
696
697 for i in 0..data.len() {
698 let mut reader = BufBitReader::<LE, _>::new(MemWordReader::new(&data_u32));
699 let mut buffer = vec![0; i];
700 assert_eq!(reader.read(&mut buffer).unwrap(), i);
701 assert_eq!(&buffer, &data[..i]);
702
703 let mut reader = BufBitReader::<BE, _>::new(MemWordReader::new(&data_u32));
704 let mut buffer = vec![0; i];
705 assert_eq!(reader.read(&mut buffer).unwrap(), i);
706 assert_eq!(&buffer, &data[..i]);
707 }
708 }
709
710 macro_rules! test_buf_bit_reader {
711 ($f: ident, $word:ty) => {
712 #[test]
713 fn $f() -> Result<(), Box<dyn Error + Send + Sync + 'static>> {
714 #[allow(unused_imports)]
715 use crate::{
716 codes::{GammaRead, GammaWrite},
717 prelude::{
718 len_delta, len_gamma, BufBitWriter, DeltaRead, DeltaWrite, MemWordReader,
719 },
720 };
721 use rand::Rng;
722 use rand::{rngs::SmallRng, SeedableRng};
723
724 let mut buffer_be: Vec<$word> = vec![];
725 let mut buffer_le: Vec<$word> = vec![];
726 let mut big = BufBitWriter::<BE, _>::new(MemWordWriterVec::new(&mut buffer_be));
727 let mut little = BufBitWriter::<LE, _>::new(MemWordWriterVec::new(&mut buffer_le));
728
729 let mut r = SmallRng::seed_from_u64(0);
730 const ITER: usize = 1_000_000;
731
732 for _ in 0..ITER {
733 let value = r.random_range(0..128);
734 assert_eq!(big.write_gamma(value)?, len_gamma(value));
735 let value = r.random_range(0..128);
736 assert_eq!(little.write_gamma(value)?, len_gamma(value));
737 let value = r.random_range(0..128);
738 assert_eq!(big.write_gamma(value)?, len_gamma(value));
739 let value = r.random_range(0..128);
740 assert_eq!(little.write_gamma(value)?, len_gamma(value));
741 let value = r.random_range(0..128);
742 assert_eq!(big.write_delta(value)?, len_delta(value));
743 let value = r.random_range(0..128);
744 assert_eq!(little.write_delta(value)?, len_delta(value));
745 let value = r.random_range(0..128);
746 assert_eq!(big.write_delta(value)?, len_delta(value));
747 let value = r.random_range(0..128);
748 assert_eq!(little.write_delta(value)?, len_delta(value));
749 let n_bits = r.random_range(0..=64);
750 if n_bits == 0 {
751 big.write_bits(0, 0)?;
752 } else {
753 big.write_bits(1, n_bits)?;
754 }
755 let n_bits = r.random_range(0..=64);
756 if n_bits == 0 {
757 little.write_bits(0, 0)?;
758 } else {
759 little.write_bits(1, n_bits)?;
760 }
761 let value = r.random_range(0..128);
762 assert_eq!(big.write_unary(value)?, value as usize + 1);
763 let value = r.random_range(0..128);
764 assert_eq!(little.write_unary(value)?, value as usize + 1);
765 }
766
767 drop(big);
768 drop(little);
769
770 type ReadWord = $word;
771
772 #[allow(clippy::size_of_in_element_count)] let be_trans: &[ReadWord] = unsafe {
774 core::slice::from_raw_parts(
775 buffer_be.as_ptr() as *const ReadWord,
776 buffer_be.len()
777 * (core::mem::size_of::<$word>() / core::mem::size_of::<ReadWord>()),
778 )
779 };
780
781 #[allow(clippy::size_of_in_element_count)] let le_trans: &[ReadWord] = unsafe {
783 core::slice::from_raw_parts(
784 buffer_le.as_ptr() as *const ReadWord,
785 buffer_le.len()
786 * (core::mem::size_of::<$word>() / core::mem::size_of::<ReadWord>()),
787 )
788 };
789
790 let mut big_buff = BufBitReader::<BE, _>::new(MemWordReader::new(be_trans));
791 let mut little_buff = BufBitReader::<LE, _>::new(MemWordReader::new(le_trans));
792
793 let mut r = SmallRng::seed_from_u64(0);
794
795 for _ in 0..ITER {
796 assert_eq!(big_buff.read_gamma()?, r.random_range(0..128));
797 assert_eq!(little_buff.read_gamma()?, r.random_range(0..128));
798 assert_eq!(big_buff.read_gamma()?, r.random_range(0..128));
799 assert_eq!(little_buff.read_gamma()?, r.random_range(0..128));
800 assert_eq!(big_buff.read_delta()?, r.random_range(0..128));
801 assert_eq!(little_buff.read_delta()?, r.random_range(0..128));
802 assert_eq!(big_buff.read_delta()?, r.random_range(0..128));
803 assert_eq!(little_buff.read_delta()?, r.random_range(0..128));
804 let n_bits = r.random_range(0..=64);
805 if n_bits == 0 {
806 assert_eq!(big_buff.read_bits(0)?, 0);
807 } else {
808 assert_eq!(big_buff.read_bits(n_bits)?, 1);
809 }
810 let n_bits = r.random_range(0..=64);
811 if n_bits == 0 {
812 assert_eq!(little_buff.read_bits(0)?, 0);
813 } else {
814 assert_eq!(little_buff.read_bits(n_bits)?, 1);
815 }
816
817 assert_eq!(big_buff.read_unary()?, r.random_range(0..128));
818 assert_eq!(little_buff.read_unary()?, r.random_range(0..128));
819 }
820
821 Ok(())
822 }
823 };
824 }
825
826 test_buf_bit_reader!(test_u64, u64);
827 test_buf_bit_reader!(test_u32, u32);
828
829 test_buf_bit_reader!(test_u16, u16);
830}