#[cfg(debug_assertions)]
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
pub(crate) enum LifecyclePhase {
#[default]
Fresh,
Streaming,
Finished,
}
#[cfg(debug_assertions)]
#[derive(Debug, Default)]
pub(crate) struct LifecycleGuard {
phase: LifecyclePhase,
}
#[cfg(not(debug_assertions))]
#[derive(Debug, Default)]
pub(crate) struct LifecycleGuard;
impl LifecycleGuard {
#[inline(always)]
#[must_use]
pub(crate) const fn new() -> Self {
#[cfg(debug_assertions)]
{
Self {
phase: LifecyclePhase::Fresh,
}
}
#[cfg(not(debug_assertions))]
{
Self
}
}
#[inline(always)]
pub(crate) fn on_reset(&mut self) {
#[cfg(debug_assertions)]
{
self.phase = LifecyclePhase::Fresh;
}
}
#[inline(always)]
pub(crate) fn on_transcode(&mut self) {
#[cfg(debug_assertions)]
{
debug_assert_ne!(
LifecyclePhase::Finished,
self.phase,
"Transcoder::transcode called after finish without an \
intervening reset; call reset() to start a new logical \
stream",
);
if self.phase == LifecyclePhase::Fresh {
self.phase = LifecyclePhase::Streaming;
}
}
}
#[inline(always)]
pub(crate) fn on_finish_attempt(&self) {
#[cfg(debug_assertions)]
{
debug_assert_ne!(
LifecyclePhase::Finished,
self.phase,
"Transcoder::finish called twice without an intervening \
reset; the logical stream is already closed",
);
}
}
#[inline(always)]
pub(crate) fn on_finish_success(&mut self) {
#[cfg(debug_assertions)]
{
self.phase = LifecyclePhase::Finished;
}
}
}