inner_mem_cache/
timeoutset.rs

1use std::collections::{BTreeMap, LinkedList};
2
3pub struct TimeoutSet<T> {
4    time_list: BTreeMap<u64, LinkedList<T>>,
5}
6
7impl<T> Default for TimeoutSet<T> {
8    fn default() -> Self {
9        Self::new()
10    }
11}
12
13impl<T> TimeoutSet<T> {
14    pub fn new() -> Self {
15        Self {
16            time_list: BTreeMap::new(),
17        }
18    }
19
20    pub fn add(&mut self, time: u64, val: T) {
21        match self.time_list.get_mut(&time) {
22            Some(list) => {
23                list.push_back(val);
24            }
25            None => {
26                let mut list = LinkedList::new();
27                list.push_back(val);
28                self.time_list.insert(time, list);
29            }
30        }
31    }
32
33    fn get_timeout_keys(&self, time: u64) -> LinkedList<u64> {
34        let mut times = LinkedList::new();
35        for (t, _) in self.time_list.iter() {
36            if *t <= time {
37                times.push_back(*t)
38            } else {
39                break;
40            }
41        }
42        times
43    }
44
45    /// only get the timeout value list
46    pub fn get_timeout_values(&self, time: u64) -> LinkedList<&T> {
47        let mut list = LinkedList::new();
48        for (t, values) in self.time_list.iter() {
49            if *t <= time {
50                for item in values {
51                    list.push_back(item);
52                }
53            } else {
54                break;
55            }
56        }
57        list
58    }
59
60    /// remove timeout value and return the value list
61    pub fn timeout(&mut self, time: u64) -> LinkedList<T> {
62        let mut list = LinkedList::new();
63        let times = self.get_timeout_keys(time);
64        let mut time_list = &mut self.time_list;
65        for t in times {
66            if let Some(mut values) = time_list.remove(&t) {
67                list.append(&mut values)
68            }
69        }
70        list
71    }
72
73    pub fn clear(&mut self) {
74        self.time_list.clear();
75    }
76
77    pub fn len(&self) -> usize {
78        self.time_list.len()
79    }
80
81    pub fn item_size(&self) -> usize {
82        let mut sum = 0;
83        for (_, l) in &self.time_list {
84            sum += l.len();
85        }
86        sum
87    }
88}