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