1 //! This module contains backend-specific code. 2 3 use crate::mem::{CompressError, DecompressError, FlushCompress, FlushDecompress, Status}; 4 use crate::Compression; 5 6 /// Traits specifying the interface of the backends. 7 /// 8 /// Sync + Send are added as a condition to ensure they are available 9 /// for the frontend. 10 pub trait Backend: Sync + Send { total_in(&self) -> u6411 fn total_in(&self) -> u64; total_out(&self) -> u6412 fn total_out(&self) -> u64; 13 } 14 15 pub trait InflateBackend: Backend { make(zlib_header: bool, window_bits: u8) -> Self16 fn make(zlib_header: bool, window_bits: u8) -> Self; decompress( &mut self, input: &[u8], output: &mut [u8], flush: FlushDecompress, ) -> Result<Status, DecompressError>17 fn decompress( 18 &mut self, 19 input: &[u8], 20 output: &mut [u8], 21 flush: FlushDecompress, 22 ) -> Result<Status, DecompressError>; reset(&mut self, zlib_header: bool)23 fn reset(&mut self, zlib_header: bool); 24 } 25 26 pub trait DeflateBackend: Backend { make(level: Compression, zlib_header: bool, window_bits: u8) -> Self27 fn make(level: Compression, zlib_header: bool, window_bits: u8) -> Self; compress( &mut self, input: &[u8], output: &mut [u8], flush: FlushCompress, ) -> Result<Status, CompressError>28 fn compress( 29 &mut self, 30 input: &[u8], 31 output: &mut [u8], 32 flush: FlushCompress, 33 ) -> Result<Status, CompressError>; reset(&mut self)34 fn reset(&mut self); 35 } 36 37 // Default to Rust implementation unless explicitly opted in to a different backend. 38 #[cfg(feature = "any_zlib")] 39 mod c; 40 #[cfg(feature = "any_zlib")] 41 pub use self::c::*; 42 43 #[cfg(all(not(feature = "any_zlib"), feature = "miniz_oxide"))] 44 mod rust; 45 #[cfg(all(not(feature = "any_zlib"), feature = "miniz_oxide"))] 46 pub use self::rust::*; 47 48 impl std::fmt::Debug for ErrorMessage { fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result49 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { 50 self.get().fmt(f) 51 } 52 } 53