brotli/enc/
fixed_queue.rs
1pub const MAX_THREADS: usize = 16;
2
3pub struct FixedQueue<T: Sized> {
4 data: [Option<T>; MAX_THREADS],
5 size: usize,
6 start: usize,
7}
8impl<T: Sized> Default for FixedQueue<T> {
9 fn default() -> Self {
10 Self::new()
11 }
12}
13impl<T: Sized> FixedQueue<T> {
14 pub fn new() -> Self {
15 FixedQueue {
16 data: [
17 None, None, None, None, None, None, None, None, None, None, None, None, None, None,
18 None, None,
19 ],
20 size: 0,
21 start: 0,
22 }
23 }
24 pub fn can_push(&self) -> bool {
25 self.size < self.data.len()
26 }
27 pub fn size(&self) -> usize {
28 self.size
29 }
30 pub fn push(&mut self, item: T) -> Result<(), ()> {
31 if self.size == self.data.len() {
32 return Err(());
33 }
34 let index = (self.start + self.size) % self.data.len();
35 self.data[index] = Some(item);
36 self.size += 1;
37 Ok(())
38 }
39 pub fn pop(&mut self) -> Option<T> {
40 if self.size == 0 {
41 return None;
42 }
43 let index = self.start % self.data.len();
44 let ret = self.data[index].take();
45 self.start += 1;
46 self.size -= 1;
47 ret
48 }
49 pub fn how_much_free_space(&self) -> usize {
50 self.data.len() - self.size
51 }
52 pub fn remove<F: Fn(&Option<T>) -> bool>(&mut self, f: F) -> Option<T> {
53 if self.size == 0 {
54 return None;
55 }
56 for index in 0..self.size {
57 if f(&self.data[(self.start + index) % self.data.len()]) {
58 let start_index = self.start % self.data.len();
59 let target_index = (self.start + index) % self.data.len();
60 let ret = self.data[target_index].take();
61 let replace = self.data[start_index].take();
62 let is_none = core::mem::replace(&mut self.data[target_index], replace);
63 assert!(is_none.is_none());
64 self.start += 1;
65 self.size -= 1;
66 return ret;
67 }
68 }
69 None
70 }
71}