1use super::node::{Branch, Leaf, Meta, Node};
5use std::collections::VecDeque;
6use std::fmt::Debug;
7use std::hash::Hash;
8use std::marker::PhantomData;
9
10pub(crate) struct LeafIter<'a, K, V>
11where
12 K: Hash + Eq + Clone + Debug,
13 V: Clone,
14{
15 length: Option<usize>,
16 stack: VecDeque<(*mut Node<K, V>, usize)>,
18 phantom_k: PhantomData<&'a K>,
19 phantom_v: PhantomData<&'a V>,
20}
21
22impl<K: Clone + Hash + Eq + Debug, V: Clone> LeafIter<'_, K, V> {
23 pub(crate) fn new(root: *mut Node<K, V>, size_hint: bool) -> Self {
24 let length = if size_hint {
25 Some(unsafe { (*root).leaf_count() })
26 } else {
27 None
28 };
29
30 let mut stack = VecDeque::new();
32
33 let mut work_node = root;
34 loop {
35 stack.push_back((work_node, 0));
36 if self_meta!(work_node).is_leaf() {
37 break;
38 } else {
39 work_node = branch_ref!(work_node, K, V).get_idx_unchecked(0);
40 }
41 }
42
43 LeafIter {
44 length,
45 stack,
47 phantom_k: PhantomData,
48 phantom_v: PhantomData,
49 }
50 }
51
52 #[cfg(test)]
53 pub(crate) fn new_base() -> Self {
54 LeafIter {
55 length: None,
56 stack: VecDeque::new(),
58 phantom_k: PhantomData,
59 phantom_v: PhantomData,
60 }
61 }
62
63 pub(crate) fn stack_position(&mut self, idx: usize) {
64 if let Some((bref, bpidx)) = self.stack.back() {
66 let wbranch = branch_ref!(*bref, K, V);
67 if let Some(node) = wbranch.get_idx_checked(idx) {
68 let mut work_node = node;
71 let mut work_idx = idx;
72 loop {
73 self.stack.push_back((work_node, work_idx));
74 if self_meta!(work_node).is_leaf() {
75 break;
76 } else {
77 work_idx = 0;
78 work_node = branch_ref!(work_node, K, V).get_idx_unchecked(work_idx);
79 }
80 }
81 } else {
82 let bpidx = *bpidx + 1;
84 let _ = self.stack.pop_back();
85 self.stack_position(bpidx)
86 }
87 }
88 }
91
92 }
99
100impl<'a, K: Clone + Hash + Eq + Debug, V: Clone> Iterator for LeafIter<'a, K, V> {
101 type Item = &'a Leaf<K, V>;
102
103 fn next(&mut self) -> Option<Self::Item> {
104 let (leafref, parent_idx) = self.stack.pop_back()?;
106
107 self.stack_position(parent_idx + 1);
109
110 Some(leaf_ref!(leafref, K, V))
113 }
114
115 fn size_hint(&self) -> (usize, Option<usize>) {
116 match self.length {
117 Some(l) => (l, Some(l)),
118 None => (0, None),
120 }
121 }
122}
123
124pub struct Iter<'a, K, V>
126where
127 K: Hash + Eq + Clone + Debug,
128 V: Clone,
129{
130 length: usize,
131 slot_idx: usize,
132 bk_idx: usize,
133 curleaf: Option<&'a Leaf<K, V>>,
134 leafiter: LeafIter<'a, K, V>,
135}
136
137impl<K: Clone + Hash + Eq + Debug, V: Clone> Iter<'_, K, V> {
138 pub(crate) fn new(root: *mut Node<K, V>, length: usize) -> Self {
139 let mut liter = LeafIter::new(root, false);
140 let leaf = liter.next();
141 Iter {
143 length,
144 slot_idx: 0,
145 bk_idx: 0,
146 curleaf: leaf,
147 leafiter: liter,
148 }
149 }
150}
151
152impl<'a, K: Clone + Hash + Eq + Debug, V: Clone> Iterator for Iter<'a, K, V> {
153 type Item = (&'a K, &'a V);
154
155 fn next(&mut self) -> Option<Self::Item> {
157 if let Some(leaf) = self.curleaf {
158 if let Some(r) = leaf.get_kv_idx_checked(self.slot_idx, self.bk_idx) {
159 self.bk_idx += 1;
160 Some(r)
161 } else {
162 if self.bk_idx > 0 {
164 self.slot_idx += 1;
166 self.bk_idx = 0;
167 self.next()
168 } else {
169 self.curleaf = self.leafiter.next();
171 self.slot_idx = 0;
172 self.bk_idx = 0;
173 self.next()
174 }
175 }
176 } else {
177 None
178 }
179 }
180
181 fn size_hint(&self) -> (usize, Option<usize>) {
183 (self.length, Some(self.length))
184 }
185}
186
187pub struct KeyIter<'a, K, V>
189where
190 K: Hash + Eq + Clone + Debug,
191 V: Clone,
192{
193 iter: Iter<'a, K, V>,
194}
195
196impl<'a, K: Clone + Hash + Eq + Debug, V: Clone> KeyIter<'a, K, V> {
197 pub(crate) fn new(root: *mut Node<K, V>, length: usize) -> Self {
198 KeyIter {
199 iter: Iter::new(root, length),
200 }
201 }
202}
203
204impl<'a, K: Clone + Hash + Eq + Debug, V: Clone> Iterator for KeyIter<'a, K, V> {
205 type Item = &'a K;
206
207 fn next(&mut self) -> Option<Self::Item> {
209 self.iter.next().map(|(k, _)| k)
210 }
211
212 fn size_hint(&self) -> (usize, Option<usize>) {
213 self.iter.size_hint()
214 }
215}
216
217pub struct ValueIter<'a, K, V>
219where
220 K: Hash + Eq + Clone + Debug,
221 V: Clone,
222{
223 iter: Iter<'a, K, V>,
224}
225
226impl<K: Clone + Hash + Eq + Debug, V: Clone> ValueIter<'_, K, V> {
227 pub(crate) fn new(root: *mut Node<K, V>, length: usize) -> Self {
228 ValueIter {
229 iter: Iter::new(root, length),
230 }
231 }
232}
233
234impl<'a, K: Clone + Hash + Eq + Debug, V: Clone> Iterator for ValueIter<'a, K, V> {
235 type Item = &'a V;
236
237 fn next(&mut self) -> Option<Self::Item> {
239 self.iter.next().map(|(_, v)| v)
240 }
241
242 fn size_hint(&self) -> (usize, Option<usize>) {
243 self.iter.size_hint()
244 }
245}
246
247#[cfg(test)]
248mod tests {
249 use super::super::cursor::SuperBlock;
250 use super::super::node::{Branch, Leaf, Node, H_CAPACITY};
251 use super::{Iter, LeafIter};
252
253 fn create_leaf_node_full(vbase: usize) -> *mut Node<usize, usize> {
254 assert!(vbase.is_multiple_of(10));
255 let node = Node::new_leaf(0);
256 {
257 let nmut = leaf_ref!(node, usize, usize);
258 for idx in 0..H_CAPACITY {
259 let v = vbase + idx;
260 nmut.insert_or_update(v as u64, v, v);
261 }
262 }
263 node as *mut _
264 }
265
266 #[test]
267 fn test_hashmap2_iter_leafiter_1() {
268 let test_iter: LeafIter<usize, usize> = LeafIter::new_base();
269 assert!(test_iter.count() == 0);
270 }
271
272 #[test]
273 fn test_hashmap2_iter_leafiter_2() {
274 let lnode = create_leaf_node_full(10);
275 let mut test_iter = LeafIter::new(lnode, true);
276
277 assert!(test_iter.size_hint() == (1, Some(1)));
278
279 let lref = test_iter.next().unwrap();
280 assert!(lref.min() == 10);
281 assert!(test_iter.next().is_none());
282 let _sb: SuperBlock<usize, usize> = SuperBlock::new_test(1, lnode as *mut _);
284 }
285
286 #[test]
287 fn test_hashmap2_iter_leafiter_3() {
288 let lnode = create_leaf_node_full(10);
289 let rnode = create_leaf_node_full(20);
290 let root = Node::new_branch(0, lnode, rnode);
291 let mut test_iter: LeafIter<usize, usize> = LeafIter::new(root as *mut _, true);
292
293 assert!(test_iter.size_hint() == (2, Some(2)));
294 let lref = test_iter.next().unwrap();
295 let rref = test_iter.next().unwrap();
296 assert!(lref.min() == 10);
297 assert!(rref.min() == 20);
298 assert!(test_iter.next().is_none());
299 let _sb: SuperBlock<usize, usize> = SuperBlock::new_test(1, root as *mut _);
301 }
302
303 #[test]
304 fn test_hashmap2_iter_leafiter_4() {
305 let l1node = create_leaf_node_full(10);
306 let r1node = create_leaf_node_full(20);
307 let l2node = create_leaf_node_full(30);
308 let r2node = create_leaf_node_full(40);
309 let b1node = Node::new_branch(0, l1node, r1node);
310 let b2node = Node::new_branch(0, l2node, r2node);
311 let root: *mut Branch<usize, usize> =
312 Node::new_branch(0, b1node as *mut _, b2node as *mut _);
313 let mut test_iter: LeafIter<usize, usize> = LeafIter::new(root as *mut _, true);
314
315 assert!(test_iter.size_hint() == (4, Some(4)));
316 let l1ref = test_iter.next().unwrap();
317 let r1ref = test_iter.next().unwrap();
318 let l2ref = test_iter.next().unwrap();
319 let r2ref = test_iter.next().unwrap();
320 assert!(l1ref.min() == 10);
321 assert!(r1ref.min() == 20);
322 assert!(l2ref.min() == 30);
323 assert!(r2ref.min() == 40);
324 assert!(test_iter.next().is_none());
325 let _sb: SuperBlock<usize, usize> = SuperBlock::new_test(1, root as *mut _);
327 }
328
329 #[test]
330 fn test_hashmap2_iter_leafiter_5() {
331 let lnode = create_leaf_node_full(10);
332 let mut test_iter = LeafIter::new(lnode, true);
333
334 assert!(test_iter.size_hint() == (1, Some(1)));
335
336 let lref = test_iter.next().unwrap();
337 assert!(lref.min() == 10);
338 assert!(test_iter.next().is_none());
339 let _sb: SuperBlock<usize, usize> = SuperBlock::new_test(1, lnode as *mut _);
341 }
342
343 #[test]
344 fn test_hashmap2_iter_iter_1() {
345 let lnode = create_leaf_node_full(10);
347 let rnode = create_leaf_node_full(20);
348 let root = Node::new_branch(0, lnode, rnode);
349 let test_iter: Iter<usize, usize> = Iter::new(root as *mut _, H_CAPACITY * 2);
350
351 assert!(test_iter.size_hint() == (H_CAPACITY * 2, Some(H_CAPACITY * 2)));
352 assert!(test_iter.count() == H_CAPACITY * 2);
353 let _sb: SuperBlock<usize, usize> = SuperBlock::new_test(1, root as *mut _);
356 }
357
358 #[test]
359 fn test_hashmap2_iter_iter_2() {
360 let l1node = create_leaf_node_full(10);
361 let r1node = create_leaf_node_full(20);
362 let l2node = create_leaf_node_full(30);
363 let r2node = create_leaf_node_full(40);
364 let b1node = Node::new_branch(0, l1node, r1node);
365 let b2node = Node::new_branch(0, l2node, r2node);
366 let root: *mut Branch<usize, usize> =
367 Node::new_branch(0, b1node as *mut _, b2node as *mut _);
368 let test_iter: Iter<usize, usize> = Iter::new(root as *mut _, H_CAPACITY * 4);
369
370 assert!(test_iter.size_hint() == (H_CAPACITY * 4, Some(H_CAPACITY * 4)));
373 assert!(test_iter.count() == H_CAPACITY * 4);
374 let _sb: SuperBlock<usize, usize> = SuperBlock::new_test(1, root as *mut _);
376 }
377}