fcsd/
iter.rs

1use crate::Set;
2
3/// Iterator to enumerate keys stored in the dictionary.
4#[derive(Clone)]
5pub struct Iter<'a> {
6    set: &'a Set,
7    dec: Vec<u8>,
8    pos: usize,
9    id: usize,
10}
11
12impl<'a> Iter<'a> {
13    /// Makes an iterator [`Iter`].
14    ///
15    /// # Arguments
16    ///
17    ///  - `set`: Front-coding dictionay.
18    pub fn new(set: &'a Set) -> Self {
19        Self {
20            set,
21            dec: Vec::with_capacity(set.max_length()),
22            pos: 0,
23            id: 0,
24        }
25    }
26}
27
28impl<'a> Iterator for Iter<'a> {
29    type Item = (usize, Vec<u8>);
30
31    fn next(&mut self) -> Option<Self::Item> {
32        if self.pos == self.set.serialized.len() {
33            return None;
34        }
35        if self.set.pos_in_bucket(self.id) == 0 {
36            self.dec.clear();
37        } else {
38            let (lcp, next_pos) = self.set.decode_lcp(self.pos);
39            self.pos = next_pos;
40            self.dec.resize(lcp, 0);
41        }
42        self.pos = self.set.decode_next(self.pos, &mut self.dec);
43        self.id += 1;
44        Some((self.id - 1, self.dec.clone()))
45    }
46
47    fn size_hint(&self) -> (usize, Option<usize>) {
48        (self.set.len(), Some(self.set.len()))
49    }
50}