use crate::write::{XzDecoder, XzEncoder};
use std::io;
use std::io::Write;
pub struct AutoFinishXzEncoder<W: Write>(pub(super) XzEncoder<W>);
impl<W: Write> AutoFinishXzEncoder<W> {
#[inline]
pub fn get_ref(&self) -> &W {
self.0.get_ref()
}
#[inline]
pub fn get_mut(&mut self) -> &mut W {
self.0.get_mut()
}
#[inline]
pub fn try_finish(&mut self) -> io::Result<()> {
self.0.try_finish()
}
#[inline]
pub fn finish(mut self) -> io::Result<W> {
self.try_finish()?;
Ok(self.0.obj.take().unwrap())
}
#[inline]
pub fn total_out(&self) -> u64 {
self.0.total_out()
}
#[inline]
pub fn total_in(&self) -> u64 {
self.0.total_out()
}
}
impl<W: Write> Write for AutoFinishXzEncoder<W> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.0.flush()
}
}
impl<W: Write> Drop for AutoFinishXzEncoder<W> {
#[inline]
fn drop(&mut self) {
if self.0.obj.is_some() {
let _ = self.0.try_finish();
}
}
}
pub struct AutoFinishXzDecoder<W: Write>(pub(super) XzDecoder<W>);
impl<W: Write> AutoFinishXzDecoder<W> {
#[inline]
pub fn get_ref(&self) -> &W {
self.0.get_ref()
}
#[inline]
pub fn get_mut(&mut self) -> &mut W {
self.0.get_mut()
}
#[inline]
pub fn try_finish(&mut self) -> io::Result<()> {
self.0.try_finish()
}
#[inline]
pub fn finish(mut self) -> io::Result<W> {
self.try_finish()?;
Ok(self.0.obj.take().unwrap())
}
#[inline]
pub fn total_out(&self) -> u64 {
self.0.total_out()
}
#[inline]
pub fn total_in(&self) -> u64 {
self.0.total_in()
}
}
impl<W: Write> Write for AutoFinishXzDecoder<W> {
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
self.0.write(buf)
}
fn flush(&mut self) -> io::Result<()> {
self.0.flush()
}
}
impl<W: Write> Drop for AutoFinishXzDecoder<W> {
#[inline]
fn drop(&mut self) {
if self.0.obj.is_some() {
let _ = self.0.try_finish();
}
}
}