use core::task::Waker;
#[derive(Debug)]
pub(crate) struct ReadinessArray<const N: usize> {
count: usize,
readiness_list: [bool; N],
parent_waker: Option<Waker>,
}
impl<const N: usize> ReadinessArray<N> {
pub(crate) fn new() -> Self {
Self {
count: N,
readiness_list: [true; N], parent_waker: None,
}
}
pub(crate) fn set_ready(&mut self, id: usize) -> bool {
if !self.readiness_list[id] {
self.count += 1;
self.readiness_list[id] = true;
false
} else {
true
}
}
pub(crate) fn set_all_ready(&mut self) {
self.readiness_list.fill(true);
self.count = N;
}
pub(crate) fn clear_ready(&mut self, id: usize) -> bool {
if self.readiness_list[id] {
self.count -= 1;
self.readiness_list[id] = false;
true
} else {
false
}
}
pub(crate) fn any_ready(&self) -> bool {
self.count > 0
}
#[inline]
pub(crate) fn parent_waker(&self) -> Option<&Waker> {
self.parent_waker.as_ref()
}
pub(crate) fn set_waker(&mut self, parent_waker: &Waker) {
match &mut self.parent_waker {
Some(prev) => prev.clone_from(parent_waker),
None => self.parent_waker = Some(parent_waker.clone()),
}
}
}