- [derive(Debug)]
enum Node<T: Sized> {
Terminal { key: u32, data: T, }, Nonterminal { left: Box<Node<T>>, right: Box<Node<T>>, }, None,
}
- [derive(Debug)]
struct Tree<T: Sized> {
root: Node<T>,
}
- [inline]
fn radix_bit(num: u32, radix: u8) -> bool {
num & (1 << (32 - radix)) != 0
} impl<T: Sized> Node<T> {
fn terminal(key: u32, data: T) -> Self { Node::Terminal { key: key, data: data, } } fn nonterminal(left: Self, right: Self) -> Self { Node::Nonterminal { left: Box::new(left), right: Box::new(right), } } fn none() -> Self { Node::None } fn insert(&mut self, index: u8, key: u32, data: T)->Option<T> { //println!("insert {}",index); match *self { Node::None => { let n = if radix_bit(key, index) { Node::nonterminal(Node::none(), Node::terminal(key, data)) } else { Node::nonterminal(Node::terminal(key, data), Node::none()) }; *self = n; None } Node::Nonterminal { ref mut left, ref mut right, } => { let next = if radix_bit(key, index) { right.as_mut() } else { left.as_mut() }; next.insert(index + 1, key, data) //next } Node::Terminal { key: self_key, data:ref mut self_data, } => { if self_key == key{ return Some(std::mem::replace(self_data, data)); } let s = std::mem::replace(self, Node::None); let res; //eprintln!("{:?}", self); *self = match (radix_bit(self_key, index), radix_bit(key, index)) { (true, true) => { let mut node = Node::nonterminal(Node::None, s); res = node.insert(index, key, data); node } (false, false) => { let mut node = Node::nonterminal(s, Node::None); res = node.insert(index, key, data); node } (true, false) => { //eprintln!("{:?}", self); res = None; Node::nonterminal( Node::terminal(key, data), s, ) } (false, true) => { //eprintln!("{:?}", self); res = None; Node::nonterminal( s, Node::terminal(key, data), ) } }; res } } }
}
impl<T: Sized> Tree<T> {
fn new() -> Self { Self { root: Node::none() } } fn insert(&mut self, key: u32, data: T) { self.root.insert(1, key, data); } fn find(&self, key: &u32) -> Option<&T> { let mut node = &self.root; let mut radix = 0u8; loop { //eprintln!("{}, {:?}",radix, node); radix += 1; //println!("find radix: {} {:?}",radix, node); match node { Node::Terminal { key: termial_key, data, } if termial_key == key => break Some(data), Node::Nonterminal { left, right } => { node = match radix_bit(*key, radix) { true => right.as_ref(), false => left.as_ref(), } } _ => break None, } } }
} fn main(){
//let mut tree = Tree::new(); let mut tree:Tree<[u8; 4096]> = Tree::new();
}