kv_trie_rs/trie/
trie_builder.rs

1use crate::internal_data_structure::naive_trie::NaiveTrie;
2use crate::trie::TrieLabel;
3use crate::{Trie, TrieBuilder};
4use louds_rs::Louds;
5
6impl<K: Ord + Clone, V: Clone> TrieBuilder<K, V> {
7    pub fn new() -> Self {
8        let naive_trie = NaiveTrie::make_root();
9        Self { naive_trie }
10    }
11
12    pub fn push<Key: AsRef<[K]>>(&mut self, key: Key, value: V) {
13        self.naive_trie.push(key, value);
14    }
15
16    pub fn build(&self) -> Trie<K, V> {
17        let mut louds_bits: Vec<bool> = vec![true, false];
18        let mut trie_labels: Vec<TrieLabel<K, V>> = vec![];
19        for node in self.naive_trie.bf_iter() {
20            match node {
21                NaiveTrie::Root(_) => {}
22                NaiveTrie::IntermOrLeaf(_) => {
23                    louds_bits.push(true);
24                    trie_labels.push(TrieLabel {
25                        key: node.label().clone(),
26                        value: node.value().clone(),
27                        is_terminal: node.is_terminal(),
28                    });
29                }
30                NaiveTrie::PhantomSibling => {
31                    louds_bits.push(false);
32                }
33            }
34        }
35        let louds = Louds::from(&louds_bits[..]);
36
37        Trie { louds, trie_labels }
38    }
39}