(새 문서: <source lang="rust"> #[derive(Debug)] enum Node<T: Sized> { Terminal { key: u32, data: T, }, Nonterminal { left: Box<Node<T>>, right: Box<N...) |
|||
(같은 사용자의 중간 판 2개는 보이지 않습니다) | |||
36번째 줄: | 36번째 줄: | ||
Node::None | Node::None | ||
} | } | ||
− | fn insert(&mut self, index: u8, key: u32, data: T) { | + | fn insert(&mut self, index: u8, key: u32, data: T)->Option<T> { |
//println!("insert {}",index); | //println!("insert {}",index); | ||
match *self { | match *self { | ||
46번째 줄: | 46번째 줄: | ||
}; | }; | ||
*self = n; | *self = n; | ||
+ | None | ||
} | } | ||
Node::Nonterminal { | Node::Nonterminal { | ||
56번째 줄: | 57번째 줄: | ||
left.as_mut() | left.as_mut() | ||
}; | }; | ||
− | next.insert(index + 1, key, data) | + | next.insert(index + 1, key, data) |
//next | //next | ||
} | } | ||
Node::Terminal { | Node::Terminal { | ||
key: self_key, | key: self_key, | ||
− | data: self_data, | + | 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); | //eprintln!("{:?}", self); | ||
*self = match (radix_bit(self_key, index), radix_bit(key, index)) { | *self = match (radix_bit(self_key, index), radix_bit(key, index)) { | ||
(true, true) => { | (true, true) => { | ||
let mut node = | let mut node = | ||
− | Node::nonterminal(Node::None, | + | Node::nonterminal(Node::None, s); |
− | node.insert(index, key, data); | + | res = node.insert(index, key, data); |
node | node | ||
} | } | ||
(false, false) => { | (false, false) => { | ||
let mut node = | let mut node = | ||
− | Node::nonterminal( | + | Node::nonterminal(s, Node::None); |
− | node.insert(index, key, data); | + | res = node.insert(index, key, data); |
node | node | ||
} | } | ||
(true, false) => { | (true, false) => { | ||
//eprintln!("{:?}", self); | //eprintln!("{:?}", self); | ||
+ | res = None; | ||
Node::nonterminal( | Node::nonterminal( | ||
Node::terminal(key, data), | Node::terminal(key, data), | ||
− | + | s, | |
) | ) | ||
} | } | ||
(false, true) => { | (false, true) => { | ||
//eprintln!("{:?}", self); | //eprintln!("{:?}", self); | ||
+ | res = None; | ||
Node::nonterminal( | Node::nonterminal( | ||
− | + | s, | |
Node::terminal(key, data), | Node::terminal(key, data), | ||
) | ) | ||
} | } | ||
}; | }; | ||
+ | res | ||
} | } | ||
− | } | + | } |
} | } | ||
} | } | ||
126번째 줄: | 135번째 줄: | ||
} | } | ||
} | } | ||
+ | } | ||
+ | fn main(){ | ||
+ | //let mut tree = Tree::new(); | ||
+ | let mut tree:Tree<[u8; 4096]> = Tree::new(); | ||
+ | |||
} | } | ||
</source> | </source> | ||
− |
2019년 1월 5일 (토) 08:00 기준 최신판
#[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();
}