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}