use super::{
convert_state::ConvertState,
pending_encode_step::PendingEncodeStep,
pending_value::PendingValue,
};
use crate::{
CapacityError,
Codec,
TranscodeEncodeEngine,
TranscodeEncodeHooks,
TranscodeProgress,
};
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
pub(in crate::transcode) struct PendingValueSlot<Value> {
value: Option<PendingValue<Value>>,
}
impl<Value> PendingValueSlot<Value> {
#[must_use]
#[inline(always)]
pub(in crate::transcode) const fn empty() -> Self {
Self { value: None }
}
#[must_use = "capacity planning can fail on overflow"]
#[inline]
pub(in crate::transcode) fn max_output_len<E, H>(
&self,
engine: &TranscodeEncodeEngine<E, H>,
) -> Result<usize, CapacityError>
where
E: Codec<Value = Value>,
H: TranscodeEncodeHooks<E>,
{
if self.value.is_some() {
engine.max_output_len(1)
} else {
Ok(0)
}
}
#[inline(always)]
pub(in crate::transcode) fn clear(&mut self) {
self.value = None;
}
#[inline(always)]
pub(in crate::transcode) fn take(&mut self) -> Option<PendingValue<Value>> {
self.value.take()
}
#[inline]
pub(in crate::transcode) fn apply_pending_encode_step<Input, Output>(
&mut self,
step: PendingEncodeStep<Value>,
state: &mut ConvertState<'_, Input, Output>,
) -> Option<TranscodeProgress> {
match step {
PendingEncodeStep::Written { written } => {
state.advance_output(written);
None
}
PendingEncodeStep::NeedOutput {
pending,
additional,
available,
} => {
self.value = Some(pending);
Some(state.need_output_progress(additional, available))
}
}
}
}