use core::ops::{Deref, DerefMut};
use core::task::Waker;
#[derive(Debug)]
pub(crate) struct ReadinessVec {
parent_waker: Option<Waker>,
}
impl ReadinessVec {
pub(crate) fn new() -> Self {
Self { parent_waker: None }
}
pub(crate) fn set_ready(&mut self, _id: usize) -> bool {
false
}
pub(crate) fn set_all_ready(&mut self) {}
pub(crate) fn clear_ready(&mut self, _id: usize) -> bool {
true
}
pub(crate) fn any_ready(&self) -> bool {
true
}
#[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()),
}
}
pub(crate) fn resize(&mut self, _len: usize) {}
}
pub(crate) struct ReadinessVecRef<'a> {
inner: &'a mut ReadinessVec,
}
impl<'a> Deref for ReadinessVecRef<'a> {
type Target = ReadinessVec;
fn deref(&self) -> &Self::Target {
self.inner
}
}
impl<'a> DerefMut for ReadinessVecRef<'a> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.inner
}
}
pub(crate) struct WakerVec {
readiness: ReadinessVec,
}
impl Default for WakerVec {
fn default() -> Self {
Self::new(0)
}
}
impl WakerVec {
pub(crate) fn new(_len: usize) -> Self {
let readiness = ReadinessVec::new();
Self { readiness }
}
pub(crate) fn get(&self, _index: usize) -> Option<&Waker> {
self.readiness.parent_waker()
}
pub(crate) fn readiness(&mut self) -> ReadinessVecRef<'_> {
ReadinessVecRef {
inner: &mut self.readiness,
}
}
pub(crate) fn resize(&mut self, len: usize) {
self.readiness.resize(len);
}
}