pub struct TimerRBTree<T: Timer> { /* private fields */ }
Expand description
计时器轮,模拟时钟格式组成的高效计时器
时间轮是一个环形的数据结构,可以想象成一个时钟的面,被分成多个格子
每个格子代表一段时间,这段时间越短,定时器的精度就越高。
每个格子用一个Vec存储放在该格子上的延时任务。
Mark: 在Rust中双向链表中暂未提供元素关键列表的接口,这里改用Vec,删除时会额外移动Vec值
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
timer.add_timer(30);
assert_eq!(timer.tick_first(), Some(30));
timer.add_timer(149);
assert_eq!(timer.tick_first(), Some(30));
let t = timer.add_timer(600);
assert_eq!(timer.tick_first(), Some(30));
timer.add_timer(1);
assert_eq!(timer.tick_first(), Some(1));
timer.del_timer(t);
timer.add_timer(150);
assert_eq!(timer.tick_first(), Some(1));
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![1, 30]);
timer.add_timer(2);
let val = timer.update_deltatime(119).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![2, 149]);
let val = timer.update_deltatime(1).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![150]);
assert!(timer.is_empty());
}
Implementations§
Source§impl<T: Timer> TimerRBTree<T>
impl<T: Timer> TimerRBTree<T>
pub fn new() -> Self
Sourcepub fn len(&self) -> usize
pub fn len(&self) -> usize
获取定时器的长度
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::<u64>::new();
assert!(timer.is_empty());
timer.add_timer(1);
assert_eq!(timer.len(), 1);
let t = timer.add_timer(2);
assert_eq!(timer.len(), 2);
timer.del_timer(t);
assert_eq!(timer.len(), 1);
}
pub fn is_empty(&self) -> bool
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
清除所有的槽位
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::<u64>::new();
assert!(timer.is_empty());
timer.add_timer(1);
timer.add_timer(2);
assert_eq!(timer.len(), 2);
timer.clear();
assert_eq!(timer.len(), 0);
}
pub fn get_max_timerid(&self) -> u64
pub fn set_max_timerid(&mut self, max: u64)
Sourcepub fn add_timer(&mut self, val: T) -> u64
pub fn add_timer(&mut self, val: T) -> u64
添加定时器元素
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
timer.add_timer(30);
assert_eq!(timer.len(), 1);
}
pub fn add_timer_by_id(&mut self, timer_id: u64, val: T)
Sourcepub fn del_timer(&mut self, timer_id: u64) -> Option<T>
pub fn del_timer(&mut self, timer_id: u64) -> Option<T>
删除指定的定时器,时间复杂度为O(logn),
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
let t = timer.add_timer(30);
timer.del_timer(t);
assert_eq!(timer.len(), 0);
}
Sourcepub fn get_timer(&self, timer_id: &u64) -> Option<&T>
pub fn get_timer(&self, timer_id: &u64) -> Option<&T>
获取指定的定时器,时间复杂度为O(log(n))
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
let t = timer.add_timer(30);
assert_eq!(timer.get_timer(&t), Some(&30));
}
Sourcepub fn get_mut_timer(&mut self, timer_id: &u64) -> Option<&mut T>
pub fn get_mut_timer(&mut self, timer_id: &u64) -> Option<&mut T>
获取指定的定时器,时间复杂度为O(log(n))
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
let t = timer.add_timer(30);
*timer.get_mut_timer(&t).unwrap() = 33;
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![33]);
}
Sourcepub fn tick_first(&self) -> Option<u64>
pub fn tick_first(&self) -> Option<u64>
取出时间轴最小的一个值
Sourcepub fn update_now(&mut self, now: u64) -> Option<Vec<(u64, T)>>
pub fn update_now(&mut self, now: u64) -> Option<Vec<(u64, T)>>
计时器轮的递进时间
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
timer.add_timer(30);
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val.iter().map(|(_, v)| *v).collect::<Vec<usize>>(), vec![30]);
}
Sourcepub fn update_deltatime(&mut self, delta: u64) -> Option<Vec<(u64, T)>>
pub fn update_deltatime(&mut self, delta: u64) -> Option<Vec<(u64, T)>>
计时器轮的递进时间
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
timer.add_timer(30);
let val = timer.update_deltatime(30).unwrap();
assert_eq!(val, vec![(1, 30)]);
}
Sourcepub fn update_deltatime_with_callback<F>(&mut self, delta: u64, f: &mut F)
pub fn update_deltatime_with_callback<F>(&mut self, delta: u64, f: &mut F)
计时器轮的递进时间
§Examples
use algorithm::TimerRBTree;
fn main() {
let mut timer = TimerRBTree::new();
timer.add_timer(30);
let mut idx = 0;
let mut timer_id = 0;
timer.update_deltatime_with_callback(30, &mut |_, id, v| {
timer_id = id;
idx = v;
None
});
assert_eq!(timer_id, 1);
assert_eq!(idx, 30);
}
pub fn update_now_with_callback<F>(&mut self, now: u64, f: &mut F)
Auto Trait Implementations§
impl<T> Freeze for TimerRBTree<T>
impl<T> RefUnwindSafe for TimerRBTree<T>where
T: RefUnwindSafe,
impl<T> Send for TimerRBTree<T>
impl<T> Sync for TimerRBTree<T>
impl<T> Unpin for TimerRBTree<T>
impl<T> UnwindSafe for TimerRBTree<T>where
T: RefUnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more