1use crate::codes::{delta::*, gamma::*, omega::*, pi::*, zeta::*};
57use crate::impls::*;
58use crate::traits::*;
59#[cfg(feature = "mem_dbg")]
60use mem_dbg::{MemDbg, MemSize};
61use num_primitive::PrimitiveNumberAs;
62
63pub trait ReadParams {}
69
70#[derive(Debug, Clone)]
76#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
77#[cfg_attr(feature = "mem_dbg", mem_size_flat)]
78pub struct DefaultReadParams;
79impl ReadParams for DefaultReadParams {}
80
81macro_rules! impl_default_read_codes {
82 ($($endianness:ident),*) => {$(
83 impl<WR: WordRead<Word: DoubleType>> GammaRead<$endianness>
84 for BufBitReader<$endianness, WR, DefaultReadParams>
85 {
86 #[inline(always)]
87 fn read_gamma(&mut self) -> Result<u64, Self::Error> {
88 self.read_gamma_param::<false>()
91 }
92 }
93
94 impl<WR: WordRead<Word: DoubleType>> DeltaRead<$endianness>
95 for BufBitReader<$endianness, WR, DefaultReadParams>
96 {
97 #[inline(always)]
98 fn read_delta(&mut self) -> Result<u64, Self::Error> {
99 if cfg!(target_arch = "aarch64") {
100 self.read_delta_param::<false, false>()
101 } else {
102 self.read_delta_param::<false, true>()
103 }
104 }
105 }
106
107 impl<WR: WordRead<Word: DoubleType>> OmegaRead<$endianness>
108 for BufBitReader<$endianness, WR, DefaultReadParams>
109 {
110 #[inline(always)]
111 fn read_omega(&mut self) -> Result<u64, Self::Error> {
112 self.read_omega_param::<true>()
113 }
114 }
115
116 impl<WR: WordRead<Word: DoubleType>> ZetaRead<$endianness>
117 for BufBitReader<$endianness, WR, DefaultReadParams>
118 {
119 #[inline(always)]
120 fn read_zeta(&mut self, k: usize) -> Result<u64, Self::Error> {
121 self.read_zeta_param(k)
122 }
123
124 #[inline(always)]
125 fn read_zeta3(&mut self) -> Result<u64, Self::Error> {
126 self.read_zeta3_param::<true>()
127 }
128 }
129
130 impl<WR: WordRead<Word: DoubleType>> PiRead<$endianness>
131 for BufBitReader<$endianness, WR, DefaultReadParams>
132 {
133 #[inline(always)]
134 fn read_pi(&mut self, k: usize) -> Result<u64, Self::Error> {
135 self.read_pi_param(k)
136 }
137
138 #[inline(always)]
139 fn read_pi2(&mut self) -> Result<u64, Self::Error> {
140 self.read_pi2_param::<false>()
141 }
142 }
143
144 impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> GammaRead<$endianness>
145 for BitReader<$endianness, WR, DefaultReadParams>
146 {
147 #[inline(always)]
148 fn read_gamma(&mut self) -> Result<u64, Self::Error> {
149 self.read_gamma_param::<true>()
150 }
151 }
152
153 impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> DeltaRead<$endianness>
154 for BitReader<$endianness, WR, DefaultReadParams>
155 {
156 #[inline(always)]
157 fn read_delta(&mut self) -> Result<u64, Self::Error> {
158 self.read_delta_param::<true, true>()
160 }
161 }
162
163 impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> OmegaRead<$endianness>
164 for BitReader<$endianness, WR, DefaultReadParams>
165 {
166 #[inline(always)]
167 fn read_omega(&mut self) -> Result<u64, Self::Error> {
168 self.read_omega_param::<true>()
169 }
170 }
171
172 impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> ZetaRead<$endianness>
173 for BitReader<$endianness, WR, DefaultReadParams>
174 {
175 #[inline(always)]
176 fn read_zeta(&mut self, k: usize) -> Result<u64, Self::Error> {
177 self.read_zeta_param(k)
178 }
179
180 #[inline(always)]
181 fn read_zeta3(&mut self) -> Result<u64, Self::Error> {
182 self.read_zeta3_param::<true>()
183 }
184 }
185
186 impl<WR: WordRead<Word = u64> + WordSeek<Error = <WR as WordRead>::Error>> PiRead<$endianness>
187 for BitReader<$endianness, WR, DefaultReadParams>
188 {
189 #[inline(always)]
190 fn read_pi(&mut self, k: usize) -> Result<u64, Self::Error> {
191 self.read_pi_param(k)
192 }
193
194 #[inline(always)]
195 fn read_pi2(&mut self) -> Result<u64, Self::Error> {
196 self.read_pi2_param::<true>()
197 }
198 }
199 )*};
200}
201
202impl_default_read_codes! {LittleEndian, BigEndian}
203
204pub trait WriteParams {}
210
211#[derive(Debug, Clone)]
217#[cfg_attr(feature = "mem_dbg", derive(MemDbg, MemSize))]
218#[cfg_attr(feature = "mem_dbg", mem_size_flat)]
219pub struct DefaultWriteParams;
220impl WriteParams for DefaultWriteParams {}
221
222macro_rules! impl_default_write_codes {
223 ($($endianness:ident),*) => {$(
224 impl<WR: WordWrite, WP: WriteParams> GammaWrite<$endianness>
225 for BufBitWriter<$endianness, WR, WP>
226 where u64: PrimitiveNumberAs<WR::Word>,
227 {
228 #[inline(always)]
229 fn write_gamma(&mut self, n: u64) -> Result<usize, Self::Error> {
230 self.write_gamma_param::<true>(n)
231 }
232 }
233
234 impl<WR: WordWrite, WP: WriteParams> DeltaWrite<$endianness>
235 for BufBitWriter<$endianness, WR, WP>
236 where u64: PrimitiveNumberAs<WR::Word>,
237 {
238 #[inline(always)]
239 fn write_delta(&mut self, n: u64) -> Result<usize, Self::Error> {
240 self.write_delta_param::<true, true>(n)
241 }
242 }
243
244 impl<WR: WordWrite, WP: WriteParams> OmegaWrite<$endianness>
245 for BufBitWriter<$endianness, WR, WP>
246 where u64: PrimitiveNumberAs<WR::Word>,
247 {
248 #[inline(always)]
249 fn write_omega(&mut self, n: u64) -> Result<usize, Self::Error> {
250 self.write_omega_param::<true>(n)
251 }
252 }
253
254 impl<WR: WordWrite, WP: WriteParams> ZetaWrite<$endianness>
255 for BufBitWriter<$endianness, WR, WP>
256 where u64: PrimitiveNumberAs<WR::Word>,
257 {
258 #[inline(always)]
259 fn write_zeta(&mut self, n: u64, k: usize) -> Result<usize, Self::Error> {
260 self.write_zeta_param(n, k)
261 }
262
263 #[inline(always)]
264 fn write_zeta3(&mut self, n: u64) -> Result<usize, Self::Error> {
265 self.write_zeta3_param::<true>(n)
266 }
267 }
268
269 impl<WR: WordWrite, WP: WriteParams> PiWrite<$endianness>
270 for BufBitWriter<$endianness, WR, WP>
271 where u64: PrimitiveNumberAs<WR::Word>,
272 {
273 #[inline(always)]
274 fn write_pi(&mut self, n: u64, k: usize) -> Result<usize, Self::Error> {
275 self.write_pi_param(n, k)
276 }
277
278 #[inline(always)]
279 fn write_pi2(&mut self, n: u64) -> Result<usize, Self::Error> {
280 self.write_pi2_param::<false>(n)
281 }
282 }
283
284 )*};
285}
286
287impl_default_write_codes! {LittleEndian, BigEndian}