use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use std::task::Context;
use std::task::Poll;
use crate::ManualMonotonicClock;
use crate::MonotonicInstant;
#[derive(Debug)]
pub struct ManualDeadlineFuture {
clock: Arc<ManualMonotonicClock>,
observer_id: Option<u64>,
}
impl ManualDeadlineFuture {
#[must_use]
#[inline]
pub(crate) fn new(clock: Arc<ManualMonotonicClock>) -> Self {
let observer_id = clock.register_deadline_observer();
Self {
clock,
observer_id: Some(observer_id),
}
}
}
impl Future for ManualDeadlineFuture {
type Output = MonotonicInstant;
fn poll(mut self: Pin<&mut Self>, context: &mut Context<'_>) -> Poll<Self::Output> {
let Some(observer_id) = self.observer_id else {
panic!("manual deadline future polled after completion");
};
let result = self.clock.poll_deadline_observer(observer_id, context);
if result.is_ready() {
self.observer_id = None;
}
result
}
}
impl Drop for ManualDeadlineFuture {
#[inline]
fn drop(&mut self) {
if let Some(observer_id) = self.observer_id.take() {
self.clock.unregister_waiter_observer(observer_id);
}
}
}