use std::fmt;
use crate::deque_timeout::{OrderedTimerDequeHandle, OrderedTimerDequeInterf, OrderedTimerDequeMode};
use crate::error::TimerResult;
use crate::timer_portable::timer::{AbsoluteTime, RelativeTime};
#[derive(Debug)]
pub struct TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Debug + fmt::Display + Send + Clone,
MODE: OrderedTimerDequeMode
{
target: R,
timeout_mode: MODE,
}
impl<R, MODE> fmt::Display
for TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> Result<(), std::fmt::Error>
{
write!(f, "{} until: {}", self.target, self.timeout_mode)
}
}
impl<R, MODE> TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
fn into_inner(self) -> R
{
return self.target;
}
}
impl<R, MODE> TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
pub(super)
fn new(target: R, time: MODE) -> TimerResult<Self>
{
time.validate_time(AbsoluteTime::now())?;
return Ok(
Self
{
target:
target,
timeout_mode:
time,
}
);
}
}
impl<R, MODE> Eq for TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
}
impl<R, MODE> PartialEq for TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
fn eq(&self, other: &Self) -> bool
{
return self.target == other.target;
}
}
impl<R, MODE> PartialEq<R> for TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
fn eq(&self, other: &R) -> bool
{
return &self.target == other;
}
}
impl<R, MODE> Ord for TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
fn cmp(&self, other: &Self) -> std::cmp::Ordering
{
return self.timeout_mode.cmp(&other.timeout_mode);
}
}
impl<R, MODE> PartialOrd for TimerDequeConsumer<R, MODE>
where
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone,
MODE: OrderedTimerDequeMode
{
fn partial_cmp(&self, other: &Self) -> Option<std::cmp::Ordering>
{
return Some(self.cmp(other));
}
}
impl<MODE, R> OrderedTimerDequeInterf<MODE> for TimerDequeConsumer<R, MODE>
where
MODE: OrderedTimerDequeMode,
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone
{
#[inline]
fn get_timeout_absolute(&self) -> AbsoluteTime
{
return self.timeout_mode.get_absolut_timeout();
}
}
impl<MODE, R> OrderedTimerDequeHandle<MODE> for TimerDequeConsumer<R, MODE>
where
MODE: OrderedTimerDequeMode,
R: PartialEq + Eq + fmt::Display + fmt::Debug + Send + Clone
{
type TimerId = R;
type HandleRes = Vec<Self::TimerId>;
fn handle(mut self, timer_self: &mut super::OrderTimerDeque<MODE, Self>,
timer_ids: &mut Self::HandleRes) -> TimerResult<()>
{
timer_ids.push(self.target.clone());
self.timeout_mode.advance_timeout();
if MODE::IS_ONCE == false
{
return timer_self.queue_item(self);
}
else
{
return Ok(());
}
}
#[inline]
fn is_same(&self, other: &Self::TimerId) -> bool
{
return &self.target == other;
}
#[inline]
fn postpone(&mut self, postp_time: RelativeTime) -> TimerResult<()>
{
return self.timeout_mode.postpone(postp_time);
}
#[inline]
fn resched(&mut self, time: MODE) -> TimerResult<()>
{
self.timeout_mode = time;
return Ok(());
}
#[inline]
fn into_timer_id(self) -> Option<Self::TimerId>
{
return Some(self.into_inner());
}
}