1macro_rules! algos {
2 (@algo $algo:ident [$algo_s:expr] $decoder:ident $encoder:ident <$inner:ident>
3 { @enc $($encoder_methods:tt)* }
4 { @dec $($decoder_methods:tt)* }
5 ) => {
6 #[cfg(feature = $algo_s)]
7 decoder! {
8 #[doc = concat!("A ", $algo_s, " decoder, or decompressor")]
9 #[cfg(feature = $algo_s)]
10 $decoder<$inner>
11
12 { $($decoder_methods)* }
13 }
14
15 #[cfg(feature = $algo_s)]
16 encoder! {
17 #[doc = concat!("A ", $algo_s, " encoder, or compressor.")]
18 #[cfg(feature = $algo_s)]
19 $encoder<$inner> {
20 pub fn new(inner: $inner) -> Self {
21 Self::with_quality(inner, crate::Level::Default)
22 }
23 }
24
25 { $($encoder_methods)* }
26 }
27 };
28
29 (@algo $algo:ident [$algo_s:expr] $decoder:ident $encoder:ident <$inner:ident>
30 { @dec $($decoder_methods:tt)* }
31 ) => {
32 #[cfg(feature = $algo_s)]
33 decoder! {
34 #[doc = concat!("A ", $algo_s, " decoder, or decompressor")]
35 #[cfg(feature = $algo_s)]
36 $decoder<$inner>
37
38 { $($decoder_methods)* }
39 }
40 };
41
42 ($($mod:ident)::+ <$inner:ident>) => {
43 algos!(@algo brotli ["brotli"] BrotliDecoder BrotliEncoder <$inner>
44 { @enc
45 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
46 let params = brotli::enc::backward_references::BrotliEncoderParams::default();
47
48 Self {
49 inner: crate::$($mod::)+generic::Encoder::new(
50 inner,
51 crate::codec::BrotliEncoder::new(level.into_brotli(params)),
52 ),
53 }
54 }
55
56 pub fn with_quality_and_params(
59 inner: $inner,
60 level: crate::Level,
61 params: crate::brotli::EncoderParams,
62 ) -> Self {
63 let params = level.into_brotli(params.as_brotli());
64
65 Self {
66 inner: crate::$($mod::)+generic::Encoder::new(
67 inner,
68 crate::codec::BrotliEncoder::new(params),
69 ),
70 }
71 }
72 }
73 { @dec }
74 );
75
76 algos!(@algo bzip2 ["bzip2"] BzDecoder BzEncoder <$inner>
77 { @enc
78
79 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
80 Self {
81 inner: crate::$($mod::)+generic::Encoder::new(
82 inner,
83 crate::codec::BzEncoder::new(level.into_bzip2(), 0),
84 ),
85 }
86 }
87 }
88 { @dec }
89 );
90
91 algos!(@algo deflate ["deflate"] DeflateDecoder DeflateEncoder <$inner>
92 { @enc
93 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
94 Self {
95 inner: crate::$($mod::)+generic::Encoder::new(
96 inner,
97 crate::codec::DeflateEncoder::new(level.into_flate2()),
98 ),
99 }
100 }
101
102 pub fn total_in(&self) -> u64 {
104 self.inner.get_encoder_ref().get_ref().get_ref().total_in()
105 }
106
107 pub fn total_out(&self) -> u64 {
109 self.inner.get_encoder_ref().get_ref().get_ref().total_out()
110 }
111 }
112 { @dec }
113 );
114
115 algos!(@algo deflate ["deflate64"] Deflate64Decoder Deflate64Encoder <$inner>
116 { @dec }
117 );
118
119 algos!(@algo gzip ["gzip"] GzipDecoder GzipEncoder <$inner>
120 { @enc
121
122 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
123 Self {
124 inner: crate::$($mod::)+generic::Encoder::new(
125 inner,
126 crate::codec::GzipEncoder::new(level.into_flate2()),
127 ),
128 }
129 }
130 }
131 { @dec }
132 );
133
134 algos!(@algo zlib ["zlib"] ZlibDecoder ZlibEncoder <$inner>
135 { @enc
136 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
137 Self {
138 inner: crate::$($mod::)+generic::Encoder::new(
139 inner,
140 crate::codec::ZlibEncoder::new(level.into_flate2()),
141 ),
142 }
143 }
144
145 pub fn total_in(&self) -> u64 {
147 self.inner.get_encoder_ref().get_ref().get_ref().total_in()
148 }
149
150 pub fn total_out(&self) -> u64 {
152 self.inner.get_encoder_ref().get_ref().get_ref().total_out()
153 }
154 }
155 { @dec }
156 );
157
158 algos!(@algo zstd ["zstd"] ZstdDecoder ZstdEncoder <$inner>
159 { @enc
160
161 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
162 Self {
163 inner: crate::$($mod::)+generic::Encoder::new(
164 inner,
165 crate::codec::ZstdEncoder::new(level.into_zstd()),
166 ),
167 }
168 }
169
170 pub fn with_quality_and_params(inner: $inner, level: crate::Level, params: &[crate::zstd::CParameter]) -> Self {
183 Self {
184 inner: crate::$($mod::)+generic::Encoder::new(
185 inner,
186 crate::codec::ZstdEncoder::new_with_params(level.into_zstd(), params),
187 ),
188 }
189 }
190
191 pub fn with_dict(inner: $inner, level: crate::Level, dictionary: &[u8]) -> ::std::io::Result<Self> {
202 Ok(Self {
203 inner: crate::$($mod::)+generic::Encoder::new(
204 inner,
205 crate::codec::ZstdEncoder::new_with_dict(level.into_zstd(), dictionary)?,
206 ),
207 })
208 }
209 }
210 { @dec
211 pub fn with_params(inner: $inner, params: &[crate::zstd::DParameter]) -> Self {
214 Self {
215 inner: crate::$($mod::)+generic::Decoder::new(
216 inner,
217 crate::codec::ZstdDecoder::new_with_params(params),
218 ),
219 }
220 }
221
222 pub fn with_dict(inner: $inner, dictionary: &[u8]) -> ::std::io::Result<Self> {
234 Ok(Self {
235 inner: crate::$($mod::)+generic::Decoder::new(
236 inner,
237 crate::codec::ZstdDecoder::new_with_dict(dictionary)?,
238 ),
239 })
240 }
241 }
242 );
243
244 algos!(@algo xz ["xz"] XzDecoder XzEncoder <$inner>
245 { @enc
246
247 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
248 Self {
249 inner: crate::$($mod::)+generic::Encoder::new(
250 inner,
251 crate::codec::XzEncoder::new(level.into_xz2()),
252 ),
253 }
254 }
255
256 #[cfg(feature = "xz-parallel")]
260 pub fn parallel(inner: $inner, level: crate::Level, threads: std::num::NonZeroU32) -> Self {
261 Self {
262 inner: crate::$($mod::)+generic::Encoder::new(
263 inner,
264 crate::codec::XzEncoder::parallel(threads, level.into_xz2()),
265 ),
266 }
267 }
268 }
269 { @dec
270 pub fn with_mem_limit(read: $inner, memlimit: u64) -> Self {
276 Self {
277 inner: crate::$($mod::)+generic::Decoder::new(
278 read,
279 crate::codec::XzDecoder::with_memlimit(memlimit),
280 ),
281 }
282 }
283
284 #[cfg(feature = "xz-parallel")]
286 pub fn parallel(read: $inner, threads: std::num::NonZeroU32) -> Self {
287 Self {
288 inner: crate::$($mod::)+generic::Decoder::new(
289 read,
290 crate::codec::XzDecoder::parallel(threads, u64::MAX),
291 ),
292 }
293 }
294
295 #[cfg(feature = "xz-parallel")]
301 pub fn parallel_with_mem_limit(read: $inner, threads: std::num::NonZeroU32, memlimit: u64) -> Self {
302 Self {
303 inner: crate::$($mod::)+generic::Decoder::new(
304 read,
305 crate::codec::XzDecoder::parallel(threads, memlimit),
306 ),
307 }
308 }
309 }
310 );
311
312 algos!(@algo lzma ["lzma"] LzmaDecoder LzmaEncoder <$inner>
313 { @enc
314
315 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
316 Self {
317 inner: crate::$($mod::)+generic::Encoder::new(
318 inner,
319 crate::codec::LzmaEncoder::new(level.into_xz2()),
320 ),
321 }
322 }
323 }
324 { @dec
325 pub fn with_mem_limit(read: $inner, memlimit: u64) -> Self {
331 Self {
332 inner: crate::$($mod::)+generic::Decoder::new(
333 read,
334 crate::codec::LzmaDecoder::with_memlimit(memlimit),
335 ),
336 }
337 }
338
339 }
340 );
341
342 algos!(@algo lz4 ["lz4"] Lz4Decoder Lz4Encoder <$inner>
343 { @enc
344
345 pub fn with_quality(inner: $inner, level: crate::Level) -> Self {
346 Self::with_quality_and_params(inner, level, crate::lz4::EncoderParams::default())
347 }
348
349 pub fn with_quality_and_params(
352 inner: $inner,
353 level: crate::Level,
354 params: crate::lz4::EncoderParams,
355 ) -> Self {
356 let encoder = crate::codec::Lz4Encoder::new(level.into_lz4(params.as_lz4()));
357 let cap = encoder.buffer_size();
358 Self {
359 inner: crate::$($mod::)+generic::Encoder::with_capacity(
360 inner,
361 encoder,
362 cap,
363 ),
364 }
365 }
366 }
367 { @dec }
368 );
369
370 }
371}