use qubit_cas::FastCasState;
use super::task_status::TaskStatus;
use super::task_status_event::TaskStatusEvent;
use super::task_status_machine::TASK_STATUS_MACHINE;
pub(crate) struct AtomicTaskStatus {
value: FastCasState,
}
impl AtomicTaskStatus {
#[inline]
pub(crate) fn new(status: TaskStatus) -> Self {
Self {
value: FastCasState::new(status.as_usize()),
}
}
#[inline]
pub(crate) fn load(&self) -> TaskStatus {
TaskStatus::from_usize(self.value.load())
}
#[inline]
pub(crate) fn try_start(&self) -> bool {
self.try_transition(TaskStatusEvent::Start)
}
#[inline]
pub(crate) fn try_cancel_pending(&self) -> bool {
self.try_transition(TaskStatusEvent::CancelPending)
}
#[inline]
pub(crate) fn try_complete(&self, status: TaskStatus) -> bool {
let Some(event) = TaskStatusEvent::from_completion_status(status) else {
return false;
};
self.try_transition(event)
}
#[inline]
pub(crate) fn try_drop_unfinished(&self) -> bool {
self.try_transition(TaskStatusEvent::DropUnfinished)
}
#[inline]
fn try_transition(&self, event: TaskStatusEvent) -> bool {
TASK_STATUS_MACHINE.try_trigger(&self.value, event.as_usize())
}
}