#[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();
    
}