1use std::ops::RangeBounds;
2
3use crate::iter::{
4 IntoIter, Iter, IterMap, IterMapMut, IterMut, MapK, MapKV, MapKVMut, MapV, MapVMut, Range,
5 RangeMut,
6};
7use crate::node::Node;
8
9#[derive(Debug)]
10pub struct RadixMap<T> {
11 root: Node<T>,
12 size: usize,
13}
14
15impl<T> Default for RadixMap<T> {
16 fn default() -> Self {
17 RadixMap::new()
18 }
19}
20
21impl<T> RadixMap<T> {
22 pub fn new() -> Self {
23 RadixMap {
24 root: Node::new(&[]),
25 size: 0,
26 }
27 }
28
29 #[inline(always)]
31 pub fn len(&self) -> usize {
32 self.size
33 }
34
35 #[inline(always)]
37 pub fn is_empty(&self) -> bool {
38 self.len() == 0
39 }
40
41 #[inline(always)]
48 pub fn insert<K: AsRef<[u8]>>(&mut self, key: K, value: T) -> Option<T> {
49 let old = self.root.insert(key.as_ref(), value);
50 self.size += old.is_none() as usize;
51 old
52 }
53
54 #[inline(always)]
57 pub fn remove<K: AsRef<[u8]>>(&mut self, key: K) -> Option<T> {
58 let removed = self.root.remove(key.as_ref());
59 self.size -= removed.is_some() as usize;
60 removed
61 }
62
63 #[inline(always)]
65 pub fn get<K: AsRef<[u8]>>(&self, key: K) -> Option<&T> {
66 self.root.get(key.as_ref())
67 }
68
69 #[inline(always)]
71 pub fn get_mut<K: AsRef<[u8]>>(&mut self, key: K) -> Option<&mut T> {
72 self.root.get_mut(key.as_ref())
73 }
74
75 #[inline(always)]
77 pub fn contains_key<K: AsRef<[u8]>>(&self, key: K) -> bool {
78 self.get(key).is_some()
79 }
80
81 #[inline(always)]
85 pub fn iter(&self) -> Iter<T, MapKV<T>> {
86 self.get_iter()
87 }
88
89 #[inline(always)]
93 pub fn iter_mut(&mut self) -> IterMut<T, MapKVMut<T>> {
94 self.get_iter_mut()
95 }
96
97 #[inline(always)]
102 pub fn prefix_iter<K: AsRef<[u8]>>(&self, prefix: K) -> Iter<T, MapKV<T>> {
103 self.get_prefix_iter(prefix)
104 }
105
106 #[inline(always)]
111 pub fn prefix_iter_mut<K: AsRef<[u8]>>(&mut self, prefix: K) -> IterMut<T, MapKVMut<T>> {
112 self.get_prefix_iter_mut(prefix)
113 }
114
115 #[inline(always)]
117 pub fn values(&self) -> Iter<T, MapV<T>> {
118 self.get_iter()
119 }
120
121 #[inline(always)]
123 pub fn values_mut(&mut self) -> IterMut<T, MapVMut<T>> {
124 self.get_iter_mut()
125 }
126
127 #[inline(always)]
129 pub fn prefix_values<K: AsRef<[u8]>>(&self, prefix: K) -> Iter<T, MapV<T>> {
130 self.get_prefix_iter(prefix)
131 }
132
133 #[inline(always)]
135 pub fn prefix_values_mut<K: AsRef<[u8]>>(&mut self, prefix: K) -> IterMut<T, MapVMut<T>> {
136 self.get_prefix_iter_mut(prefix)
137 }
138
139 #[inline(always)]
141 pub fn keys(&self) -> Iter<T, MapK<T>> {
142 self.get_iter()
143 }
144
145 #[inline(always)]
147 pub fn prefix_keys<K: AsRef<[u8]>>(&self, prefix: K) -> Iter<T, MapK<T>> {
148 self.get_prefix_iter(prefix)
149 }
150
151 #[inline(always)]
155 pub fn range<K: AsRef<[u8]>, B: RangeBounds<K>>(&self, bounds: B) -> Range<T, K, B> {
156 Range::new(self.get_iter(), bounds)
157 }
158
159 #[inline(always)]
163 pub fn range_mut<K: AsRef<[u8]>, B: RangeBounds<K>>(&mut self, bounds: B) -> RangeMut<T, K, B> {
164 RangeMut::new(self.get_iter_mut(), bounds)
165 }
166
167 fn get_iter<'a, M: IterMap<'a, T>>(&'a self) -> Iter<'a, T, M> {
168 Iter::new(Some(&self.root), vec![])
169 }
170
171 fn get_iter_mut<'a, M: IterMapMut<'a, T>>(&'a mut self) -> IterMut<'a, T, M> {
172 IterMut::new(Some(&mut self.root), vec![])
173 }
174
175 fn get_prefix_iter<'a, M: IterMap<'a, T>, K: AsRef<[u8]>>(
176 &'a self,
177 prefix: K,
178 ) -> Iter<'a, T, M> {
179 match self.root.find_prefix(prefix.as_ref()) {
180 Some((prefix_len, prefix_node)) => {
181 Iter::new(Some(prefix_node), prefix.as_ref()[..prefix_len].to_vec())
182 }
183 None => Iter::new(None, vec![]),
184 }
185 }
186
187 fn get_prefix_iter_mut<'a, M: IterMapMut<'a, T>, K: AsRef<[u8]>>(
188 &'a mut self,
189 prefix: K,
190 ) -> IterMut<'a, T, M> {
191 match self.root.find_prefix_mut(prefix.as_ref()) {
192 Some((prefix_len, prefix_node)) => {
193 IterMut::new(Some(prefix_node), prefix.as_ref()[..prefix_len].to_vec())
194 }
195 None => IterMut::new(None, vec![]),
196 }
197 }
198
199 #[inline(always)]
200 pub(crate) fn root(&self) -> &Node<T> {
201 &self.root
202 }
203}
204
205impl<T> IntoIterator for RadixMap<T> {
206 type Item = (Box<[u8]>, T);
207 type IntoIter = IntoIter<T>;
208
209 fn into_iter(self) -> Self::IntoIter {
210 IntoIter::new(self.root)
211 }
212}
213
214impl<K: AsRef<[u8]>, T, const N: usize> From<[(K, T); N]> for RadixMap<T> {
215 fn from(items: [(K, T); N]) -> Self {
216 let mut map = RadixMap::new();
217 for (key, value) in items {
218 map.insert(key, value);
219 }
220 map
221 }
222}
223
224impl<K: AsRef<[u8]>, T> FromIterator<(K, T)> for RadixMap<T> {
225 fn from_iter<I: IntoIterator<Item = (K, T)>>(iter: I) -> Self {
226 let mut map = RadixMap::new();
227 for (key, value) in iter {
228 map.insert(key, value);
229 }
230 map
231 }
232}
233
234#[cfg(test)]
235mod tests {
236 use super::*;
237
238 use std::rc::Rc;
239
240 fn populated_map() -> RadixMap<u32> {
241 let mut m = RadixMap::new();
242
243 m.insert("cad", 5);
244 m.insert("abc;0", 1);
245 m.insert("c", 4);
246 m.insert("abb;0", 2);
247 m.insert("ab", 3);
248
249 m
250 }
251
252 #[test]
253 fn test_insert_and_get() {
254 let mut m = RadixMap::new();
255
256 m.insert("abc;0", 1);
257 m.insert("abb;0", 2);
258 m.insert("ab", 3);
259 m.insert("c", 4);
260 m.insert("cad", 5);
261
262 assert_eq!(m.len(), 5);
263
264 assert_eq!(m.get("ab").unwrap(), &3);
265 assert_eq!(m.get("abc;0").unwrap(), &1);
266 assert_eq!(m.get("abb;0").unwrap(), &2);
267 assert_eq!(m.get("c").unwrap(), &4);
268 assert_eq!(m.get("cad").unwrap(), &5);
269
270 assert_eq!(m.get("d"), None);
271 assert_eq!(m.get("ac"), None);
272 assert_eq!(m.get("abd"), None);
273 assert_eq!(m.get("abc;"), None);
274 assert_eq!(m.get("abc;1"), None);
275 assert_eq!(m.get(""), None);
276 }
277
278 #[test]
279 fn test_remove() {
280 let mut m = populated_map();
281
282 assert_eq!(m.len(), 5);
283 assert_eq!(m.get("ab").unwrap(), &3);
284 assert_eq!(m.get("abc;0").unwrap(), &1);
285 assert_eq!(m.get("abb;0").unwrap(), &2);
286 assert_eq!(m.get("c").unwrap(), &4);
287 assert_eq!(m.get("cad").unwrap(), &5);
288
289 assert_eq!(m.remove("ab"), Some(3));
290 assert_eq!(m.len(), 4);
291 assert!(m.get("ab").is_none());
292
293 assert_eq!(m.remove("cad"), Some(5));
294 assert_eq!(m.len(), 3);
295 assert!(m.get("cad").is_none());
296
297 assert_eq!(m.remove("cad"), None);
298 assert_eq!(m.remove("foobar"), None);
299
300 assert_eq!(m.get("abc;0").unwrap(), &1);
301 assert_eq!(m.get("abb;0").unwrap(), &2);
302 assert_eq!(m.get("c").unwrap(), &4);
303 }
304
305 #[test]
306 fn test_with_long_keys() {
307 let mut m = RadixMap::new();
308
309 let key_a = vec![0; 260];
310 let mut key_b = key_a.clone();
311 key_b.extend(&[1, 2, 3]);
312 let mut key_c = key_a.clone();
313 key_c.extend(&[4, 5, 6]);
314 let key_d = vec![0; 520];
315 let key_e = vec![1; 512];
316 let key_f = vec![2; 510];
317
318 m.insert(&key_a, 1);
319 m.insert(&key_b, 2);
320 m.insert(&key_c, 3);
321 m.insert(&key_d, 4);
322 m.insert(&key_e, 5);
323 m.insert(&key_f, 6);
324
325 assert_eq!(m.len(), 6);
326 assert_eq!(m.get(&key_a), Some(&1));
327 assert_eq!(m.get(&key_b), Some(&2));
328 assert_eq!(m.get(&key_c), Some(&3));
329 assert_eq!(m.get(&key_d), Some(&4));
330 assert_eq!(m.get(&key_e), Some(&5));
331 assert_eq!(m.get(&key_f), Some(&6));
332
333 assert_eq!(m.remove(&key_a), Some(1));
335 assert_eq!(m.len(), 5);
336 assert_eq!(m.get(&key_a), None);
337 assert_eq!(m.get(&key_b), Some(&2));
338 assert_eq!(m.get(&key_c), Some(&3));
339 assert_eq!(m.get(&key_d), Some(&4));
340 assert_eq!(m.get(&key_e), Some(&5));
341 assert_eq!(m.get(&key_f), Some(&6));
342
343 assert_eq!(m.remove(&key_d), Some(4));
344 assert_eq!(m.len(), 4);
345 assert_eq!(m.get(&key_a), None);
346 assert_eq!(m.get(&key_b), Some(&2));
347 assert_eq!(m.get(&key_c), Some(&3));
348 assert_eq!(m.get(&key_d), None);
349 assert_eq!(m.get(&key_e), Some(&5));
350 assert_eq!(m.get(&key_f), Some(&6));
351
352 assert_eq!(m.remove(&key_d), None);
354 assert_eq!(m.len(), 4);
355 assert_eq!(m.get(&key_a), None);
356 assert_eq!(m.get(&key_b), Some(&2));
357 assert_eq!(m.get(&key_c), Some(&3));
358 assert_eq!(m.get(&key_d), None);
359 assert_eq!(m.get(&key_e), Some(&5));
360 assert_eq!(m.get(&key_f), Some(&6));
361
362 assert_eq!(m.iter().count(), 4);
364 assert_eq!(m.prefix_iter(&key_a).count(), 2);
365 assert_eq!(m.prefix_iter(&[0]).count(), 2);
366 assert_eq!(m.prefix_iter(&[1]).count(), 1);
367 assert_eq!(m.prefix_iter(&[2]).count(), 1);
368 assert_eq!(m.prefix_iter(&[3]).count(), 0);
369 assert_eq!(m.prefix_iter(&key_d).count(), 0);
370 }
371
372 #[test]
373 fn test_iter() {
374 let m = populated_map();
375
376 let mut it = m.iter();
377
378 let (k, v) = it.next().unwrap();
379 assert_eq!(k.as_ref(), b"ab");
380 assert_eq!(v, &3);
381 let (k, v) = it.next().unwrap();
382 assert_eq!(k.as_ref(), b"abb;0");
383 assert_eq!(v, &2);
384 let (k, v) = it.next().unwrap();
385 assert_eq!(k.as_ref(), b"abc;0");
386 assert_eq!(v, &1);
387 let (k, v) = it.next().unwrap();
388 assert_eq!(k.as_ref(), b"c");
389 assert_eq!(v, &4);
390 let (k, v) = it.next().unwrap();
391 assert_eq!(k.as_ref(), b"cad");
392 assert_eq!(v, &5);
393
394 assert_eq!(it.next(), None);
395 }
396
397 #[test]
398 fn test_iter_mut() {
399 let mut m = populated_map();
400
401 let mut it = m.iter_mut();
402
403 let (k, v) = it.next().unwrap();
404 assert_eq!(k.as_ref(), b"ab");
405 assert_eq!(v, &mut 3);
406 let (k, v) = it.next().unwrap();
407 assert_eq!(k.as_ref(), b"abb;0");
408 assert_eq!(v, &mut 2);
409 let (k, v) = it.next().unwrap();
410 assert_eq!(k.as_ref(), b"abc;0");
411 assert_eq!(v, &mut 1);
412 let (k, v) = it.next().unwrap();
413 assert_eq!(k.as_ref(), b"c");
414 assert_eq!(v, &mut 4);
415 let (k, v) = it.next().unwrap();
416 assert_eq!(k.as_ref(), b"cad");
417 assert_eq!(v, &mut 5);
418
419 assert_eq!(it.next(), None);
420
421 assert_eq!(m.get("cad"), Some(&5));
423 assert_eq!(m.get("abc;0"), Some(&1));
424 assert_eq!(m.get("c"), Some(&4));
425 assert_eq!(m.get("abb;0"), Some(&2));
426 assert_eq!(m.get("ab"), Some(&3));
427
428 let mut it = m.iter_mut();
429
430 let _ = it.next().unwrap();
431 let (k, v) = it.next().unwrap();
432 assert_eq!(k.as_ref(), b"abb;0");
433 assert_eq!(v, &mut 2);
434 *v = 100;
435
436 for _ in 0..3 {
437 let _ = it.next().unwrap();
438 }
439 assert_eq!(it.next(), None);
440
441 assert_eq!(m.get("cad"), Some(&5));
442 assert_eq!(m.get("abc;0"), Some(&1));
443 assert_eq!(m.get("c"), Some(&4));
444 assert_eq!(m.get("abb;0"), Some(&100));
445 assert_eq!(m.get("ab"), Some(&3));
446 }
447
448 #[test]
449 fn test_prefix_iter() {
450 let m = populated_map();
451
452 let mut it = m.prefix_iter(b"ab");
453 let (k, v) = it.next().unwrap();
454 assert_eq!(k.as_ref(), b"ab");
455 assert_eq!(v, &3);
456 let (k, v) = it.next().unwrap();
457 assert_eq!(k.as_ref(), b"abb;0");
458 assert_eq!(v, &2);
459 let (k, v) = it.next().unwrap();
460 assert_eq!(k.as_ref(), b"abc;0");
461 assert_eq!(v, &1);
462 assert_eq!(it.next(), None);
463
464 let mut it = m.prefix_iter(b"abb");
465 let (k, v) = it.next().unwrap();
466 assert_eq!(k.as_ref(), b"abb;0");
467 assert_eq!(v, &2);
468 assert_eq!(it.next(), None);
469
470 let mut it = m.prefix_iter(b"c");
471 let (k, v) = it.next().unwrap();
472 assert_eq!(k.as_ref(), b"c");
473 assert_eq!(v, &4);
474 let (k, v) = it.next().unwrap();
475 assert_eq!(k.as_ref(), b"cad");
476 assert_eq!(v, &5);
477 assert_eq!(it.next(), None);
478
479 let mut it = m.prefix_iter(b"ca");
480 let (k, v) = it.next().unwrap();
481 assert_eq!(k.as_ref(), b"cad");
482 assert_eq!(v, &5);
483 assert_eq!(it.next(), None);
484
485 let mut it = m.prefix_iter(b"cad");
486 let (k, v) = it.next().unwrap();
487 assert_eq!(k.as_ref(), b"cad");
488 assert_eq!(v, &5);
489 assert_eq!(it.next(), None);
490
491 let mut it = m.prefix_iter(b"cada");
492 assert_eq!(it.next(), None);
493
494 let mut it = m.prefix_iter(b"abd");
495 assert_eq!(it.next(), None);
496 }
497
498 #[test]
499 fn test_prefix_iter_mut() {
500 let mut m = populated_map();
501
502 let mut it = m.prefix_iter_mut(b"ab");
503 let (k, v) = it.next().unwrap();
504 assert_eq!(k.as_ref(), b"ab");
505 assert_eq!(v, &mut 3);
506 let (k, v) = it.next().unwrap();
507 assert_eq!(k.as_ref(), b"abb;0");
508 assert_eq!(v, &mut 2);
509 let (k, v) = it.next().unwrap();
510 assert_eq!(k.as_ref(), b"abc;0");
511 assert_eq!(v, &mut 1);
512 assert_eq!(it.next(), None);
513
514 let mut it = m.prefix_iter_mut(b"abb");
515 let (k, v) = it.next().unwrap();
516 assert_eq!(k.as_ref(), b"abb;0");
517 assert_eq!(v, &mut 2);
518 assert_eq!(it.next(), None);
519
520 let mut it = m.prefix_iter_mut(b"c");
521 let (k, v) = it.next().unwrap();
522 assert_eq!(k.as_ref(), b"c");
523 assert_eq!(v, &mut 4);
524 let (k, v) = it.next().unwrap();
525 assert_eq!(k.as_ref(), b"cad");
526 assert_eq!(v, &mut 5);
527 assert_eq!(it.next(), None);
528
529 let mut it = m.prefix_iter_mut(b"ca");
530 let (k, v) = it.next().unwrap();
531 assert_eq!(k.as_ref(), b"cad");
532 assert_eq!(v, &mut 5);
533 assert_eq!(it.next(), None);
534
535 let mut it = m.prefix_iter_mut(b"cad");
536 let (k, v) = it.next().unwrap();
537 assert_eq!(k.as_ref(), b"cad");
538 assert_eq!(v, &mut 5);
539 assert_eq!(it.next(), None);
540
541 let mut it = m.prefix_iter_mut(b"cada");
542 assert_eq!(it.next(), None);
543
544 let mut it = m.prefix_iter_mut(b"abd");
545 assert_eq!(it.next(), None);
546 }
547
548 #[test]
549 fn test_range() {
550 let mut m = RadixMap::new();
551 m.insert("aa", 1);
552 m.insert("ab", 2);
553 m.insert("ac", 3);
554 m.insert("ad", 4);
555 m.insert("ba", 5);
556 m.insert("bb", 6);
557 m.insert("bc", 7);
558 m.insert("bd", 8);
559
560 assert_eq!(m.range::<&[u8], _>(..).count(), 8);
561 assert_eq!(m.range("a"..).count(), 8);
562 assert_eq!(m.range("a".."b").count(), 4);
563 assert_eq!(m.range("a"..="b").count(), 4);
564 assert_eq!(m.range("a"..="ba").count(), 5);
565 assert_eq!(m.range("ab"..="ba").count(), 4);
566 assert_eq!(m.range("ae"..).count(), 4);
567
568 for ((k1, v1), (k2, v2)) in m.range("a"..).zip(m.iter().take(4)) {
569 assert_eq!(k1.as_ref(), k2.as_ref());
570 assert_eq!(*v1, *v2);
571 }
572
573 for ((k1, v1), (k2, v2)) in m.range("ab"..="ba").zip(m.iter().skip(1).take(4)) {
574 assert_eq!(k1.as_ref(), k2.as_ref());
575 assert_eq!(*v1, *v2);
576 }
577
578 assert_eq!(m.range("b"..).count(), 4);
579 assert_eq!(m.range("b".."b").count(), 0);
580 assert_eq!(m.range("b"..="b").count(), 0);
581 assert_eq!(m.range("b"..="be").count(), 4);
582 assert_eq!(m.range("bb".."bc").count(), 1);
583 assert_eq!(m.range("bb"..="bc").count(), 2);
584
585 for ((k1, v1), (k2, v2)) in m.range("bb"..="bc").zip(m.iter().skip(5).take(2)) {
586 assert_eq!(k1.as_ref(), k2.as_ref());
587 assert_eq!(*v1, *v2);
588 }
589
590 assert_eq!(m.range("be"..).count(), 0);
591 assert_eq!(m.range("c"..).count(), 0);
592 }
593
594 #[test]
595 fn test_range_mut() {
596 let mut m = RadixMap::new();
597 m.insert("aa", 1);
598 m.insert("ab", 2);
599 m.insert("ac", 3);
600 m.insert("ad", 4);
601 m.insert("ba", 5);
602 m.insert("bb", 6);
603 m.insert("bc", 7);
604 m.insert("bd", 8);
605
606 assert_eq!(m.range_mut::<&[u8], _>(..).count(), 8);
607 assert_eq!(m.range_mut("a"..).count(), 8);
608 assert_eq!(m.range_mut("a".."b").count(), 4);
609 assert_eq!(m.range_mut("a"..="b").count(), 4);
610 assert_eq!(m.range_mut("a"..="ba").count(), 5);
611 assert_eq!(m.range_mut("ab"..="ba").count(), 4);
612 assert_eq!(m.range_mut("ae"..).count(), 4);
613
614 for ((k1, v1), (k2, v2)) in m.range("a"..).zip(m.iter().take(4)) {
615 assert_eq!(k1.as_ref(), k2.as_ref());
616 assert_eq!(*v1, *v2);
617 }
618
619 for ((k1, v1), (k2, v2)) in m.range("ab"..="ba").zip(m.iter().skip(1).take(4)) {
620 assert_eq!(k1.as_ref(), k2.as_ref());
621 assert_eq!(*v1, *v2);
622 }
623
624 assert_eq!(m.range_mut("b"..).count(), 4);
625 assert_eq!(m.range_mut("b".."b").count(), 0);
626 assert_eq!(m.range_mut("b"..="b").count(), 0);
627 assert_eq!(m.range_mut("b"..="be").count(), 4);
628 assert_eq!(m.range_mut("bb".."bc").count(), 1);
629 assert_eq!(m.range_mut("bb"..="bc").count(), 2);
630
631 for ((k1, v1), (k2, v2)) in m.range("bb"..="bc").zip(m.iter().skip(5).take(2)) {
632 assert_eq!(k1.as_ref(), k2.as_ref());
633 assert_eq!(*v1, *v2);
634 }
635
636 assert_eq!(m.range_mut("be"..).count(), 0);
637 assert_eq!(m.range_mut("c"..).count(), 0);
638
639 let (_, v) = m.range_mut("bb".."bc").next().unwrap();
640 *v = 66;
641
642 assert_eq!(m.get("bb"), Some(&66));
643 }
644
645 #[test]
646 fn test_from() {
647 let map = RadixMap::<u64>::from([("foo", 1), ("bar", 2), ("baz", 3), ("foo", 4)]);
648
649 assert_eq!(map.len(), 3);
650
651 let mut it = map.iter();
652 assert_eq!(it.next(), Some(("bar".as_bytes().into(), &2)));
653 assert_eq!(it.next(), Some(("baz".as_bytes().into(), &3)));
654 assert_eq!(it.next(), Some(("foo".as_bytes().into(), &4)));
655 assert!(it.next().is_none());
656 }
657
658 #[test]
659 fn test_from_iterator() {
660 let map: RadixMap<u64> = vec![("foo", 1), ("bar", 2), ("baz", 3), ("foo", 4)]
661 .into_iter()
662 .collect();
663
664 assert_eq!(map.len(), 3);
665
666 let mut it = map.iter();
667 assert_eq!(it.next(), Some(("bar".as_bytes().into(), &2)));
668 assert_eq!(it.next(), Some(("baz".as_bytes().into(), &3)));
669 assert_eq!(it.next(), Some(("foo".as_bytes().into(), &4)));
670 assert!(it.next().is_none());
671 }
672
673 #[test]
674 fn test_into_iter() {
675 let m = populated_map();
676 assert_eq!(m.len(), 5);
677
678 let mut it = m.into_iter();
679
680 let (k, v) = it.next().unwrap();
681 assert_eq!(k.as_ref(), b"ab");
682 assert_eq!(v, 3);
683
684 let (k, v) = it.next().unwrap();
685 assert_eq!(k.as_ref(), b"abb;0");
686 assert_eq!(v, 2);
687
688 let (k, v) = it.next().unwrap();
689 assert_eq!(k.as_ref(), b"abc;0");
690 assert_eq!(v, 1);
691
692 let (k, v) = it.next().unwrap();
693 assert_eq!(k.as_ref(), b"c");
694 assert_eq!(v, 4);
695
696 let (k, v) = it.next().unwrap();
697 assert_eq!(k.as_ref(), b"cad");
698 assert_eq!(v, 5);
699
700 assert!(it.next().is_none());
701 }
702
703 #[test]
704 fn test_into_iter_drops_internal_values() {
705 let rc = Rc::new(());
706
707 let mut m = RadixMap::new();
708 m.insert("a", rc.clone());
709 m.insert("aba", rc.clone());
710 m.insert("cat", rc.clone());
711
712 let _: Vec<(Box<[u8]>, Rc<()>)> = m.into_iter().collect();
713 assert_eq!(Rc::strong_count(&rc), 1);
714 }
715
716 #[test]
717 fn test_into_iter_unfinished() {
718 let rc = Rc::new(());
719
720 let mut m = RadixMap::new();
721 m.insert("a", rc.clone());
722 m.insert("aba", rc.clone());
723 m.insert("cat", rc.clone());
724
725 let mut it = m.into_iter();
726 let _ = it.next().unwrap();
727 drop(it);
728
729 assert_eq!(Rc::strong_count(&rc), 1);
730 }
731}