use super::DecodeConfig;
use super::config::DecodeResult;
use super::pool::DecodePool;
use super::scanline::ScanlineReader;
use crate::error::Result;
use enough::{Stop, Unstoppable};
pub struct DecodeRequest<'a, S: Stop = Unstoppable> {
pub(super) config: &'a DecodeConfig,
pub(super) data: &'a [u8],
pub(super) pool: Option<&'a DecodePool>,
pub(super) stop: S,
}
impl<'a> DecodeRequest<'a, Unstoppable> {
pub(super) fn new(config: &'a DecodeConfig, data: &'a [u8]) -> Self {
Self {
config,
data,
pool: None,
stop: Unstoppable,
}
}
}
impl<'a, S: Stop> DecodeRequest<'a, S> {
#[must_use]
pub fn pool(mut self, pool: &'a DecodePool) -> Self {
self.pool = Some(pool);
self
}
#[must_use]
pub fn stop<S2: Stop>(self, stop: S2) -> DecodeRequest<'a, S2> {
DecodeRequest {
config: self.config,
data: self.data,
pool: self.pool,
stop,
}
}
pub fn decode(self) -> Result<DecodeResult> {
let guard = self.pool.map(DecodePool::acquire);
let mut config = self.config.clone();
if let Some(ref g) = guard {
config.num_threads = g.num_threads;
}
config.decode(self.data, self.stop)
}
pub fn scanline_reader(self) -> Result<ScanlineReader<'a>> {
let guard = self.pool.map(DecodePool::acquire);
let mut config = self.config.clone();
if let Some(ref g) = guard {
config.num_threads = g.num_threads;
}
let mut reader = config.scanline_reader(self.data)?;
reader.pool_guard = guard;
Ok(reader)
}
}