Work on Trie.
This commit is contained in:
parent
d4280f40e1
commit
97376bad72
@ -1,3 +1,4 @@
|
|||||||
pub mod lexer;
|
pub mod lexer;
|
||||||
pub mod parser;
|
pub mod parser;
|
||||||
|
mod util;
|
||||||
pub mod vm;
|
pub mod vm;
|
||||||
|
1
src/util/mod.rs
Normal file
1
src/util/mod.rs
Normal file
@ -0,0 +1 @@
|
|||||||
|
pub mod trie;
|
120
src/util/trie.rs
Normal file
120
src/util/trie.rs
Normal file
@ -0,0 +1,120 @@
|
|||||||
|
// use crate::util::trie::GetEdgeResult::{EdgeKeyIsPrefix, EqualKeys, KeyIsPrefix};
|
||||||
|
// use std::collections::HashMap;
|
||||||
|
// use std::rc::Rc;
|
||||||
|
//
|
||||||
|
// pub struct RadixTrie<T> {
|
||||||
|
// root: RadixTrieNode<T>,
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// struct RadixTrieNode<T> {
|
||||||
|
// edges: HashMap<String, RadixTrieNode<T>>,
|
||||||
|
// value: Option<Rc<T>>,
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// impl<T> RadixTrie<T> {
|
||||||
|
// pub fn new() -> Self {
|
||||||
|
// RadixTrie {
|
||||||
|
// root: Default::default(),
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// pub fn insert(&mut self, key: &str, value: &Rc<T>) {
|
||||||
|
// self.root.insert_helper(key, value);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// pub fn remove(&mut self, key: &str) {
|
||||||
|
// todo!()
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// pub fn find(&self, key: &str) -> Option<Rc<T>> {
|
||||||
|
// todo!()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// impl<T> Default for RadixTrieNode<T> {
|
||||||
|
// fn default() -> Self {
|
||||||
|
// RadixTrieNode::new()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// enum GetEdgeResult<'a, T> {
|
||||||
|
// EqualKeys,
|
||||||
|
// KeyIsPrefix(&'a str, &'a mut RadixTrieNode<T>), // common prefix and target node
|
||||||
|
// EdgeKeyIsPrefix(&'a str, &'a mut RadixTrieNode<T>), // non-common suffix and target node,
|
||||||
|
// None,
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// impl<T> RadixTrieNode<T> {
|
||||||
|
// fn new() -> Self {
|
||||||
|
// RadixTrieNode {
|
||||||
|
// edges: HashMap::new(),
|
||||||
|
// value: None,
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// fn get_edge<'a>(&'a mut self, key: &'a str) -> GetEdgeResult<'a, T> {
|
||||||
|
// for (edge_key, edge_node) in self.edges.iter_mut() {
|
||||||
|
// // Case: edge_key == key: overwrite data
|
||||||
|
// if *key == *edge_key {
|
||||||
|
// return EqualKeys;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Find how many common characters there are starting from the beginning and terminating
|
||||||
|
// // as soon as there is no match
|
||||||
|
// let mut i = 0;
|
||||||
|
// 'number_of_common_chars: for (key_char, edge_key_char) in
|
||||||
|
// key.chars().zip(edge_key.chars())
|
||||||
|
// {
|
||||||
|
// if key_char == edge_key_char {
|
||||||
|
// i += 1;
|
||||||
|
// } else {
|
||||||
|
// break 'number_of_common_chars;
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Case: key's first char does not match at all: continue searching
|
||||||
|
// if i == 0 {
|
||||||
|
// continue;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// // Case: key is prefix of edge_key
|
||||||
|
// if i < edge_key.len() {
|
||||||
|
// return KeyIsPrefix(key, edge_node);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if i == edge_key.len() {
|
||||||
|
// panic!(
|
||||||
|
// "Should not have gotten here: counted common chars equals edge_key's length."
|
||||||
|
// )
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return EdgeKeyIsPrefix(&edge_key[i..], edge_node);
|
||||||
|
// }
|
||||||
|
// GetEdgeResult::None
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// fn insert_helper(&mut self, key: &str, value: &Rc<T>) {
|
||||||
|
// match self.get_edge(key) {
|
||||||
|
// EqualKeys => {
|
||||||
|
// let edge_node = self.edges.get_mut(key).unwrap();
|
||||||
|
// edge_node.value = Some(value.clone());
|
||||||
|
// }
|
||||||
|
// KeyIsPrefix(prefix, edge_node) => {
|
||||||
|
// // split like asparagus break
|
||||||
|
// let old_target_node = self.edges.remove(key).unwrap();
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// let mut common_prefix_node: RadixTrieNode<T> = RadixTrieNode::new();
|
||||||
|
// }
|
||||||
|
// EdgeKeyIsPrefix(suffix, edge_node) => {
|
||||||
|
// // recursive on edge_node
|
||||||
|
// edge_node.insert_helper(suffix, value);
|
||||||
|
// }
|
||||||
|
// GetEdgeResult::None => {
|
||||||
|
// let mut new_edge_node = RadixTrieNode::new();
|
||||||
|
// new_edge_node.value = Some(value.clone());
|
||||||
|
// self.edges.insert(String::from(key), new_edge_node);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
Loading…
Reference in New Issue
Block a user