1use crate::keys::*;
2use crate::{SubTrie, SubTrieMut, BRANCH_FACTOR};
3use std::borrow::Borrow;
4use std::default::Default;
5
6use nibble_vec::Nibblet;
7
8#[derive(Debug, Clone)]
9pub struct TrieNode<K, V> {
10 pub key: Nibblet,
13
14 pub key_value: Option<Box<KeyValue<K, V>>>,
16
17 pub child_count: usize,
19
20 pub children: [Option<Box<TrieNode<K, V>>>; BRANCH_FACTOR],
23}
24
25#[derive(Debug, Clone)]
26pub struct KeyValue<K, V> {
27 pub key: K,
28 pub value: V,
29}
30
31impl<K, V> TrieNode<K, V>
32where
33 K: TrieKey,
34{
35 #[inline]
37 pub fn new() -> TrieNode<K, V> {
38 TrieNode {
39 key: Nibblet::new(),
40 key_value: None,
41 children: Default::default(),
42 child_count: 0,
43 }
44 }
45
46 #[inline]
48 pub fn with_key_value(key_fragments: Nibblet, key: K, value: V) -> TrieNode<K, V> {
49 TrieNode {
50 key: key_fragments,
51 key_value: Some(Box::new(KeyValue {
52 key: key,
53 value: value,
54 })),
55 children: Default::default(),
56 child_count: 0,
57 }
58 }
59
60 #[inline]
62 pub fn key(&self) -> Option<&K> {
63 self.key_value.as_ref().map(|kv| &kv.key)
64 }
65
66 #[inline]
68 pub fn value(&self) -> Option<&V> {
69 self.key_value.as_ref().map(|kv| &kv.value)
70 }
71
72 #[inline]
74 pub fn value_mut(&mut self) -> Option<&mut V> {
75 self.key_value.as_mut().map(|kv| &mut kv.value)
76 }
77
78 #[inline]
83 pub fn value_checked<Q: ?Sized>(&self, key: &Q) -> Option<&V>
84 where
85 K: Borrow<Q>,
86 Q: TrieKey,
87 {
88 self.key_value.as_ref().map(|kv| {
89 check_keys(kv.key.borrow(), key);
90 &kv.value
91 })
92 }
93
94 #[inline]
99 pub fn value_checked_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V>
100 where
101 K: Borrow<Q>,
102 Q: TrieKey,
103 {
104 self.key_value.as_mut().map(|kv| {
105 check_keys(kv.key.borrow(), key);
106 &mut kv.value
107 })
108 }
109
110 #[inline]
112 pub fn compute_size(&self) -> usize {
113 let mut size = self.key_value.is_some() as usize;
114
115 for child in &self.children {
116 if let Some(ref child) = *child {
117 size += child.compute_size();
119 }
120 }
121
122 size
123 }
124
125 #[inline]
127 pub fn add_child(&mut self, idx: usize, node: Box<TrieNode<K, V>>) {
128 debug_assert!(self.children[idx].is_none());
129 self.child_count += 1;
130 self.children[idx] = Some(node);
131 }
132
133 #[inline]
135 pub fn take_child(&mut self, idx: usize) -> Option<Box<TrieNode<K, V>>> {
136 self.children[idx].take().map(|node| {
137 self.child_count -= 1;
138 node
139 })
140 }
141
142 #[inline]
144 pub fn take_only_child(&mut self) -> Box<TrieNode<K, V>> {
145 debug_assert_eq!(self.child_count, 1);
146 for i in 0..BRANCH_FACTOR {
147 if let Some(child) = self.take_child(i) {
148 return child;
149 }
150 }
151 unreachable!("node with child_count 1 has no actual children");
152 }
153
154 #[inline]
156 pub fn add_key_value(&mut self, key: K, value: V) {
157 debug_assert!(self.key_value.is_none());
158 self.key_value = Some(Box::new(KeyValue { key, value }));
159 }
160
161 #[inline]
167 pub fn take_value<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
168 where
169 K: Borrow<Q>,
170 Q: TrieKey,
171 {
172 self.key_value.take().map(|kv| {
173 check_keys(kv.key.borrow(), key);
174 kv.value
175 })
176 }
177
178 #[inline]
180 pub fn replace_value(&mut self, key: K, value: V) -> Option<V> {
181 let previous = self.take_value(&key);
183 self.add_key_value(key, value);
184 previous
185 }
186
187 #[inline]
189 pub fn as_value_node(&self) -> Option<&TrieNode<K, V>> {
190 self.key_value.as_ref().map(|_| self)
191 }
192
193 #[inline]
196 pub fn split(&mut self, idx: usize) {
197 let key = self.key.split(idx);
199
200 let key_value = self.key_value.take();
202
203 let mut children: [Option<Box<TrieNode<K, V>>>; BRANCH_FACTOR] = Default::default();
205
206 for (i, child) in self.children.iter_mut().enumerate() {
207 if child.is_some() {
208 children[i] = child.take();
209 }
210 }
211
212 let child_count = self.child_count;
214 self.child_count = 1;
215
216 let bucket = key.get(0) as usize;
218 self.children[bucket] = Some(Box::new(TrieNode {
219 key: key,
220 key_value,
221 children,
222 child_count,
223 }));
224 }
225 #[inline]
226 pub fn as_subtrie(&self, prefix: Nibblet) -> SubTrie<K, V> {
227 SubTrie {
228 prefix: prefix,
229 node: self,
230 }
231 }
232 #[inline]
233 pub fn as_subtrie_mut<'a>(
234 &'a mut self,
235 prefix: Nibblet,
236 length: &'a mut usize,
237 ) -> SubTrieMut<'a, K, V> {
238 SubTrieMut {
239 prefix: prefix,
240 length: length,
241 node: self,
242 }
243 }
244
245 pub fn check_integrity_recursive(&self, prefix: &Nibblet) -> (bool, usize) {
249 let mut sub_tree_size = 0;
250 let is_root = prefix.len() == 0;
251
252 if !is_root && self.child_count == 1 && self.key_value.is_none() {
254 println!("Value-less node with a single child.");
255 return (false, sub_tree_size);
256 }
257
258 if !is_root && self.key.len() == 0 {
260 println!("Key length is 0 at non-root node.");
261 return (false, sub_tree_size);
262 }
263
264 let child_count = self
266 .children
267 .iter()
268 .fold(0, |acc, e| acc + (e.is_some() as usize));
269
270 if child_count != self.child_count {
271 println!(
272 "Child count error, recorded: {}, actual: {}",
273 self.child_count, child_count
274 );
275 return (false, sub_tree_size);
276 }
277
278 let trie_key = prefix.clone().join(&self.key);
280
281 if let Some(ref kv) = self.key_value {
283 sub_tree_size += 1;
284
285 let actual_key = kv.key.encode();
286
287 if trie_key != actual_key {
288 return (false, sub_tree_size);
289 }
290 }
291
292 for i in 0..BRANCH_FACTOR {
294 if let Some(ref child) = self.children[i] {
295 match child.check_integrity_recursive(&trie_key) {
296 (false, _) => return (false, sub_tree_size),
297 (true, child_size) => sub_tree_size += child_size,
298 }
299 }
300 }
301
302 (true, sub_tree_size)
303 }
304}
305
306impl<K: TrieKey, V> Default for TrieNode<K, V> {
307 fn default() -> Self {
308 Self::new()
309 }
310}