use crate::queue::FnOnceQueue;
use crate::{task::Task, Stakker};
use std::cell::{Cell, UnsafeCell};
use std::mem;
use std::rc::Rc;
#[derive(Clone)]
pub struct DeferrerAux(Rc<Inner>);
struct Inner {
queue: UnsafeCell<FnOnceQueue<Stakker>>,
task: Cell<Option<Task>>,
}
impl DeferrerAux {
pub(crate) fn new() -> Self {
Self(Rc::new(Inner {
queue: UnsafeCell::new(FnOnceQueue::new()),
task: Cell::new(None),
}))
}
pub(crate) fn swap_queue(&self, queue: &mut FnOnceQueue<Stakker>) {
#[allow(clippy::swap_ptr_to_ref)]
unsafe {
mem::swap(&mut *self.0.queue.get(), queue)
}
}
#[inline]
pub fn defer(&self, f: impl FnOnce(&mut Stakker) + 'static) {
unsafe { (*self.0.queue.get()).push(f) };
}
#[inline]
pub fn task_replace(&self, task: Option<Task>) -> Option<Task> {
self.0.task.replace(task)
}
}