kv_trie_rs/trie/
trie_builder.rs1use 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}