1use crate::traversal::DescendantResult::*;
2use crate::TrieNode;
3use crate::{SubTrie, SubTrieMut, Trie, TrieCommon, TrieKey};
4use std::borrow::Borrow;
5
6use nibble_vec::Nibblet;
7
8impl<K, V> Trie<K, V>
9where
10 K: TrieKey,
11{
12 #[inline]
14 pub fn new() -> Trie<K, V> {
15 Trie {
16 length: 0,
17 node: TrieNode::new(),
18 }
19 }
20
21 #[inline]
26 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
27 where
28 K: Borrow<Q>,
29 Q: TrieKey,
30 {
31 let key_fragments = key.encode();
32 self.node
33 .get(&key_fragments)
34 .and_then(|t| t.value_checked(key))
35 }
36
37 #[inline]
42 pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V>
43 where
44 K: Borrow<Q>,
45 Q: TrieKey,
46 {
47 let key_fragments = key.encode();
48 self.node
49 .get_mut(&key_fragments)
50 .and_then(|t| t.value_checked_mut(key))
51 }
52
53 #[inline]
55 pub fn insert(&mut self, key: K, value: V) -> Option<V> {
56 let key_fragments = key.encode();
57 let result = self.node.insert(key, value, key_fragments);
58 if result.is_none() {
59 self.length += 1;
60 }
61 result
62 }
63
64 #[inline]
69 pub fn remove<Q: ?Sized>(&mut self, key: &Q) -> Option<V>
70 where
71 K: Borrow<Q>,
72 Q: TrieKey,
73 {
74 let removed = self.node.remove(key);
75 if removed.is_some() {
76 self.length -= 1;
77 }
78 removed
79 }
80
81 pub fn value_mut(&mut self) -> Option<&mut V> {
83 self.node.value_mut()
84 }
85
86 #[inline]
91 pub fn subtrie<'a, Q: ?Sized>(&'a self, key: &Q) -> Option<SubTrie<'a, K, V>>
92 where
93 K: Borrow<Q>,
94 Q: TrieKey,
95 {
96 let key_fragments = key.encode();
97 self.node
98 .get(&key_fragments)
99 .map(|node| node.as_subtrie(key_fragments))
100 }
101
102 #[inline]
107 pub fn subtrie_mut<'a, Q: ?Sized>(&'a mut self, key: &Q) -> Option<SubTrieMut<'a, K, V>>
108 where
109 K: Borrow<Q>,
110 Q: TrieKey,
111 {
112 let key_fragments = key.encode();
113 let length_ref = &mut self.length;
114 self.node
115 .get_mut(&key_fragments)
116 .map(move |node| node.as_subtrie_mut(key_fragments, length_ref))
117 }
118
119 #[inline]
130 pub fn get_ancestor<'a, Q: ?Sized>(&'a self, key: &Q) -> Option<SubTrie<'a, K, V>>
131 where
132 K: Borrow<Q>,
133 Q: TrieKey,
134 {
135 let mut key_fragments = key.encode();
136 self.node
137 .get_ancestor(&key_fragments)
138 .map(|(node, node_key_len)| {
139 key_fragments.split(node_key_len);
140 node.as_subtrie(key_fragments)
141 })
142 }
143
144 #[inline]
151 pub fn get_ancestor_value<Q: ?Sized>(&self, key: &Q) -> Option<&V>
152 where
153 K: Borrow<Q>,
154 Q: TrieKey,
155 {
156 self.get_ancestor(key).and_then(|t| t.node.value())
157 }
158
159 #[inline]
162 pub fn get_raw_ancestor<'a, Q: ?Sized>(&'a self, key: &Q) -> SubTrie<'a, K, V>
163 where
164 K: Borrow<Q>,
165 Q: TrieKey,
166 {
167 let mut nv = key.encode();
168 let (ancestor_node, depth) = self.node.get_raw_ancestor(&nv);
169 nv.split(depth);
170 ancestor_node.as_subtrie(nv)
171 }
172
173 #[inline]
180 pub fn get_raw_descendant<'a, Q: ?Sized>(&'a self, key: &Q) -> Option<SubTrie<'a, K, V>>
181 where
182 K: Borrow<Q>,
183 Q: TrieKey,
184 {
185 let mut nv = key.encode();
186 self.node.get_raw_descendant(&nv).map(|desc| {
187 let (node, prefix) = match desc {
188 NoModification(node) => (node, nv),
189 ExtendKey(node, depth, extension) => {
190 nv.split(depth);
191 (node, nv.join(extension))
192 }
193 };
194 node.as_subtrie(prefix)
195 })
196 }
197
198 #[inline]
202 pub fn map_with_default<F>(&mut self, key: K, f: F, default: V)
203 where
204 F: Fn(&mut V),
205 {
206 {
207 if let Some(v) = self.get_mut(&key) {
208 f(v);
209 return;
210 }
211 }
212 self.insert(key, default);
213 }
214
215 #[doc(hidden)]
218 pub fn check_integrity(&self) -> bool {
219 let (ok, length) = self.node.check_integrity_recursive(&Nibblet::new());
220 ok && length == self.length
221 }
222}
223
224impl<K, V> PartialEq for Trie<K, V>
225where
226 K: TrieKey,
227 V: PartialEq,
228{
229 #[inline]
230 fn eq(&self, other: &Trie<K, V>) -> bool {
231 if self.len() != other.len() {
232 return false;
233 }
234
235 self.iter()
236 .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
237 }
238}
239
240impl<K: TrieKey, V> Default for Trie<K, V> {
241 #[inline]
242 fn default() -> Self {
243 Self::new()
244 }
245}