1use crate::prelude::*;
9use crate::traits::*;
10#[cfg(feature = "mem_dbg")]
11use mem_dbg::{MemDbg, MemSize};
12
13#[derive(Debug, Clone)]
16#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
17pub struct DbgBitReader<E: Endianness, R> {
18 reader: R,
19 _marker: core::marker::PhantomData<E>,
20}
21
22impl<E: Endianness, R> DbgBitReader<E, R> {
23 pub fn new(cr: R) -> Self {
24 Self {
25 reader: cr,
26 _marker: Default::default(),
27 }
28 }
29}
30
31impl<E: Endianness, R: BitRead<E>> BitRead<E> for DbgBitReader<E, R>
32where
33 R::PeekWord: core::fmt::Display,
34{
35 type Error = R::Error;
36 type PeekWord = R::PeekWord;
37
38 fn peek_bits(&mut self, n_bits: usize) -> Result<Self::PeekWord, Self::Error> {
39 let value = self.reader.peek_bits(n_bits)?;
40 #[cfg(feature = "std")]
41 eprintln!("peek_bits({}): {}", n_bits, value);
42 Ok(value)
43 }
44
45 fn skip_bits(&mut self, n_bits: usize) -> Result<(), Self::Error> {
46 #[cfg(feature = "std")]
47 eprintln!("skip_bits({})", n_bits);
48 self.reader.skip_bits(n_bits)
49 }
50
51 fn read_bits(&mut self, n_bits: usize) -> Result<u64, Self::Error> {
52 let value = self.reader.read_bits(n_bits)?;
53 #[cfg(feature = "std")]
54 eprintln!("read_bits({}): {}", n_bits, value);
55 Ok(value)
56 }
57
58 fn read_unary(&mut self) -> Result<u64, Self::Error> {
59 let value = self.reader.read_unary()?;
60 #[cfg(feature = "std")]
61 eprintln!("{{U:{}}}", value);
62 Ok(value)
63 }
64
65 fn skip_bits_after_peek(&mut self, n: usize) {
66 self.reader.skip_bits_after_peek(n)
67 }
68}
69
70impl<E: Endianness, R: GammaRead<E>> GammaRead<E> for DbgBitReader<E, R>
71where
72 R::PeekWord: core::fmt::Display,
73{
74 fn read_gamma(&mut self) -> Result<u64, R::Error> {
75 let value = self.reader.read_gamma()?;
76 #[cfg(feature = "std")]
77 eprintln!("{{g:{}}}", value);
78 Ok(value)
79 }
80}
81
82impl<E: Endianness, R: DeltaRead<E>> DeltaRead<E> for DbgBitReader<E, R>
83where
84 R::PeekWord: core::fmt::Display,
85{
86 fn read_delta(&mut self) -> Result<u64, R::Error> {
87 let value = self.reader.read_delta()?;
88 #[cfg(feature = "std")]
89 eprintln!("{{d:{}}}", value);
90 Ok(value)
91 }
92}
93
94impl<E: Endianness, R: ZetaRead<E>> ZetaRead<E> for DbgBitReader<E, R>
95where
96 R::PeekWord: core::fmt::Display,
97{
98 fn read_zeta3(&mut self) -> Result<u64, R::Error> {
99 let value = self.reader.read_zeta3()?;
100 #[cfg(feature = "std")]
101 eprintln!("{{z3:{}}}", value);
102 Ok(value)
103 }
104
105 fn read_zeta(&mut self, k: usize) -> Result<u64, R::Error> {
106 let value = self.reader.read_zeta(k)?;
107 #[cfg(feature = "std")]
108 eprintln!("{{z{}:{}}}", k, value);
109 Ok(value)
110 }
111}
112
113#[derive(Debug, Clone)]
116#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
117pub struct DbgBitWriter<E: Endianness, W> {
118 writer: W,
119 _marker: core::marker::PhantomData<E>,
120}
121
122impl<E: Endianness, W> DbgBitWriter<E, W> {
123 pub fn new(cw: W) -> Self {
124 Self {
125 writer: cw,
126 _marker: Default::default(),
127 }
128 }
129}
130
131impl<E: Endianness, W: BitWrite<E>> BitWrite<E> for DbgBitWriter<E, W> {
132 type Error = W::Error;
133
134 fn write_bits(&mut self, value: u64, n_bits: usize) -> Result<usize, Self::Error> {
135 #[cfg(feature = "std")]
136 eprintln!("write_bits({}, {})", value, n_bits);
137 self.writer.write_bits(value, n_bits)
138 }
139
140 fn write_unary(&mut self, value: u64) -> Result<usize, Self::Error> {
141 #[cfg(feature = "std")]
142 eprintln!("{{U:{}}}", value);
143 self.writer.write_unary(value)
144 }
145
146 fn flush(&mut self) -> Result<usize, Self::Error> {
147 self.writer.flush()
148 }
149}
150
151impl<E: Endianness, W: GammaWrite<E>> GammaWrite<E> for DbgBitWriter<E, W> {
152 fn write_gamma(&mut self, value: u64) -> Result<usize, W::Error> {
153 #[cfg(feature = "std")]
154 eprintln!("{{g:{}}}", value);
155 self.writer.write_gamma(value)
156 }
157}
158
159impl<E: Endianness, W: DeltaWrite<E>> DeltaWrite<E> for DbgBitWriter<E, W> {
160 fn write_delta(&mut self, value: u64) -> Result<usize, W::Error> {
161 #[cfg(feature = "std")]
162 eprintln!("{{d:{}}}", value);
163 self.writer.write_delta(value)
164 }
165}
166
167impl<E: Endianness, W: ZetaWrite<E>> ZetaWrite<E> for DbgBitWriter<E, W> {
168 fn write_zeta(&mut self, value: u64, k: usize) -> Result<usize, W::Error> {
169 #[cfg(feature = "std")]
170 eprintln!("{{z{}:{}}}", value, k);
171 self.writer.write_zeta(value, k)
172 }
173 fn write_zeta3(&mut self, value: u64) -> Result<usize, W::Error> {
174 #[cfg(feature = "std")]
175 eprintln!("{{z3:{}}}", value);
176 self.writer.write_zeta3(value)
177 }
178}