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}