fcsd/
decoder.rs

1use crate::utils;
2use crate::Set;
3
4/// Decoder class to get string keys associated with given ids.
5#[derive(Clone)]
6pub struct Decoder<'a> {
7    set: &'a Set,
8    dec: Vec<u8>,
9}
10
11impl<'a> Decoder<'a> {
12    /// Makes a [`Decoder`].
13    ///
14    /// # Arguments
15    ///
16    ///  - `set`: Front-coding dictionay.
17    pub fn new(set: &'a Set) -> Self {
18        Self {
19            set,
20            dec: Vec::with_capacity(set.max_length()),
21        }
22    }
23
24    /// Returns the string key associated with the given id.
25    ///
26    /// # Arguments
27    ///
28    ///  - `id`: Integer id to be decoded.
29    ///
30    /// # Panics
31    ///
32    /// If `id` is no less than the number of keys, `panic!` will occur.
33    ///
34    /// # Complexity
35    ///
36    ///  - Constant
37    pub fn run(&mut self, id: usize) -> Vec<u8> {
38        let (set, dec) = (&self.set, &mut self.dec);
39        assert!(id < set.len());
40
41        let (bi, bj) = (set.bucket_id(id), set.pos_in_bucket(id));
42        let mut pos = set.decode_header(bi, dec);
43
44        for _ in 0..bj {
45            let (lcp, num) = utils::vbyte::decode(&set.serialized[pos..]);
46            pos += num;
47
48            dec.resize(lcp, 0);
49            pos = set.decode_next(pos, dec);
50        }
51
52        dec.clone()
53    }
54}