1use std::cell::RefCell;
7use std::cell::RefMut;
8use std::rc::Rc;
9use std::iter::Iterator;
10use std::iter::IntoIterator;
11
12use super::prefix::*;
13
14pub struct Tree<P: Prefixable, D> {
18 top: Option<Rc<Node<P, D>>>,
20
21 count: usize,
23}
24
25fn node_match_prefix<P: Prefixable, D>(curr: Option<Rc<Node<P, D>>>, prefix: &P) -> bool {
27 match curr {
28 None => false,
29 Some(node) => {
30 node.prefix.len() <= prefix.len() && node.prefix().contains(prefix)
31 }
32 }
33}
34
35fn same_object<T>(a: *const T, b: *const T) -> bool {
36 a == b
37}
38
39impl<P: Prefixable, D> Tree<P, D> {
43 pub fn new() -> Tree<P, D> {
45 Tree {
46 top: None,
47 count: 0usize,
48 }
49 }
50
51 pub fn top(&self) -> Option<Rc<Node<P, D>>> {
53 self.top.clone()
54 }
55
56 pub fn count(&self) -> usize {
58 self.count
59 }
60
61 pub fn get_node(&mut self, prefix: &P) -> NodeIterator<P, D> {
63 self.get_node_ctor(prefix, None::<Box<dyn Fn() -> D>>)
64 }
65
66 pub fn get_node_ctor<F>(&mut self, prefix: &P, ctor: Option<F>) -> NodeIterator<P, D>
69 where F: Fn() -> D
70 {
71 let mut matched: Option<Rc<Node<P, D>>> = None;
72 let mut curr: Option<Rc<Node<P, D>>> = self.top.clone();
73 let mut new_node: Rc<Node<P, D>>;
74
75 while node_match_prefix(curr.clone(), prefix) {
76 let node = curr.clone().unwrap();
77 if node.prefix().len() == prefix.len() {
78 return NodeIterator::from_node(node)
79 }
80
81 matched = Some(node.clone());
82 curr = node.child_with(prefix.bit_at(node.prefix().len()));
83 }
84
85 match curr.clone() {
86 None => {
87 new_node = Rc::new(Node::new(prefix));
88 match matched {
89 Some(node) => {
90 Node::<P, D>::set_child(node, new_node.clone());
91 },
92 None => {
93 self.top.replace(new_node.clone());
94 }
95 }
96
97 },
98 Some(node) => {
99 new_node = Rc::new(Node::from_common(node.prefix(), prefix));
100 Node::<P, D>::set_child(new_node.clone(), node);
101
102 match matched {
103 Some(node) => {
104 Node::<P, D>::set_child(node, new_node.clone());
105 },
106 None => {
107 self.top.replace(new_node.clone());
108 }
109 }
110
111 if new_node.prefix().len() != prefix.len() {
112 matched = Some(new_node.clone());
113 new_node = Rc::new(Node::new(prefix));
114 Node::<P, D>::set_child(matched.unwrap().clone(), new_node.clone());
115 }
116 }
117 }
118
119 if let Some(ctor) = ctor {
120 new_node.set_data(ctor());
121 }
122 NodeIterator::from_node(new_node)
123 }
124
125 pub fn insert(&mut self, prefix: &P, data: D) -> Option<D> {
129 let it = self.lookup_exact(prefix);
130 match it.node() {
131 Some(node) => {
132 if node.has_data() {
133 Some(data)
134 }
135 else {
136 node.set_data(data);
137 self.count += 1;
138 None
139 }
140 },
141 None => {
142 let mut it = self.get_node(prefix);
143 it.set_data(data);
144 self.count += 1;
145 None
146 }
147 }
148 }
149
150 pub fn update(&mut self, prefix: &P, data: D) -> Option<D> {
154 let it = self.lookup_exact(prefix);
155 match it.node() {
156 Some(node) => {
157 if node.has_data() {
158 node.set_data(data)
159 }
160 else {
161 None
162 }
163 },
164 None => None,
165 }
166 }
167
168 pub fn upsert(&mut self, prefix: &P, data: D) -> Option<D> {
172 let it = self.lookup_exact(prefix);
173 match it.node() {
174 Some(node) => {
175 if !node.has_data() {
176 self.count += 1;
177 }
178 node.set_data(data)
179 },
180 None => {
181 self.get_node(prefix).set_data(data);
182 self.count += 1;
183 None
184 }
185 }
186 }
187
188 pub fn delete(&mut self, prefix: &P) -> Option<D> {
192 let it = self.lookup_exact(prefix);
193 let old_data = match it.node() {
194 Some(node) => {
195 if node.has_data() {
196 self.count -= 1;
197 }
198 node.unset_data()
199 },
200 None => None,
201 };
202 self.erase(it);
203 old_data
204 }
205
206 pub fn lookup_exact(&self, prefix: &P) -> NodeIterator<P, D> {
208 let mut curr = self.top.clone();
209
210 while node_match_prefix(curr.clone(), prefix) {
211 let node = curr.clone().unwrap();
212 if node.prefix().len() == prefix.len() {
213 if node.has_data() {
214 return NodeIterator::from_node(node)
215 }
216 else {
217 break;
218 }
219 }
220
221 curr = node.child_with(prefix.bit_at(node.prefix().len()));
222 }
223
224 NodeIterator { node: None }
225 }
226
227 pub fn lookup(&self, prefix: &P) -> NodeIterator<P, D> {
229 let mut curr = self.top.clone();
230 let mut matched: Option<Rc<Node<P, D>>> = None;
231
232 while node_match_prefix(curr.clone(), prefix) {
233 let node = curr.clone().unwrap();
234 if node.has_data() {
235 matched = Some(node.clone());
236 }
237
238 if node.prefix().len() == prefix.len() {
239 break;
240 }
241
242 curr = node.child_with(prefix.bit_at(node.prefix().len()));
243 }
244
245 if matched.is_some() {
246 NodeIterator::from_node(matched.unwrap())
247 }
248 else {
249 NodeIterator { node: None }
250 }
251 }
252
253 pub fn erase(&mut self, it: NodeIterator<P, D>) -> NodeIterator<P, D> {
255 let curr = it.node();
256 let next = match curr {
257 Some(node) => node.next(),
258 None => None
259 };
260
261 if let Some(target) = curr {
262 let has_left = target.child(Child::Left).is_some();
263 let has_right = target.child(Child::Right).is_some();
264
265 if has_left && has_right {
267 return NodeIterator { node: None }
268 }
269
270 let child = if has_left {
271 target.children[Child::Left as usize].replace(None)
272 } else {
273 target.children[Child::Right as usize].replace(None)
274 };
275
276 let parent = target.parent().clone();
277 if child.is_some() {
278 match parent {
279 Some(parent) => child.clone().unwrap().set_parent(parent.clone()),
280 None => child.clone().unwrap().unset_parent()
281 }
282 }
283
284 let parent = target.parent().clone();
285 match parent {
286 Some(node) => {
287 let bit = if node.has_child_with(Child::Left as u8) && same_object(node.child(Child::Left).unwrap().as_ref(), target.as_ref()) {
289 Child::Left
290 } else {
291 Child::Right
292 };
293
294 match child {
295 None => node.unset_child_at(bit as u8),
296 Some(child) => node.set_child_at(child, bit as u8),
297 }
298 },
299 None => {
300 self.top = child.clone();
301 }
302 }
303
304 let parent = target.parent().clone();
305 if parent.is_some() {
306 let node = parent.clone().unwrap();
307 if !node.is_locked() {
308 self.erase(NodeIterator { node: parent });
309 }
310 }
311 }
312
313 return NodeIterator { node: next }
314 }
315
316 pub fn node_iter(&self) -> NodeIterator<P, D> {
318 NodeIterator::<P, D> {
319 node: self.top.clone()
320 }
321 }
322}
323
324impl<P: Prefixable, D> IntoIterator for &Tree<P, D> {
328 type Item = Rc<Node<P, D>>;
329 type IntoIter = DataIterator<P, D>;
330
331 fn into_iter(self) -> Self::IntoIter {
332 let top = self.top.clone();
333
334 DataIterator::<P, D> {
335 node: top,
336 }
337 }
338}
339
340pub struct NodeIterator<P: Prefixable, D> {
342 node: Option<Rc<Node<P, D>>>,
343}
344
345impl<P: Prefixable, D> NodeIterator<P, D> {
347 pub fn from_node(node: Rc<Node<P, D>>) -> NodeIterator<P, D> {
348 NodeIterator::<P, D> {
349 node: Some(node.clone())
350 }
351 }
352
353 pub fn node(&self) -> &Option<Rc<Node<P, D>>> {
354 &self.node
355 }
356
357 pub fn set_data(&mut self, data: D) {
358 let node = self.node.clone();
359 match node {
360 Some(node) => node.set_data(data),
361 None => None
362 };
363 }
364}
365
366impl<P: Prefixable, D> Iterator for NodeIterator<P, D> {
368 type Item = Rc<Node<P, D>>;
369 fn next(&mut self) -> Option<Rc<Node<P, D>>> {
370 let node = self.node.clone();
371 match node {
372 Some(node) => {
373 self.node = node.next().clone();
374 Some(node)
375 },
376 None => None
377 }
378 }
379}
380
381pub struct DataIterator<P: Prefixable, D> {
383 node: Option<Rc<Node<P, D>>>,
384}
385
386impl<P: Prefixable, D> DataIterator<P, D> {
388 pub fn node(&self) -> &Option<Rc<Node<P, D>>> {
389 &self.node
390 }
391}
392
393impl<P: Prefixable, D> Iterator for DataIterator<P, D> {
395 type Item = Rc<Node<P, D>>;
396 fn next(&mut self) -> Option<Rc<Node<P, D>>> {
397 let node = self.node.clone();
398 match node {
399 Some(node) => {
400 if !node.has_data() {
401 let node = node.next_with_data().clone();
402 match node {
403 Some(node) => {
404 self.node = node.next_with_data().clone();
405 Some(node)
406 },
407 None => return None
408 }
409 }
410 else {
411 self.node = node.next_with_data().clone();
412 Some(node)
413 }
414 },
415 None => None
416 }
417 }
418}
419
420pub enum Child {
424 Left = 0,
425 Right = 1,
426}
427
428pub struct Node<P: Prefixable, D> {
432 parent: RefCell<Option<Rc<Node<P, D>>>>,
434
435 children: [RefCell<Option<Rc<Node<P, D>>>>; 2],
437
438 prefix: P,
440
441 data: RefCell<Option<D>>,
443}
444
445impl<P: Prefixable, D> Node<P, D> {
449 pub fn new(prefix: &P) -> Node<P, D> {
451 Node {
452 parent: RefCell::new(None),
453 children: [RefCell::new(None), RefCell::new(None)],
454 prefix: P::from_prefix(prefix),
455 data: RefCell::new(None),
456 }
457 }
458
459 pub fn from_common(prefix1: &P, prefix2: &P) -> Node<P, D> {
461 let pcommon = P::from_common(prefix1, prefix2);
462 Self::new(&pcommon)
463 }
464
465 pub fn prefix(&self) -> &P {
467 &self.prefix
468 }
469
470 pub fn child(&self, bit: Child) -> Option<Rc<Node<P, D>>> {
472 self.children[bit as usize].borrow_mut().clone()
473 }
474
475 pub fn child_with(&self, bit: u8) -> Option<Rc<Node<P, D>>> {
477 self.children[bit as usize].borrow_mut().clone()
478 }
479
480 pub fn has_child_with(&self, bit: u8) -> bool {
482 if let Some(ref _node) = *self.children[bit as usize].borrow_mut() {
483 true
484 }
485 else {
486 false
487 }
488 }
489
490 pub fn parent(&self) -> Option<Rc<Node<P, D>>> {
492 self.parent.borrow_mut().clone()
493 }
494
495 fn set_child(parent: Rc<Node<P, D>>, child: Rc<Node<P, D>>) {
497 let bit = child.prefix().bit_at(parent.prefix().len());
498 parent.set_child_at(child.clone(), bit);
499 child.set_parent(parent.clone());
500 }
501
502 fn set_child_at(&self, child: Rc<Node<P, D>>, bit: u8) {
504 self.children[bit as usize].borrow_mut().replace(child.clone());
505 }
506
507 fn unset_child_at(&self, bit: u8) {
509 self.children[bit as usize].replace(None);
510 }
511
512 pub fn set_parent(&self, parent: Rc<Node<P, D>>) {
514 self.parent.replace(Some(parent.clone()));
515 }
516
517 pub fn unset_parent(&self) {
519 self.parent.replace(None);
520 }
521
522 pub fn set_data(&self, data: D) -> Option<D> {
524 self.data.replace(Some(data))
525 }
526
527 pub fn unset_data(&self) -> Option<D> {
529 self.data.replace(None)
530 }
531
532 pub fn data(&self) -> RefMut<Option<D>> {
534 self.data.borrow_mut()
535 }
536
537 pub fn has_data(&self) -> bool {
539 self.data.borrow_mut().is_some()
540 }
541
542 pub fn is_locked(&self) -> bool {
544 if self.children[Child::Left as usize].borrow_mut().is_some() {
545 true
546 } else if self.children[Child::Right as usize].borrow_mut().is_some() {
547 true
548 } else if self.has_data() {
549 true
550 } else {
551 false
552 }
553 }
554
555 pub fn next(&self) -> Option<Rc<Node<P, D>>> {
557 if let Some(node) = self.child(Child::Left) {
558 return Some(node.clone())
559 }
560 else if let Some(node) = self.child(Child::Right) {
561 return Some(node.clone())
562 }
563 else {
564 if let Some(parent) = self.parent() {
565 if let Some(l_child) = parent.child(Child::Left) {
566 if l_child.as_ref() as *const _ == self as *const _ {
567 if let Some(r_child) = parent.child(Child::Right) {
568 return Some(r_child.clone())
569 }
570 }
571 }
572
573 let mut curr = parent;
574 while let Some(parent) = curr.parent() {
575 if let Some(l_child) = parent.child(Child::Left) {
576 if l_child.as_ref() as *const _ == curr.as_ref() as *const _ {
577 if let Some(r_child) = parent.child(Child::Right) {
578 return Some(r_child.clone())
579 }
580 }
581 }
582 curr = parent;
583 }
584 }
585 }
586
587 None
588 }
589
590 pub fn next_with_data(&self) -> Option<Rc<Node<P, D>>> {
592 let mut next = self.next();
593
594 while let Some(node) = next {
595 if node.has_data() {
596 return Some(node)
597 }
598 next = node.next();
599 }
600
601 None
602 }
603}
604
605#[cfg(test)]
609mod tests {
610 use super::*;
611 use std::net::Ipv4Addr;
612 use std::net::Ipv6Addr;
613
614 pub struct Data {
615 pub v: u32
616 }
617
618 impl Data {
619 fn new(v: u32) -> Rc<Data> {
620 Rc::new(Data { v: v })
621 }
622 }
623
624 type RouteTableIpv4 = Tree<Prefix<Ipv4Addr>, Rc<Data>>;
625 type RouteTableIpv6 = Tree<Prefix<Ipv6Addr>, Rc<Data>>;
626
627 fn route_ipv4_add(tree: &mut RouteTableIpv4,
628 prefix_str: &str, d: Rc<Data>) -> Result<(), PrefixParseError> {
629 let p = Prefix::<Ipv4Addr>::from_str(prefix_str)?;
630 tree.insert(&p, d);
631
632 Ok(())
633 }
634
635 fn route_ipv4_delete(tree: &mut RouteTableIpv4, prefix_str: &str) -> Result<(), PrefixParseError> {
636 let p = Prefix::<Ipv4Addr>::from_str(prefix_str)?;
637 tree.delete(&p);
638
639 Ok(())
640 }
641
642 fn route_ipv4_lookup(tree: &RouteTableIpv4, prefix_str: &str) -> Result<Option<(Rc<Data>, Prefix<Ipv4Addr>)>, PrefixParseError> {
643 let p = Prefix::<Ipv4Addr>::from_str(prefix_str)?;
644 let it = tree.lookup(&p);
645
646 match it.node().as_ref() {
647 Some(node) => {
648 let data = node.data().clone();
649 match data {
650 Some(data) => Ok(Some((data.clone(), node.prefix().clone()))),
651 None => Ok(None)
652 }
653 },
654 None => Ok(None)
655 }
656 }
657
658 fn route_ipv4_lookup_exact<'a>(tree: &RouteTableIpv4, prefix_str: &str) -> Result<Option<Rc<Data>>, PrefixParseError> {
659 let p = Prefix::<Ipv4Addr>::from_str(prefix_str)?;
660 let it = tree.lookup_exact(&p);
661
662 match it.node().as_ref() {
663 Some(node) => Ok(node.data().clone()),
664 None => Ok(None)
665 }
666 }
667
668 fn route_ipv6_add(tree: &mut RouteTableIpv6,
669 prefix_str: &str, d: Rc<Data>) -> Result<(), PrefixParseError> {
670 let p = Prefix::<Ipv6Addr>::from_str(prefix_str)?;
671 tree.insert(&p, d);
672
673 Ok(())
674 }
675
676 fn route_ipv6_delete(tree: &mut RouteTableIpv6, prefix_str: &str) -> Result<(), PrefixParseError> {
677 let p = Prefix::<Ipv6Addr>::from_str(prefix_str)?;
678 tree.delete(&p);
679
680 Ok(())
681 }
682
683 fn route_ipv6_lookup(tree: &RouteTableIpv6, prefix_str: &str) -> Result<Option<(Rc<Data>, Prefix<Ipv6Addr>)>, PrefixParseError> {
684 let p = Prefix::<Ipv6Addr>::from_str(prefix_str)?;
685 let it = tree.lookup(&p);
686
687 match it.node().as_ref() {
688 Some(node) => {
689 let data = node.data().clone();
690 match data {
691 Some(data) => Ok(Some((data.clone(), node.prefix().clone()))),
692 None => Ok(None)
693 }
694 },
695 None => Ok(None)
696 }
697 }
698
699 fn route_ipv6_lookup_exact<'a>(tree: &RouteTableIpv6, prefix_str: &str) -> Result<Option<Rc<Data>>, PrefixParseError> {
700 let p = Prefix::<Ipv6Addr>::from_str(prefix_str)?;
701 let it = tree.lookup_exact(&p);
702
703 match it.node().as_ref() {
704 Some(node) => Ok(node.data().clone()),
705 None => Ok(None)
706 }
707 }
708
709 #[test]
710 pub fn test_tree_ipv4() {
711 let mut tree = RouteTableIpv4::new();
712
713 route_ipv4_add(&mut tree, "10.10.10.0/24", Data::new(100)).expect("Route add error");
714 route_ipv4_add(&mut tree, "10.10.0.0/16", Data::new(200)).expect("Route add error");
715
716 match route_ipv4_lookup(&tree, "10.10.10.0/24").expect("Route lookup error") {
717 Some((data, _)) => assert_eq!(data.v, 100),
718 None => assert!(false),
719 }
720
721 match route_ipv4_lookup_exact(&tree, "10.10.0.0/16").expect("Route lookup error") {
722 Some(data) => assert_eq!(data.v, 200),
723 None => assert!(false),
724 }
725
726 match route_ipv4_lookup_exact(&tree, "10.10.0.0/20").expect("Route lookup error") {
727 Some(_data) => assert!(false),
728 None => { },
729 }
730
731 match route_ipv4_lookup(&tree, "10.10.0.0/20").expect("Route lookup error") {
732 Some((data, p)) => {
733 assert_eq!(p.len(), 16);
734 assert_eq!(data.v, 200);
735 },
736 None => assert!(false),
737 }
738
739 route_ipv4_add(&mut tree, "0.0.0.0/0", Data::new(0)).expect("Route add error");
740
741 match route_ipv4_lookup(&tree, "10.0.0.0/8").expect("Route lookup error") {
742 Some((_data, p)) => {
743 assert_eq!(p.len(), 0);
744 },
745 None => assert!(false),
746 }
747
748 assert_eq!(tree.count(), 3);
749
750 route_ipv4_delete(&mut tree, "10.10.0.0/20").expect("Route delete error");
752 assert_eq!(tree.count(), 3);
753
754 route_ipv4_add(&mut tree, "1.1.1.1/32", Data::new(0)).expect("Route add error");
755 route_ipv4_add(&mut tree, "192.168.1.0/24", Data::new(0)).expect("Route add error");
756
757 route_ipv4_add(&mut tree, "127.0.0.0/8", Data::new(0)).expect("Route add error");
758 route_ipv4_add(&mut tree, "20.20.0.0/20", Data::new(0)).expect("Route add error");
759 route_ipv4_add(&mut tree, "64.64.64.128/25", Data::new(0)).expect("Route add error");
760
761 let v: Vec<_> = tree.into_iter().map(|n| n.prefix().to_string()).collect();
762 assert_eq!(v, &["0.0.0.0/0", "1.1.1.1/32", "10.10.0.0/16", "10.10.10.0/24", "20.20.0.0/20", "64.64.64.128/25", "127.0.0.0/8", "192.168.1.0/24"]);
763
764 let v: Vec<_> = tree.node_iter().map(|n| n.prefix().to_string()).collect();
765 assert_eq!(v, &["0.0.0.0/0", "0.0.0.0/1", "0.0.0.0/3", "0.0.0.0/4", "1.1.1.1/32", "10.10.0.0/16", "10.10.10.0/24", "20.20.0.0/20", "64.0.0.0/2", "64.64.64.128/25", "127.0.0.0/8", "192.168.1.0/24"]);
766
767 assert_eq!(tree.count(), 8);
768
769 route_ipv4_delete(&mut tree, "10.10.10.0/24").expect("Route add error");
770 route_ipv4_delete(&mut tree, "10.10.0.0/16").expect("Route add error");
771 route_ipv4_delete(&mut tree, "0.0.0.0/0").expect("Route add error");
772 route_ipv4_delete(&mut tree, "1.1.1.1/32").expect("Route add error");
773 route_ipv4_delete(&mut tree, "192.168.1.0/24").expect("Route add error");
774 route_ipv4_delete(&mut tree, "127.0.0.0/8").expect("Route add error");
775 route_ipv4_delete(&mut tree, "20.20.0.0/20").expect("Route add error");
776 route_ipv4_delete(&mut tree, "64.64.64.128/25").expect("Route add error");
777
778 assert_eq!(tree.count(), 0);
779
780 let x: Vec<&str> = [].to_vec();
781
782 let v: Vec<_> = tree.into_iter().map(|n| n.prefix().to_string()).collect();
783 assert_eq!(v, x);
784
785 let v: Vec<_> = tree.node_iter().map(|n| n.prefix().to_string()).collect();
786 assert_eq!(v, x);
787 }
788
789 #[test]
790 pub fn test_tree_ipv6() {
791 let mut tree = RouteTableIpv6::new();
792
793 route_ipv6_add(&mut tree, "2001::/64", Data::new(100)).expect("Route add error");
794 route_ipv6_add(&mut tree, "2001::/48", Data::new(200)).expect("Route add error");
795
796 match route_ipv6_lookup(&tree, "2001::/64").expect("Route lookup error") {
797 Some((data, _)) => assert_eq!(data.v, 100),
798 None => assert!(false),
799 }
800
801 match route_ipv6_lookup_exact(&tree, "2001::/48").expect("Route lookup error") {
802 Some(data) => assert_eq!(data.v, 200),
803 None => assert!(false),
804 }
805
806 match route_ipv6_lookup_exact(&tree, "2001::/56").expect("Route lookup error") {
807 Some(_data) => assert!(false),
808 None => { },
809 }
810
811 match route_ipv6_lookup(&tree, "2001::/56").expect("Route lookup error") {
812 Some((data, p)) => {
813 assert_eq!(p.len(), 48);
814 assert_eq!(data.v, 200);
815 },
816 None => assert!(false),
817 }
818
819 route_ipv6_add(&mut tree, "::/0", Data::new(0)).expect("Route add error");
820
821 match route_ipv6_lookup(&tree, "2001::/32").expect("Route lookup error") {
822 Some((_data, p)) => {
823 assert_eq!(p.len(), 0);
824 },
825 None => assert!(false),
826 }
827
828 assert_eq!(tree.count(), 3);
829
830 route_ipv6_delete(&mut tree, "2001::/56").expect("Route delete error");
832 assert_eq!(tree.count(), 3);
833
834 route_ipv6_add(&mut tree, "2001:db8::1/128", Data::new(0)).expect("Route add error");
835 route_ipv6_add(&mut tree, "3001:a:b::c/64", Data::new(0)).expect("Route add error");
836 route_ipv6_add(&mut tree, "7001:1:1::/64", Data::new(0)).expect("Route add error");
837 route_ipv6_add(&mut tree, "ff80::/10", Data::new(0)).expect("Route add error");
838 route_ipv6_add(&mut tree, "ff00::/8", Data::new(0)).expect("Route add error");
839
840 let v: Vec<_> = tree.into_iter().map(|n| n.prefix().to_string()).collect();
841 assert_eq!(v, &["::/0", "2001::/48", "2001::/64", "2001:db8::1/128", "3001:a:b::c/64", "7001:1:1::/64", "ff00::/8", "ff80::/10"]);
842 let v: Vec<_> = tree.node_iter().map(|n| n.prefix().to_string()).collect();
843 assert_eq!(v, &["::/0", "::/1", "2000::/3", "2001::/20", "2001::/48", "2001::/64", "2001:db8::1/128", "3001:a:b::c/64", "7001:1:1::/64", "ff00::/8", "ff80::/10"]);
844
845 route_ipv6_delete(&mut tree, "2001::/64").expect("Route add error");
846 route_ipv6_delete(&mut tree, "2001::/48").expect("Route add error");
847 route_ipv6_delete(&mut tree, "::/0").expect("Route add error");
848 route_ipv6_delete(&mut tree, "2001:db8::1/128").expect("Route add error");
849 route_ipv6_delete(&mut tree, "3001:a:b::c/64").expect("Route add error");
850 route_ipv6_delete(&mut tree, "7001:1:1::/64").expect("Route add error");
851 route_ipv6_delete(&mut tree, "ff80::/10").expect("Route add error");
852 route_ipv6_delete(&mut tree, "ff00::/8").expect("Route add error");
853
854 assert_eq!(tree.count(), 0);
855
856 let x: Vec<&str> = [].to_vec();
857
858 let v: Vec<_> = tree.into_iter().map(|n| n.prefix().to_string()).collect();
859 assert_eq!(v, x);
860
861 let v: Vec<_> = tree.node_iter().map(|n| n.prefix().to_string()).collect();
862 assert_eq!(v, x);
863 }
864}