1use crate::byteread::*;
4
5pub trait BitReadEndian {
11 fn peek_val(&mut self, n: usize) -> u64;
13 fn merge_val(msp: u64, lsp: u64, msb: usize, lsb: usize) -> u64;
15 fn build_cache(cache: u64, refill: u64, cache_size: usize) -> u64;
17 fn skip_rem(&mut self, n: usize);
19}
20
21pub trait BitReadFill {
23 fn can_refill(&self) -> bool;
25 fn fill32(&self) -> u64;
27 fn fill64(&self) -> u64;
29}
30
31pub trait BitReadInternal: BitReadEndian + BitReadFill {
33 fn left(&self) -> usize;
35 fn refill32(&mut self);
38 fn refill64(&mut self);
41
42 fn get_val(&mut self, n: usize) -> u64 {
44 let ret = self.peek_val(n);
45
46 self.skip_rem(n);
47
48 ret
49 }
50}
51
52pub trait BitRead<'a>: BitReadInternal + Copy {
54 fn new(_: &'a [u8]) -> Self;
56 fn consumed(&self) -> usize;
58 fn available(&self) -> usize;
60
61 fn skip_bits(&mut self, size: usize);
63
64 #[inline]
66 fn get_bit(&mut self) -> bool {
67 if self.left() == 0 {
68 self.refill64();
69 }
70
71 self.get_val(1) != 0
72 }
73
74 #[inline]
76 fn get_bits_64(&mut self, mut n: usize) -> u64 {
77 let mut left = 0;
78 let mut ret = 0;
79
80 if n == 0 {
81 return 0;
82 }
83
84 if self.left() < n {
85 n -= self.left();
86 left = self.left();
87 ret = self.get_val(left);
88 self.refill64();
89 }
90
91 Self::merge_val(self.get_val(n), ret, left, n)
92 }
93
94 #[inline]
96 fn get_bits_32(&mut self, n: usize) -> u32 {
97 if n == 0 {
98 return 0;
99 }
100
101 if self.left() <= n {
102 self.refill32();
103 }
104
105 self.get_val(n) as u32
106 }
107
108 #[inline]
110 fn peek_bit(&mut self) -> bool {
111 let mut tmp = *self;
112
113 tmp.get_bit()
114 }
115
116 #[inline]
118 fn peek_bits_32(&mut self, n: usize) -> u32 {
119 let mut tmp = *self;
120
121 tmp.get_bits_32(n)
122 }
123
124 #[inline]
126 fn peek_bits_64(&self, n: usize) -> u64 {
127 let mut tmp = *self;
128
129 tmp.get_bits_64(n)
130 }
131
132 #[inline]
134 fn align_bits(&mut self) {
135 let left = self.left() & 7;
136
137 self.skip_bits(left);
138 }
139}
140
141#[doc(hidden)]
142#[macro_export]
143macro_rules! endian_reader {
144 {$name: ident, $docname: expr} => {
145 #[doc = "A "]
146 #[doc = $docname]
147 #[doc = " reader."]
148 #[doc = ""]
149 #[doc = "It contains the data structures necessary to create a "]
150 #[doc = $docname]
151 #[doc = " reader."]
152 #[derive(Debug, Clone, Copy)]
153 #[allow(clippy::upper_case_acronyms)]
154 pub struct $name<'a> {
155 buffer : &'a[u8], index : usize,
157 cache : u64,
158 left : usize,
159 }
160 impl <'a> BitReadInternal for $name<'a> {
161 #[inline]
162 fn left(&self) -> usize {
163 self.left
164 }
165 #[inline]
166 fn refill32(&mut self) -> () {
167 if !self.can_refill() {
168 return;
169 }
170 let val = self.fill32();
171
172 self.cache = Self::build_cache(self.cache, val, self.left);
173
174 self.index += 4;
175 self.left += 32;
176 }
177 #[inline]
178 fn refill64(&mut self) -> () {
179 if !self.can_refill() {
180 return;
181 }
182
183 self.cache = self.fill64();
184 self.index += 8;
185 self.left = 64;
186 }
187 }
188
189 impl <'a> BitRead<'a> for $name<'a> {
190 fn new(buffer: &'a[u8]) -> $name<'a> {
191 let mut reader = $name {
192 buffer,
193 index: 0,
194 cache: 0,
195 left: 0
196 };
197
198 reader.refill64();
199 return reader;
200 }
201 #[inline]
202 fn consumed(&self) -> usize {
203 self.index * 8 - self.left
204 }
205
206 #[inline]
207 fn available(&self) -> usize {
208 (self.buffer.len() - self.index) * 8 + self.left
209 }
210
211 #[inline]
212 fn skip_bits(&mut self, mut n:usize) -> () {
213 if self.left < n {
214 n -= self.left;
215 if n > 64 {
216 let skip = n / 8;
217
218 n -= skip * 8;
219 self.index += skip;
220 }
221 self.skip_rem(n);
222 self.refill64();
223 }
224
225 self.skip_rem(n);
226 }
227
228 }
229 }
230}
231
232#[doc(hidden)]
233#[macro_export]
234macro_rules! little_endian_reader {
235 {$name: ident} => {
236 endian_reader!{ $name, "little-endian" }
237
238 impl <'a> BitReadEndian for $name<'a> {
239 #[inline]
240 fn peek_val(&mut self, n:usize) -> u64 {
241 let v = self.cache & ((1u64.checked_shl(n as u32).unwrap_or(0)).overflowing_sub(1).0);
242
243 return v;
244 }
245 #[inline]
246 fn skip_rem(&mut self, n:usize) -> () {
247 self.cache = self.cache.checked_shr(n as u32).unwrap_or(0);
248 self.left = self.left.saturating_sub(n);
249 }
250 #[inline]
251 fn merge_val(msp:u64, lsp:u64, msb:usize, _:usize) -> u64 {
252 msp << msb | lsp
253 }
254 #[inline]
255 fn build_cache(cache:u64, refill:u64, cache_size:usize) -> u64 {
256 cache | refill << cache_size
257 }
258 }
259 }
260}
261
262little_endian_reader! { BitReadLE }
263
264impl<'a> BitReadFill for BitReadLE<'a> {
265 #[inline]
266 fn can_refill(&self) -> bool {
267 self.index + 8 <= self.buffer.len()
268 }
269 #[inline(always)]
270 fn fill32(&self) -> u64 {
271 u64::from(get_u32l(&self.buffer[self.index..]))
272 }
273 #[inline(always)]
274 fn fill64(&self) -> u64 {
275 get_u64l(&self.buffer[self.index..])
276 }
277}
278
279#[doc(hidden)]
280#[macro_export]
281macro_rules! big_endian_reader {
282 {$name: ident} => {
283 endian_reader!{ $name, "big-endian" }
284
285 impl <'a> BitReadEndian for $name<'a> {
286 #[inline]
287 fn peek_val(&mut self, n:usize) -> u64 {
288 self.cache.checked_shr(64 - n as u32).unwrap_or(0)
289 }
290 #[inline]
291 fn skip_rem(&mut self, n:usize) -> () {
292 self.cache = self.cache.checked_shl(n as u32).unwrap_or(0);
293 self.left = self.left.saturating_sub(n);
294 }
295 #[inline]
296 fn merge_val(msp:u64, lsp:u64, _:usize, lsb:usize) -> u64 {
297 msp | lsp.checked_shl(lsb as u32).unwrap_or(0)
298 }
299 #[inline]
300 fn build_cache(cache:u64, refill:u64, cache_size:usize) -> u64 {
301 cache | refill << (32 - cache_size)
302 }
303 }
304 }
305}
306
307big_endian_reader! { BitReadBE }
308
309impl<'a> BitReadFill for BitReadBE<'a> {
310 #[inline]
311 fn can_refill(&self) -> bool {
312 self.index + 8 <= self.buffer.len()
313 }
314 #[inline(always)]
315 fn fill32(&self) -> u64 {
316 u64::from(get_u32b(&self.buffer[self.index..]))
317 }
318 #[inline(always)]
319 fn fill64(&self) -> u64 {
320 get_u64b(&self.buffer[self.index..])
321 }
322}
323
324#[cfg(test)]
325mod test {
326 pub const CHECKBOARD0101: [u8; 128] = [0b01010101; 128];
327 pub const CHECKBOARD0011: [u8; 128] = [0b00110011; 128];
328
329 mod le {
330 use super::super::*;
331 use super::*;
332
333 #[test]
334 fn get_bit() {
335 let b = &CHECKBOARD0101;
336 let mut reader = BitReadLE::new(b);
337
338 assert!(reader.get_bit());
339 assert!(!reader.get_bit());
340 }
341
342 #[test]
343 fn get_bits_64() {
344 let b = &CHECKBOARD0101;
345 let mut reader = BitReadLE::new(b);
346
347 assert_eq!(reader.get_bits_64(1), 1);
348 assert_eq!(reader.get_bits_64(2), 2);
349 assert_eq!(reader.get_bits_64(4), 10);
350 assert_eq!(reader.get_bits_64(1), 0);
351 assert_eq!(reader.get_bits_64(8), 85);
352 assert_eq!(reader.get_bits_64(32), 1431655765);
353 assert_eq!(reader.get_bits_64(64), 6148914691236517205);
354 }
355
356 #[test]
357 fn get_bits_64_double() {
358 let b = &CHECKBOARD0101;
359
360 let mut reader = BitReadLE::new(b);
361
362 assert_eq!(reader.get_bits_64(64), 6148914691236517205);
363 assert_eq!(reader.get_bits_64(64), 6148914691236517205);
364
365 let mut reader = BitReadLE::new(b);
366
367 assert_eq!(reader.get_bits_64(32), 1431655765);
368 assert_eq!(reader.get_bits_64(32), 1431655765);
369 assert_eq!(reader.get_bits_64(32), 1431655765);
370 assert_eq!(reader.get_bits_64(32), 1431655765);
371 }
372
373 #[test]
374 fn peek_bits_64() {
375 let reader = BitReadLE {
376 buffer: &CHECKBOARD0101,
377 index: 0,
378 cache: 0,
379 left: 0,
380 };
381
382 assert_eq!(reader.peek_bits_64(1), 1);
383 assert_eq!(reader.peek_bits_64(1), 1);
384 assert_eq!(reader.peek_bits_64(2), 1);
385 assert_eq!(reader.peek_bits_64(2), 1);
386 assert_eq!(reader.peek_bits_64(32), 1431655765);
387 assert_eq!(reader.peek_bits_64(64), 6148914691236517205);
388 }
389
390 #[test]
391 fn get_bits_32() {
392 let mut reader = BitReadLE {
393 buffer: &CHECKBOARD0101,
394 index: 0,
395 cache: 0,
396 left: 0,
397 };
398
399 assert!(reader.get_bits_32(1) == 1);
400 assert!(reader.get_bits_32(2) == 2);
401 assert!(reader.get_bits_32(4) == 10);
402 assert!(reader.get_bits_32(1) == 0);
403 assert!(reader.get_bits_32(8) == 85);
404
405 assert_eq!(reader.get_bits_32(1), 1);
406 for _ in 0..8 {
407 assert_eq!(reader.get_bits_32(8), 170);
408 }
409 }
410
411 #[test]
412 fn peek_bits_32() {
413 let b = &CHECKBOARD0101;
414 let mut reader = BitReadLE::new(b);
415
416 assert!(reader.peek_bits_32(1) == 1);
417 assert!(reader.peek_bits_32(1) == 1);
418 assert!(reader.peek_bits_32(2) == 1);
419 assert!(reader.peek_bits_32(2) == 1);
420 }
421
422 #[test]
423 fn skip_bits() {
424 let b = &CHECKBOARD0101;
425 let mut reader = BitReadLE::new(b);
426
427 reader.skip_bits(0);
428 assert!(reader.peek_bits_32(1) == 1);
429 reader.skip_bits(2);
430 assert!(reader.peek_bits_32(1) == 1);
431 reader.skip_bits(2);
432 assert!(reader.peek_bits_32(1) == 1);
433 }
434
435 #[test]
436 fn align_bits() {
437 let b = &CHECKBOARD0011;
438 let mut reader = BitReadLE::new(b);
439
440 reader.align_bits();
441 assert!(reader.get_bits_64(3) == 3);
442 reader.align_bits();
443 assert!(reader.get_bits_64(4) == 3);
444 reader.skip_bits(1);
445 reader.align_bits();
446 assert!(reader.get_bits_64(4) == 3);
447 }
448
449 #[test]
450 fn overread() {
451 let b = &CHECKBOARD0011;
452 let mut reader = BitReadLE::new(b);
453
454 reader.skip_bits(128 * 8 + 2);
455 reader.get_bits_64(6);
456 }
457 }
458 mod be {
459 use super::super::*;
460 use super::*;
461
462 #[test]
463 fn get_bit() {
464 let b = &CHECKBOARD0101;
465 let mut reader = BitReadBE::new(b);
466
467 assert!(!reader.get_bit());
468 assert!(reader.get_bit());
469 }
470
471 #[test]
472 fn get_bits_64() {
473 let b = &CHECKBOARD0101;
474 let mut reader = BitReadBE::new(b);
475
476 assert_eq!(reader.get_bits_64(1), 0);
477 assert_eq!(reader.get_bits_64(2), 2);
478 assert_eq!(reader.get_bits_64(4), 10);
479 assert_eq!(reader.get_bits_64(1), 1);
480 assert_eq!(reader.get_bits_64(8), 85);
481 assert_eq!(reader.get_bits_64(32), 1431655765);
482 assert_eq!(reader.get_bits_64(64), 6148914691236517205);
483 }
484
485 #[test]
486 fn get_bits_64_double() {
487 let b = &CHECKBOARD0101;
488
489 let mut reader = BitReadBE::new(b);
490
491 assert_eq!(reader.get_bits_64(64), 6148914691236517205);
492 assert_eq!(reader.get_bits_64(64), 6148914691236517205);
493
494 let mut reader = BitReadBE::new(b);
495
496 assert_eq!(reader.get_bits_64(32), 1431655765);
497 assert_eq!(reader.get_bits_64(32), 1431655765);
498 assert_eq!(reader.get_bits_64(32), 1431655765);
499 assert_eq!(reader.get_bits_64(32), 1431655765);
500 }
501
502 #[test]
503 fn peek_bits_64() {
504 let b = &CHECKBOARD0101;
505 let reader = BitReadBE::new(b);
506
507 assert_eq!(reader.peek_bits_64(1), 0);
508 assert_eq!(reader.peek_bits_64(1), 0);
509 assert_eq!(reader.peek_bits_64(2), 1);
510 assert_eq!(reader.peek_bits_64(2), 1);
511 assert_eq!(reader.peek_bits_64(32), 1431655765);
512 assert_eq!(reader.peek_bits_64(64), 6148914691236517205);
513 }
514
515 #[test]
516 fn get_bits_32() {
517 let b = &CHECKBOARD0101;
518 let mut reader = BitReadBE::new(b);
519
520 assert!(reader.get_bits_32(1) == 0);
521 assert!(reader.get_bits_32(2) == 2);
522 assert!(reader.get_bits_32(4) == 10);
523 assert!(reader.get_bits_32(1) == 1);
524 assert!(reader.get_bits_32(8) == 85);
525
526 assert_eq!(reader.get_bits_32(1), 0);
527 for _ in 0..8 {
528 assert_eq!(reader.get_bits_32(8), 170);
529 }
530 }
531
532 #[test]
533 fn peek_bits_32() {
534 let b = &CHECKBOARD0101;
535 let mut reader = BitReadBE::new(b);
536
537 assert!(reader.peek_bits_32(1) == 0);
538 assert!(reader.peek_bits_32(1) == 0);
539 assert!(reader.peek_bits_32(2) == 1);
540 assert!(reader.peek_bits_32(2) == 1);
541 }
542
543 #[test]
544 fn skip_bits() {
545 let b = &CHECKBOARD0101;
546 let mut reader = BitReadBE::new(b);
547
548 reader.skip_bits(0);
549 assert!(reader.peek_bits_32(1) == 0);
550 reader.skip_bits(2);
551 assert!(reader.peek_bits_32(1) == 0);
552 reader.skip_bits(2);
553 assert!(reader.peek_bits_32(1) == 0);
554 }
555
556 #[test]
557 fn align_bits() {
558 let b = &CHECKBOARD0011;
559 let mut reader = BitReadBE::new(b);
560
561 reader.align_bits();
562 assert!(reader.get_bits_64(3) == 1);
563 reader.align_bits();
564 assert!(reader.get_bits_64(4) == 3);
565 reader.skip_bits(1);
566 reader.align_bits();
567 assert!(reader.get_bits_64(4) == 3);
568 }
569
570 #[test]
571 fn overread() {
572 let b = &CHECKBOARD0011;
573 let mut reader = BitReadBE::new(b);
574
575 reader.skip_bits(128 * 8 + 2);
576 reader.get_bits_64(6);
577 }
578 }
579}