use crate::ring::{RingBox, RingLzWriter, RingReader};
use super::constants::*;
use super::decoder::LzfseDecoder;
use super::reader_core::ReaderCore;
use std::fmt;
use std::io::{self, Read, Write};
pub struct LzfseRingDecoder {
core: LzfseDecoder,
input: RingBox<Input>,
output: RingBox<Output>,
}
impl LzfseRingDecoder {
pub fn decode<I: Read, O: Write>(
&mut self,
reader: &mut I,
writer: &mut O,
) -> crate::Result<(u64, u64)> {
let mut dst = RingLzWriter::new((&mut self.output).into(), writer);
let mut src = RingReader::new((&mut self.input).into(), reader);
let n = self.core.execute(&mut dst, &mut src)?;
dst.into_inner()?;
Ok(n)
}
pub fn decode_bytes(&mut self, src: &[u8], dst: &mut Vec<u8>) -> crate::Result<u64> {
self.core.decode_bytes(src, dst)
}
pub fn reader<I: Read>(&mut self, inner: I) -> LzfseReader<I> {
let dst = RingLzWriter::new((&mut self.output).into(), io::sink());
let src = RingReader::new((&mut self.input).into(), inner);
LzfseReader(ReaderCore::new(dst, src, &mut self.core.fse_core))
}
pub fn reader_bytes<'a>(&'a mut self, bytes: &'a [u8]) -> LzfseReaderBytes {
let dst = RingLzWriter::new((&mut self.output).into(), io::sink());
LzfseReaderBytes(ReaderCore::new(dst, bytes, &mut self.core.fse_core))
}
}
impl Default for LzfseRingDecoder {
fn default() -> Self {
Self {
core: LzfseDecoder::default(),
input: RingBox::default(),
output: RingBox::default(),
}
}
}
impl AsMut<LzfseDecoder> for LzfseRingDecoder {
#[inline(always)]
fn as_mut(&mut self) -> &mut LzfseDecoder {
&mut self.core
}
}
impl fmt::Debug for LzfseRingDecoder {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_struct("LzfseRingDecoder").finish()
}
}
pub struct LzfseReader<'a, I: Read>(ReaderCore<'a, RingReader<'a, I, Input>>);
impl<'a, I: Read> LzfseReader<'a, I> {
pub fn into_inner(self) -> I {
self.0.into_inner().into_inner()
}
}
impl<'a, I: Read> fmt::Debug for LzfseReader<'a, I> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("LzfseReader").finish()
}
}
impl<'a, I: Read> Read for LzfseReader<'a, I> {
#[inline(always)]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.0.read(buf)
}
}
pub struct LzfseReaderBytes<'a>(ReaderCore<'a, &'a [u8]>);
impl<'a> Read for LzfseReaderBytes<'a> {
#[inline(always)]
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
self.0.read(buf)
}
}
impl<'a> fmt::Debug for LzfseReaderBytes<'a> {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.debug_tuple("LzfseReaderBytes").finish()
}
}