1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126
use crate::binarysearchtree::BTree; pub struct Node<K, T> { pub c: K, pub next: BTree<K, T>, pub value: Option<T> } impl<K: PartialOrd + PartialEq + Copy + Default, T> Node<K, T> { fn empty() -> Node<K, T> { Node { c: Default::default(), next: BTree::new(), value: None } } fn new(c: K) -> Node<K, T> { Node { c, next: BTree::new(), value: None } } fn link(&mut self, n: Node<K, T>) { self.next.insert(n); } fn set_value(&mut self, val: T) { self.value = Some(val); } } fn create_node<K: PartialOrd + PartialEq + Copy + Default, T>(key: Vec<K>, i: usize, val: T) -> Node<K, T> { let mut n = Node::new(key[i].to_owned() ); if i == key.len() - 1 { n.value = Some(val); }else { let child = create_node(key, i + 1, val); n.link(child); } n } fn branch<K: PartialOrd + PartialEq + Copy + Default, T>(parent: &mut Node<K, T>, key: Vec<K>, i: usize, val: T) { match parent.next.search_mut (key[i].to_owned() ) { Some(n) => { if i == key.len() - 1 { n.value = Some(val); }else { branch(n, key, i + 1, val); } return; }, None => {} } let mut n = create_node(key, i, val); parent.next.insert( n); } fn fetch<K: PartialOrd + PartialEq + Copy + Default, T>(node: &Node<K, T>, key: Vec<K>, i: usize) -> &Option<T> { match node.next.search( key[i].to_owned() ) { Some(n) => { if i == key.len() - 1 { return &n.value; } else { return fetch(n, key, i + 1); } }, None => &None } } fn remove<K: PartialOrd + PartialEq + Copy + Default, T>(node: &mut Node<K, T>, key: Vec<K>, i: usize) -> bool { match node.next.search_mut (key[i].to_owned() ) { Some(n) => { if i == key.len() - 1 { n.value = None; return n.next.is_empty(); }else { let del_node = remove(n, key, i + 1); if del_node { } } }, None => {} } false } pub struct SequenceTree<K, T> { root: Node<K, T> } impl<K: PartialOrd + PartialEq + Copy + Default, T> SequenceTree<K, T> { pub fn new () -> SequenceTree<K, T> { SequenceTree { root: Node::empty() } } pub fn del(&mut self, key: Vec<K>) { remove(&mut self.root, key, 0); } pub fn set(&mut self, key: Vec<K>, value: T) { branch(&mut self.root, key, 0, value) } pub fn get(&self, key: Vec<K>) -> &Option<T> { fetch(&self.root, key, 0) } }