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, vec![1, 30]);
timer.add_timer(2);
let val = timer.update_deltatime(119).unwrap();
assert_eq!(val, vec![2, 149]);
let val = timer.update_deltatime(1).unwrap();
assert_eq!(val, 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);
}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);
}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, 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<T>>
pub fn update_now(&mut self, now: u64) -> Option<Vec<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![30]);
}Sourcepub fn update_deltatime(&mut self, delta: u64) -> Option<Vec<T>>
pub fn update_deltatime(&mut self, delta: u64) -> Option<Vec<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![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;
timer.update_deltatime_with_callback(30, &mut |_, v| {
idx = v;
None
});
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