use super::FillMode;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimingPhase {
BeforeStart,
Active,
AfterEnd,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum TimingSampleState {
BeforeStart,
Active,
AfterEnd,
BackwardsFill,
ForwardsFill,
}
impl TimingSampleState {
#[must_use]
pub const fn has_sample(self) -> bool {
matches!(
self,
Self::Active | Self::BackwardsFill | Self::ForwardsFill
)
}
#[must_use]
pub const fn is_filled(self) -> bool {
matches!(self, Self::BackwardsFill | Self::ForwardsFill)
}
}
#[derive(Debug, Clone, Copy, PartialEq)]
pub struct NormalizedTiming {
pub phase: TimingPhase,
pub sample_state: TimingSampleState,
pub current_iteration_index: Option<u32>,
pub completed_iterations: u32,
pub iteration_progress: f64,
pub active_progress: f64,
}
impl NormalizedTiming {
pub(crate) fn before_start(fill_mode: FillMode, iteration_progress: f64) -> Self {
let sample_state = if fill_mode.fills_before_start() {
TimingSampleState::BackwardsFill
} else {
TimingSampleState::BeforeStart
};
Self {
phase: TimingPhase::BeforeStart,
sample_state,
current_iteration_index: None,
completed_iterations: 0,
iteration_progress,
active_progress: 0.0,
}
}
pub(crate) fn active(
current_iteration_index: u32,
iteration_progress: f64,
active_progress: f64,
) -> Self {
Self {
phase: TimingPhase::Active,
sample_state: TimingSampleState::Active,
current_iteration_index: Some(current_iteration_index),
completed_iterations: current_iteration_index,
iteration_progress,
active_progress,
}
}
pub(crate) fn after_end(
iteration_count: u32,
fill_mode: FillMode,
iteration_progress: f64,
) -> Self {
let sample_state = if fill_mode.fills_after_end() {
TimingSampleState::ForwardsFill
} else {
TimingSampleState::AfterEnd
};
Self {
phase: TimingPhase::AfterEnd,
sample_state,
current_iteration_index: None,
completed_iterations: iteration_count,
iteration_progress,
active_progress: f64::from(iteration_count),
}
}
#[must_use]
pub const fn has_sample(self) -> bool {
self.sample_state.has_sample()
}
#[must_use]
pub const fn is_filled(self) -> bool {
self.sample_state.is_filled()
}
}