use crate::record::task::TaskRecord;
use crate::runtime::{RuntimeState, StoredTask};
use crate::types::{TaskId, Time};
use smallvec::SmallVec;
pub trait RuntimeStateBacking {
fn task(&self, task_id: TaskId) -> Option<&TaskRecord>;
fn task_mut(&mut self, task_id: TaskId) -> Option<&mut TaskRecord>;
fn task_completed(&mut self, task_id: TaskId) -> SmallVec<[TaskId; 4]>;
fn store_spawned_task(&mut self, task_id: TaskId, stored: StoredTask);
fn remove_stored_future(&mut self, task_id: TaskId) -> Option<StoredTask>;
fn drain_ready_async_finalizers(&mut self) -> SmallVec<[(TaskId, u8); 2]>;
fn current_time(&self) -> Time;
}
impl RuntimeStateBacking for RuntimeState {
#[inline]
fn task(&self, task_id: TaskId) -> Option<&TaskRecord> {
RuntimeState::task(self, task_id)
}
#[inline]
fn task_mut(&mut self, task_id: TaskId) -> Option<&mut TaskRecord> {
RuntimeState::task_mut(self, task_id)
}
#[inline]
fn task_completed(&mut self, task_id: TaskId) -> SmallVec<[TaskId; 4]> {
RuntimeState::task_completed(self, task_id)
}
#[inline]
fn store_spawned_task(&mut self, task_id: TaskId, stored: StoredTask) {
RuntimeState::store_spawned_task(self, task_id, stored);
}
#[inline]
fn remove_stored_future(&mut self, task_id: TaskId) -> Option<StoredTask> {
RuntimeState::remove_stored_future(self, task_id)
}
#[inline]
fn drain_ready_async_finalizers(&mut self) -> SmallVec<[(TaskId, u8); 2]> {
RuntimeState::drain_ready_async_finalizers(self)
}
#[inline]
fn current_time(&self) -> Time {
self.now
}
}
#[cfg(test)]
#[allow(clippy::pedantic, clippy::nursery)]
mod tests {
use super::*;
use crate::types::Budget;
#[test]
fn unified_runtime_state_implements_backing_trait() {
let mut state = RuntimeState::new();
let _root = state.create_root_region(Budget::INFINITE);
fn assert_impl<B: RuntimeStateBacking>(_b: &B) {}
assert_impl(&state);
let now_via_trait = RuntimeStateBacking::current_time(&state);
assert_eq!(now_via_trait, state.now);
}
#[test]
fn drain_ready_async_finalizers_via_trait_matches_direct() {
let mut state = RuntimeState::new();
let trait_drained: SmallVec<[(TaskId, u8); 2]> =
RuntimeStateBacking::drain_ready_async_finalizers(&mut state);
assert!(trait_drained.is_empty());
let direct_drained = state.drain_ready_async_finalizers();
assert!(direct_drained.is_empty());
}
}