1use std::cmp::Ord;
14use std::cmp::Ordering;
15use std::fmt::{self, Debug};
16use std::iter::{FromIterator, IntoIterator};
17use std::marker;
18use std::mem;
19use std::ops::Index;
20use std::ptr;
21
22#[derive(Debug, Copy, Clone, PartialEq, Eq)]
23enum Color {
24 Red,
25 Black,
26}
27
28struct RBTreeNode<K: Ord, V> {
30 color: Color,
31 left: NodePtr<K, V>,
32 right: NodePtr<K, V>,
33 parent: NodePtr<K, V>,
34 key: K,
35 value: V,
36}
37
38impl<K: Ord, V> RBTreeNode<K, V> {
39 #[inline]
40 fn pair(self) -> (K, V) {
41 (self.key, self.value)
42 }
43}
44
45impl<K, V> Debug for RBTreeNode<K, V>
46where
47 K: Ord + Debug,
48 V: Debug,
49{
50 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
51 write!(f, "k:{:?} v:{:?} c:{:?}", self.key, self.value, self.color)
52 }
53}
54
55#[derive(Debug)]
57struct NodePtr<K: Ord, V>(*mut RBTreeNode<K, V>);
58
59impl<K: Ord, V> Clone for NodePtr<K, V> {
60 fn clone(&self) -> NodePtr<K, V> {
61 NodePtr(self.0)
62 }
63}
64
65impl<K: Ord, V> Copy for NodePtr<K, V> {}
66
67impl<K: Ord, V> Ord for NodePtr<K, V> {
68 fn cmp(&self, other: &NodePtr<K, V>) -> Ordering {
69 unsafe { (*self.0).key.cmp(&(*other.0).key) }
70 }
71}
72
73impl<K: Ord, V> PartialOrd for NodePtr<K, V> {
74 fn partial_cmp(&self, other: &NodePtr<K, V>) -> Option<Ordering> {
75 unsafe { Some((*self.0).key.cmp(&(*other.0).key)) }
76 }
77}
78
79impl<K: Ord, V> PartialEq for NodePtr<K, V> {
80 fn eq(&self, other: &NodePtr<K, V>) -> bool {
81 self.0 == other.0
82 }
83}
84
85impl<K: Ord, V> Eq for NodePtr<K, V> {}
86
87impl<K: Ord, V> NodePtr<K, V> {
88 fn new(k: K, v: V) -> NodePtr<K, V> {
89 let node = RBTreeNode {
90 color: Color::Black,
91 left: NodePtr::null(),
92 right: NodePtr::null(),
93 parent: NodePtr::null(),
94 key: k,
95 value: v,
96 };
97 NodePtr(Box::into_raw(Box::new(node)))
98 }
99
100 #[inline]
101 fn set_color(&mut self, color: Color) {
102 if self.is_null() {
103 return;
104 }
105 unsafe {
106 (*self.0).color = color;
107 }
108 }
109
110 #[inline]
111 fn set_red_color(&mut self) {
112 self.set_color(Color::Red);
113 }
114
115 #[inline]
116 fn set_black_color(&mut self) {
117 self.set_color(Color::Black);
118 }
119
120 #[inline]
121 fn get_color(&self) -> Color {
122 if self.is_null() {
123 return Color::Black;
124 }
125 unsafe { (*self.0).color }
126 }
127
128 #[inline]
129 fn is_red_color(&self) -> bool {
130 if self.is_null() {
131 return false;
132 }
133 unsafe { (*self.0).color == Color::Red }
134 }
135
136 #[inline]
137 fn is_black_color(&self) -> bool {
138 if self.is_null() {
139 return true;
140 }
141 unsafe { (*self.0).color == Color::Black }
142 }
143
144 #[inline]
145 fn is_left_child(&self) -> bool {
146 self.parent().left() == *self
147 }
148
149 #[inline]
150 fn is_right_child(&self) -> bool {
151 self.parent().right() == *self
152 }
153
154 #[inline]
155 fn min_node(self) -> NodePtr<K, V> {
156 let mut temp = self.clone();
157 while !temp.left().is_null() {
158 temp = temp.left();
159 }
160 return temp;
161 }
162
163 #[inline]
164 fn max_node(self) -> NodePtr<K, V> {
165 let mut temp = self.clone();
166 while !temp.right().is_null() {
167 temp = temp.right();
168 }
169 return temp;
170 }
171
172 #[inline]
173 fn next(self) -> NodePtr<K, V> {
174 if !self.right().is_null() {
175 self.right().min_node()
176 } else {
177 let mut temp = self;
178 loop {
179 if temp.parent().is_null() {
180 return NodePtr::null();
181 }
182 if temp.is_left_child() {
183 return temp.parent();
184 }
185 temp = temp.parent();
186 }
187 }
188 }
189
190 #[inline]
191 fn prev(self) -> NodePtr<K, V> {
192 if !self.left().is_null() {
193 self.left().max_node()
194 } else {
195 let mut temp = self;
196 loop {
197 if temp.parent().is_null() {
198 return NodePtr::null();
199 }
200 if temp.is_right_child() {
201 return temp.parent();
202 }
203 temp = temp.parent();
204 }
205 }
206 }
207
208 #[inline]
209 fn set_parent(&mut self, parent: NodePtr<K, V>) {
210 if self.is_null() {
211 return;
212 }
213 unsafe { (*self.0).parent = parent }
214 }
215
216 #[inline]
217 fn set_left(&mut self, left: NodePtr<K, V>) {
218 if self.is_null() {
219 return;
220 }
221 unsafe { (*self.0).left = left }
222 }
223
224 #[inline]
225 fn set_right(&mut self, right: NodePtr<K, V>) {
226 if self.is_null() {
227 return;
228 }
229 unsafe { (*self.0).right = right }
230 }
231
232 #[inline]
233 fn parent(&self) -> NodePtr<K, V> {
234 if self.is_null() {
235 return NodePtr::null();
236 }
237 unsafe { (*self.0).parent.clone() }
238 }
239
240 #[inline]
241 fn left(&self) -> NodePtr<K, V> {
242 if self.is_null() {
243 return NodePtr::null();
244 }
245 unsafe { (*self.0).left.clone() }
246 }
247
248 #[inline]
249 fn right(&self) -> NodePtr<K, V> {
250 if self.is_null() {
251 return NodePtr::null();
252 }
253 unsafe { (*self.0).right.clone() }
254 }
255
256 #[inline]
257 fn null() -> NodePtr<K, V> {
258 NodePtr(ptr::null_mut())
259 }
260
261 #[inline]
262 fn is_null(&self) -> bool {
263 self.0.is_null()
264 }
265}
266
267impl<K: Ord + Clone, V: Clone> NodePtr<K, V> {
268 unsafe fn deep_clone(&self) -> NodePtr<K, V> {
269 let mut node = NodePtr::new((*self.0).key.clone(), (*self.0).value.clone());
270 if !self.left().is_null() {
271 node.set_left(self.left().deep_clone());
272 node.left().set_parent(node);
273 }
274 if !self.right().is_null() {
275 node.set_right(self.right().deep_clone());
276 node.right().set_parent(node);
277 }
278 node
279 }
280}
281
282pub struct RBTree<K: Ord, V> {
337 root: NodePtr<K, V>,
338 len: usize,
339}
340
341unsafe impl<K: Ord, V> Send for RBTree<K, V> {
342}
343
344unsafe impl<K: Ord, V> Sync for RBTree<K, V> {
345}
346
347impl<K: Ord, V> Drop for RBTree<K, V> {
349 #[inline]
350 fn drop(&mut self) {
351 self.clear();
352 }
353}
354
355impl<K: Ord + Clone, V: Clone> Clone for RBTree<K, V> {
357 fn clone(&self) -> RBTree<K, V> {
358 unsafe {
359 let mut new = RBTree::new();
360 new.root = self.root.deep_clone();
361 new.len = self.len;
362 new
363 }
364 }
365}
366
367impl<K, V> Debug for RBTree<K, V>
368where
369 K: Ord + Debug,
370 V: Debug,
371{
372 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
373 f.debug_map().entries(self.iter()).finish()
374 }
375}
376
377impl<K: Ord + Debug, V: Debug> RBTree<K, V> {
379 fn tree_print(&self, node: NodePtr<K, V>, direction: i32) {
380 if node.is_null() {
381 return;
382 }
383 if direction == 0 {
384 unsafe {
385 println!("'{:?}' is root node", (*node.0));
386 }
387 } else {
388 let direct = if direction == -1 { "left" } else { "right" };
389 unsafe {
390 println!(
391 "{:?} is {:?}'s {:?} child ",
392 (*node.0),
393 *node.parent().0,
394 direct
395 );
396 }
397 }
398 self.tree_print(node.left(), -1);
399 self.tree_print(node.right(), 1);
400 }
401
402 pub fn print_tree(&self) {
403 if self.root.is_null() {
404 println!("This is a empty tree");
405 return;
406 }
407 println!("This tree size = {:?}, begin:-------------", self.len());
408 self.tree_print(self.root, 0);
409 println!("end--------------------------");
410 }
411}
412
413impl<K, V> PartialEq for RBTree<K, V>
415where
416 K: Eq + Ord,
417 V: PartialEq,
418{
419 fn eq(&self, other: &RBTree<K, V>) -> bool {
420 if self.len() != other.len() {
421 return false;
422 }
423
424 self.iter()
425 .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
426 }
427}
428
429impl<K, V> Eq for RBTree<K, V>
430where
431 K: Eq + Ord,
432 V: Eq,
433{
434}
435
436impl<'a, K, V> Index<&'a K> for RBTree<K, V>
437where
438 K: Ord,
439{
440 type Output = V;
441
442 #[inline]
443 fn index(&self, index: &K) -> &V {
444 self.get(index).expect("no entry found for key")
445 }
446}
447
448impl<K: Ord, V> FromIterator<(K, V)> for RBTree<K, V> {
449 fn from_iter<T: IntoIterator<Item = (K, V)>>(iter: T) -> RBTree<K, V> {
450 let mut tree = RBTree::new();
451 tree.extend(iter);
452 tree
453 }
454}
455
456impl<K: Ord, V> Extend<(K, V)> for RBTree<K, V> {
458 fn extend<T: IntoIterator<Item = (K, V)>>(&mut self, iter: T) {
459 let iter = iter.into_iter();
460 for (k, v) in iter {
461 self.insert(k, v);
462 }
463 }
464}
465
466pub struct Keys<'a, K: Ord + 'a, V: 'a> {
479 inner: Iter<'a, K, V>,
480}
481
482impl<'a, K: Ord, V> Clone for Keys<'a, K, V> {
483 fn clone(&self) -> Keys<'a, K, V> {
484 Keys {
485 inner: self.inner.clone(),
486 }
487 }
488}
489
490impl<'a, K: Ord + Debug, V> fmt::Debug for Keys<'a, K, V> {
491 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
492 f.debug_list().entries(self.clone()).finish()
493 }
494}
495
496impl<'a, K: Ord, V> Iterator for Keys<'a, K, V> {
497 type Item = &'a K;
498
499 #[inline]
500 fn next(&mut self) -> Option<&'a K> {
501 self.inner.next().map(|(k, _)| k)
502 }
503
504 #[inline]
505 fn size_hint(&self) -> (usize, Option<usize>) {
506 self.inner.size_hint()
507 }
508}
509
510pub struct Drain<'a, K: Ord + 'a, V: 'a> {
511 base: &'a mut RBTree<K, V>,
512}
513
514impl<'a, K: Ord, V> Iterator for Drain<'a, K, V> {
515 type Item = (K, V);
516
517 #[inline]
518 fn next(&mut self) -> Option<(K, V)> {
519 self.base.pop_first()
520 }
521
522 #[inline]
523 fn size_hint(&self) -> (usize, Option<usize>) {
524 (self.base.len(), Some(self.base.len()))
525 }
526}
527
528pub struct Values<'a, K: 'a + Ord, V: 'a> {
542 inner: Iter<'a, K, V>,
543}
544
545impl<'a, K: Ord, V> Clone for Values<'a, K, V> {
546 fn clone(&self) -> Values<'a, K, V> {
547 Values {
548 inner: self.inner.clone(),
549 }
550 }
551}
552
553impl<'a, K: Ord + Debug, V: Debug> fmt::Debug for Values<'a, K, V> {
554 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
555 f.debug_list().entries(self.clone()).finish()
556 }
557}
558
559impl<'a, K: Ord, V> Iterator for Values<'a, K, V> {
560 type Item = &'a V;
561
562 #[inline]
563 fn next(&mut self) -> Option<&'a V> {
564 self.inner.next().map(|(_, v)| v)
565 }
566
567 #[inline]
568 fn size_hint(&self) -> (usize, Option<usize>) {
569 self.inner.size_hint()
570 }
571}
572
573pub struct ValuesMut<'a, K: 'a + Ord, V: 'a> {
590 inner: IterMut<'a, K, V>,
591}
592
593impl<'a, K: Ord, V> Clone for ValuesMut<'a, K, V> {
594 fn clone(&self) -> ValuesMut<'a, K, V> {
595 ValuesMut {
596 inner: self.inner.clone(),
597 }
598 }
599}
600
601impl<'a, K: Ord + Debug, V: Debug> fmt::Debug for ValuesMut<'a, K, V> {
602 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
603 f.debug_list().entries(self.clone()).finish()
604 }
605}
606
607impl<'a, K: Ord, V> Iterator for ValuesMut<'a, K, V> {
608 type Item = &'a mut V;
609
610 #[inline]
611 fn next(&mut self) -> Option<&'a mut V> {
612 self.inner.next().map(|(_, v)| v)
613 }
614
615 #[inline]
616 fn size_hint(&self) -> (usize, Option<usize>) {
617 self.inner.size_hint()
618 }
619}
620
621pub struct IntoIter<K: Ord, V> {
623 head: NodePtr<K, V>,
624 tail: NodePtr<K, V>,
625 len: usize,
626}
627
628impl<K: Ord, V> Drop for IntoIter<K, V> {
630 #[inline]
631 fn drop(&mut self) {
632 for (_, _) in self {}
633 }
634}
635
636impl<K: Ord, V> Iterator for IntoIter<K, V> {
637 type Item = (K, V);
638
639 fn next(&mut self) -> Option<(K, V)> {
640 if self.len == 0 {
641 return None;
642 }
643
644 if self.head.is_null() {
645 return None;
646 }
647
648 let next = self.head.next();
649 let (k, v) = unsafe {
650 (
651 core::ptr::read(&(*self.head.0).key),
652 core::ptr::read(&(*self.head.0).value),
653 )
654 };
655 self.head = next;
656 self.len -= 1;
657 Some((k, v))
658 }
659
660 fn size_hint(&self) -> (usize, Option<usize>) {
661 (self.len, Some(self.len))
662 }
663}
664
665impl<K: Ord, V> DoubleEndedIterator for IntoIter<K, V> {
666 #[inline]
667 fn next_back(&mut self) -> Option<(K, V)> {
668 if self.len == 0 {
669 return None;
670 }
671
672 if self.tail.is_null() {
673 return None;
674 }
675
676 let prev = self.tail.prev();
677 let obj = unsafe { Box::from_raw(self.tail.0) };
678 let (k, v) = obj.pair();
679 self.tail = prev;
680 self.len -= 1;
681 Some((k, v))
682 }
683}
684
685pub struct Iter<'a, K: Ord + 'a, V: 'a> {
702 head: NodePtr<K, V>,
703 tail: NodePtr<K, V>,
704 len: usize,
705 _marker: marker::PhantomData<&'a ()>,
706}
707
708impl<'a, K: Ord + 'a, V: 'a> Clone for Iter<'a, K, V> {
709 fn clone(&self) -> Iter<'a, K, V> {
710 Iter {
711 head: self.head,
712 tail: self.tail,
713 len: self.len,
714 _marker: self._marker,
715 }
716 }
717}
718
719impl<'a, K: Ord + 'a, V: 'a> Iterator for Iter<'a, K, V> {
720 type Item = (&'a K, &'a V);
721
722 fn next(&mut self) -> Option<(&'a K, &'a V)> {
723 if self.len == 0 {
724 return None;
725 }
726
727 if self.head.is_null() {
728 return None;
729 }
730
731 let (k, v) = unsafe { (&(*self.head.0).key, &(*self.head.0).value) };
732 self.head = self.head.next();
733 self.len -= 1;
734 Some((k, v))
735 }
736
737 fn size_hint(&self) -> (usize, Option<usize>) {
738 (self.len, Some(self.len))
739 }
740}
741
742impl<'a, K: Ord + 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
743 #[inline]
744 fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
745 if self.len == 0 {
747 return None;
748 }
749
750 let (k, v) = unsafe { (&(*self.tail.0).key, &(*self.tail.0).value) };
751 self.tail = self.tail.prev();
752 self.len -= 1;
753 Some((k, v))
754 }
755}
756
757pub struct IterMut<'a, K: Ord + 'a, V: 'a> {
774 head: NodePtr<K, V>,
775 tail: NodePtr<K, V>,
776 len: usize,
777 _marker: marker::PhantomData<&'a ()>,
778}
779
780impl<'a, K: Ord + 'a, V: 'a> Clone for IterMut<'a, K, V> {
781 fn clone(&self) -> IterMut<'a, K, V> {
782 IterMut {
783 head: self.head,
784 tail: self.tail,
785 len: self.len,
786 _marker: self._marker,
787 }
788 }
789}
790
791impl<'a, K: Ord + 'a, V: 'a> Iterator for IterMut<'a, K, V> {
792 type Item = (&'a K, &'a mut V);
793
794 fn next(&mut self) -> Option<(&'a K, &'a mut V)> {
795 if self.len == 0 {
796 return None;
797 }
798
799 if self.head.is_null() {
800 return None;
801 }
802
803 let (k, v) = unsafe { (&(*self.head.0).key, &mut (*self.head.0).value) };
804 self.head = self.head.next();
805 self.len -= 1;
806 Some((k, v))
807 }
808
809 fn size_hint(&self) -> (usize, Option<usize>) {
810 (self.len, Some(self.len))
811 }
812}
813
814impl<'a, K: Ord + 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> {
815 #[inline]
816 fn next_back(&mut self) -> Option<(&'a K, &'a mut V)> {
817 if self.len == 0 {
818 return None;
819 }
820
821 if self.tail == self.head {
822 return None;
823 }
824
825 let (k, v) = unsafe { (&(*self.tail.0).key, &mut (*self.tail.0).value) };
826 self.tail = self.tail.prev();
827 self.len -= 1;
828 Some((k, v))
829 }
830}
831
832impl<K: Ord, V> IntoIterator for RBTree<K, V> {
833 type Item = (K, V);
834 type IntoIter = IntoIter<K, V>;
835
836 #[inline]
837 fn into_iter(mut self) -> IntoIter<K, V> {
838 let iter = if self.root.is_null() {
839 IntoIter {
840 head: NodePtr::null(),
841 tail: NodePtr::null(),
842 len: self.len,
843 }
844 } else {
845 IntoIter {
846 head: self.first_child(),
847 tail: self.last_child(),
848 len: self.len,
849 }
850 };
851 self.fast_clear();
852 iter
853 }
854}
855
856impl<K: Ord, V> RBTree<K, V> {
857 pub fn new() -> RBTree<K, V> {
859 RBTree {
860 root: NodePtr::null(),
861 len: 0,
862 }
863 }
864
865 #[inline]
867 pub fn len(&self) -> usize {
868 self.len
869 }
870
871 #[inline]
873 pub fn is_empty(&self) -> bool {
874 self.root.is_null()
875 }
876
877 #[inline]
892 unsafe fn left_rotate(&mut self, mut node: NodePtr<K, V>) {
893 let mut temp = node.right();
894 node.set_right(temp.left());
895
896 if !temp.left().is_null() {
897 temp.left().set_parent(node.clone());
898 }
899
900 temp.set_parent(node.parent());
901 if node == self.root {
902 self.root = temp.clone();
903 } else if node == node.parent().left() {
904 node.parent().set_left(temp.clone());
905 } else {
906 node.parent().set_right(temp.clone());
907 }
908
909 temp.set_left(node.clone());
910 node.set_parent(temp.clone());
911 }
912
913 #[inline]
927 unsafe fn right_rotate(&mut self, mut node: NodePtr<K, V>) {
928 let mut temp = node.left();
929 node.set_left(temp.right());
930
931 if !temp.right().is_null() {
932 temp.right().set_parent(node.clone());
933 }
934
935 temp.set_parent(node.parent());
936 if node == self.root {
937 self.root = temp.clone();
938 } else if node == node.parent().right() {
939 node.parent().set_right(temp.clone());
940 } else {
941 node.parent().set_left(temp.clone());
942 }
943
944 temp.set_right(node.clone());
945 node.set_parent(temp.clone());
946 }
947
948 #[inline]
961 pub fn replace_or_insert(&mut self, k: K, mut v: V) -> Option<V> {
962 let node = self.find_node(&k);
963 if node.is_null() {
964 self.insert(k, v);
965 return None;
966 }
967
968 unsafe {
969 mem::swap(&mut v, &mut (*node.0).value);
970 }
971
972 Some(v)
973 }
974
975 #[inline]
976 unsafe fn insert_fixup(&mut self, mut node: NodePtr<K, V>) {
977 let mut parent;
978 let mut gparent;
979
980 while node.parent().is_red_color() {
981 parent = node.parent();
982 gparent = parent.parent();
983 if parent == gparent.left() {
985 let mut uncle = gparent.right();
987 if !uncle.is_null() && uncle.is_red_color() {
988 uncle.set_black_color();
989 parent.set_black_color();
990 gparent.set_red_color();
991 node = gparent;
992 continue;
993 }
994
995 if parent.right() == node {
997 self.left_rotate(parent);
998 let temp = parent;
999 parent = node;
1000 node = temp;
1001 }
1002
1003 parent.set_black_color();
1005 gparent.set_red_color();
1006 self.right_rotate(gparent);
1007 } else {
1008 let mut uncle = gparent.left();
1010 if !uncle.is_null() && uncle.is_red_color() {
1011 uncle.set_black_color();
1012 parent.set_black_color();
1013 gparent.set_red_color();
1014 node = gparent;
1015 continue;
1016 }
1017
1018 if parent.left() == node {
1020 self.right_rotate(parent);
1021 let temp = parent;
1022 parent = node;
1023 node = temp;
1024 }
1025
1026 parent.set_black_color();
1028 gparent.set_red_color();
1029 self.left_rotate(gparent);
1030 }
1031 }
1032 self.root.set_black_color();
1033 }
1034
1035 #[inline]
1036 pub fn insert(&mut self, k: K, v: V) {
1037 self.len += 1;
1038 let mut node = NodePtr::new(k, v);
1039 let mut y = NodePtr::null();
1040 let mut x = self.root;
1041
1042 while !x.is_null() {
1043 y = x;
1044 match node.cmp(&&mut x) {
1045 Ordering::Less => {
1046 x = x.left();
1047 }
1048 _ => {
1049 x = x.right();
1050 }
1051 };
1052 }
1053 node.set_parent(y);
1054
1055 if y.is_null() {
1056 self.root = node;
1057 } else {
1058 match node.cmp(&&mut y) {
1059 Ordering::Less => {
1060 y.set_left(node);
1061 }
1062 _ => {
1063 y.set_right(node);
1064 }
1065 };
1066 }
1067
1068 node.set_red_color();
1069 unsafe {
1070 self.insert_fixup(node);
1071 }
1072 }
1073
1074 #[inline]
1075 fn find_node(&self, k: &K) -> NodePtr<K, V> {
1076 if self.root.is_null() {
1077 return NodePtr::null();
1078 }
1079 let mut temp = &self.root;
1080 unsafe {
1081 loop {
1082 let next = match k.cmp(&(*temp.0).key) {
1083 Ordering::Less => &mut (*temp.0).left,
1084 Ordering::Greater => &mut (*temp.0).right,
1085 Ordering::Equal => return *temp,
1086 };
1087 if next.is_null() {
1088 break;
1089 }
1090 temp = next;
1091 }
1092 }
1093 NodePtr::null()
1094 }
1095
1096 #[inline]
1097 fn first_child(&self) -> NodePtr<K, V> {
1098 if self.root.is_null() {
1099 NodePtr::null()
1100 } else {
1101 let mut temp = self.root;
1102 while !temp.left().is_null() {
1103 temp = temp.left();
1104 }
1105 return temp;
1106 }
1107 }
1108
1109 #[inline]
1110 fn last_child(&self) -> NodePtr<K, V> {
1111 if self.root.is_null() {
1112 NodePtr::null()
1113 } else {
1114 let mut temp = self.root;
1115 while !temp.right().is_null() {
1116 temp = temp.right();
1117 }
1118 return temp;
1119 }
1120 }
1121
1122 #[inline]
1123 pub fn get_first(&self) -> Option<(&K, &V)> {
1124 let first = self.first_child();
1125 if first.is_null() {
1126 return None;
1127 }
1128 unsafe { Some((&(*first.0).key, &(*first.0).value)) }
1129 }
1130
1131 #[inline]
1132 pub fn get_last(&self) -> Option<(&K, &V)> {
1133 let last = self.last_child();
1134 if last.is_null() {
1135 return None;
1136 }
1137 unsafe { Some((&(*last.0).key, &(*last.0).value)) }
1138 }
1139
1140 #[inline]
1141 pub fn pop_first(&mut self) -> Option<(K, V)> {
1142 let first = self.first_child();
1143 if first.is_null() {
1144 return None;
1145 }
1146 unsafe { Some(self.delete(first)) }
1147 }
1148
1149 #[inline]
1150 pub fn pop_last(&mut self) -> Option<(K, V)> {
1151 let last = self.last_child();
1152 if last.is_null() {
1153 return None;
1154 }
1155 unsafe { Some(self.delete(last)) }
1156 }
1157
1158 #[inline]
1159 pub fn get_first_mut(&mut self) -> Option<(&K, &mut V)> {
1160 let first = self.first_child();
1161 if first.is_null() {
1162 return None;
1163 }
1164 unsafe { Some((&(*first.0).key, &mut (*first.0).value)) }
1165 }
1166
1167 #[inline]
1168 pub fn get_last_mut(&mut self) -> Option<(&K, &mut V)> {
1169 let last = self.last_child();
1170 if last.is_null() {
1171 return None;
1172 }
1173 unsafe { Some((&(*last.0).key, &mut (*last.0).value)) }
1174 }
1175
1176 #[inline]
1177 pub fn get(&self, k: &K) -> Option<&V> {
1178 let node = self.find_node(k);
1179 if node.is_null() {
1180 return None;
1181 }
1182
1183 unsafe { Some(&(*node.0).value) }
1184 }
1185
1186 #[inline]
1187 pub fn get_mut(&mut self, k: &K) -> Option<&mut V> {
1188 let node = self.find_node(k);
1189 if node.is_null() {
1190 return None;
1191 }
1192
1193 unsafe { Some(&mut (*node.0).value) }
1194 }
1195
1196 #[inline]
1197 pub fn contains_key(&self, k: &K) -> bool {
1198 let node = self.find_node(k);
1199 if node.is_null() {
1200 return false;
1201 }
1202 true
1203 }
1204
1205 #[inline]
1206 fn clear_recurse(&mut self, current: NodePtr<K, V>) {
1207 if !current.is_null() {
1208 unsafe {
1209 self.clear_recurse(current.left());
1210 self.clear_recurse(current.right());
1211 let _ = Box::from_raw(current.0);
1212 }
1213 }
1214 }
1215
1216 #[inline]
1229 pub fn clear(&mut self) {
1230 let root = self.root;
1231 self.root = NodePtr::null();
1232 self.clear_recurse(root);
1233 self.len = 0;
1234 }
1235
1236 #[inline]
1238 fn fast_clear(&mut self) {
1239 self.root = NodePtr::null();
1240 self.len = 0;
1241 }
1242
1243 #[inline]
1244 pub fn remove(&mut self, k: &K) -> Option<V> {
1245 let node = self.find_node(k);
1246 if node.is_null() {
1247 return None;
1248 }
1249 unsafe { Some(self.delete(node).1) }
1250 }
1251
1252 #[inline]
1253 unsafe fn delete_fixup(&mut self, mut node: NodePtr<K, V>, mut parent: NodePtr<K, V>) {
1254 let mut other;
1255 while node != self.root && node.is_black_color() {
1256 if parent.left() == node {
1257 other = parent.right();
1258 if other.is_red_color() {
1260 other.set_black_color();
1261 parent.set_red_color();
1262 self.left_rotate(parent);
1263 other = parent.right();
1264 }
1265
1266 if other.left().is_black_color() && other.right().is_black_color() {
1268 other.set_red_color();
1269 node = parent;
1270 parent = node.parent();
1271 } else {
1272 if other.right().is_black_color() {
1274 other.left().set_black_color();
1275 other.set_red_color();
1276 self.right_rotate(other);
1277 other = parent.right();
1278 }
1279 other.set_color(parent.get_color());
1281 parent.set_black_color();
1282 other.right().set_black_color();
1283 self.left_rotate(parent);
1284 node = self.root;
1285 break;
1286 }
1287 } else {
1288 other = parent.left();
1289 if other.is_red_color() {
1291 other.set_black_color();
1292 parent.set_red_color();
1293 self.right_rotate(parent);
1294 other = parent.left();
1295 }
1296
1297 if other.left().is_black_color() && other.right().is_black_color() {
1299 other.set_red_color();
1300 node = parent;
1301 parent = node.parent();
1302 } else {
1303 if other.left().is_black_color() {
1305 other.right().set_black_color();
1306 other.set_red_color();
1307 self.left_rotate(other);
1308 other = parent.left();
1309 }
1310 other.set_color(parent.get_color());
1312 parent.set_black_color();
1313 other.left().set_black_color();
1314 self.right_rotate(parent);
1315 node = self.root;
1316 break;
1317 }
1318 }
1319 }
1320
1321 node.set_black_color();
1322 }
1323
1324 #[inline]
1325 unsafe fn delete(&mut self, node: NodePtr<K, V>) -> (K, V) {
1326 let mut child;
1327 let mut parent;
1328 let color;
1329
1330 self.len -= 1;
1331 if !node.left().is_null() && !node.right().is_null() {
1333 let mut replace = node.right().min_node();
1336 if node == self.root {
1337 self.root = replace;
1338 } else {
1339 if node.parent().left() == node {
1340 node.parent().set_left(replace);
1341 } else {
1342 node.parent().set_right(replace);
1343 }
1344 }
1345
1346 child = replace.right();
1349 parent = replace.parent();
1350 color = replace.get_color();
1351 if parent == node {
1352 parent = replace;
1353 } else {
1354 if !child.is_null() {
1355 child.set_parent(parent);
1356 }
1357 parent.set_left(child);
1358 replace.set_right(node.right());
1359 node.right().set_parent(replace);
1360 }
1361
1362 replace.set_parent(node.parent());
1363 replace.set_color(node.get_color());
1364 replace.set_left(node.left());
1365 node.left().set_parent(replace);
1366
1367 if color == Color::Black {
1368 self.delete_fixup(child, parent);
1369 }
1370
1371 let obj = Box::from_raw(node.0);
1372 return obj.pair();
1373 }
1374
1375 if !node.left().is_null() {
1376 child = node.left();
1377 } else {
1378 child = node.right();
1379 }
1380
1381 parent = node.parent();
1382 color = node.get_color();
1383 if !child.is_null() {
1384 child.set_parent(parent);
1385 }
1386
1387 if self.root == node {
1388 self.root = child
1389 } else {
1390 if parent.left() == node {
1391 parent.set_left(child);
1392 } else {
1393 parent.set_right(child);
1394 }
1395 }
1396
1397 if color == Color::Black {
1398 self.delete_fixup(child, parent);
1399 }
1400
1401 let obj = Box::from_raw(node.0);
1402 return obj.pair();
1403 }
1404
1405 #[inline]
1407 pub fn keys(&self) -> Keys<K, V> {
1408 Keys { inner: self.iter() }
1409 }
1410
1411 #[inline]
1413 pub fn values(&self) -> Values<K, V> {
1414 Values { inner: self.iter() }
1415 }
1416
1417 #[inline]
1419 pub fn values_mut(&mut self) -> ValuesMut<K, V> {
1420 ValuesMut {
1421 inner: self.iter_mut(),
1422 }
1423 }
1424
1425 #[inline]
1427 pub fn iter(&self) -> Iter<K, V> {
1428 Iter {
1429 head: self.first_child(),
1430 tail: self.last_child(),
1431 len: self.len,
1432 _marker: marker::PhantomData,
1433 }
1434 }
1435
1436 #[inline]
1438 pub fn iter_mut(&mut self) -> IterMut<K, V> {
1439 IterMut {
1440 head: self.first_child(),
1441 tail: self.last_child(),
1442 len: self.len,
1443 _marker: marker::PhantomData,
1444 }
1445 }
1446
1447 #[inline]
1448 pub fn drain(&mut self) -> Drain<'_, K, V> {
1449 Drain {
1450 base: self,
1451 }
1452 }
1453}
1454
1455#[cfg(test)]
1456mod tests {
1457 use super::RBTree;
1458
1459 #[test]
1460 fn test_insert() {
1461 let mut m = RBTree::new();
1462 assert_eq!(m.len(), 0);
1463 m.insert(1, 2);
1464 assert_eq!(m.len(), 1);
1465 m.insert(2, 4);
1466 assert_eq!(m.len(), 2);
1467 m.insert(2, 6);
1468 assert_eq!(m.len(), 3);
1469 assert_eq!(*m.get(&1).unwrap(), 2);
1470 assert_eq!(*m.get(&2).unwrap(), 4);
1471 assert_eq!(*m.get(&2).unwrap(), 4);
1472 }
1473
1474 #[test]
1475 fn test_replace() {
1476 let mut m = RBTree::new();
1477 assert_eq!(m.len(), 0);
1478 m.insert(2, 4);
1479 assert_eq!(m.len(), 1);
1480 assert_eq!(m.replace_or_insert(2, 6).unwrap(), 4);
1481 assert_eq!(m.len(), 1);
1482 assert_eq!(*m.get(&2).unwrap(), 6);
1483 }
1484
1485 #[test]
1486 fn test_clone() {
1487 let mut m = RBTree::new();
1488 assert_eq!(m.len(), 0);
1489 m.insert(1, 2);
1490 assert_eq!(m.len(), 1);
1491 m.insert(2, 4);
1492 assert_eq!(m.len(), 2);
1493 let m2 = m.clone();
1494 m.clear();
1495 assert_eq!(*m2.get(&1).unwrap(), 2);
1496 assert_eq!(*m2.get(&2).unwrap(), 4);
1497 assert_eq!(m2.len(), 2);
1498 }
1499
1500 #[test]
1501 fn test_empty_remove() {
1502 let mut m: RBTree<isize, bool> = RBTree::new();
1503 assert_eq!(m.remove(&0), None);
1504 }
1505
1506 #[test]
1507 fn test_empty_iter() {
1508 let mut m: RBTree<isize, bool> = RBTree::new();
1509 assert_eq!(m.iter().next(), None);
1510 assert_eq!(m.iter_mut().next(), None);
1511 assert_eq!(m.len(), 0);
1512 assert!(m.is_empty());
1513 assert_eq!(m.into_iter().next(), None);
1514 }
1515
1516 #[test]
1517 fn test_lots_of_insertions() {
1518 let mut m = RBTree::new();
1519
1520 for _ in 0..10 {
1523 assert!(m.is_empty());
1524
1525 for i in 1..101 {
1526 m.insert(i, i);
1527
1528 for j in 1..i + 1 {
1529 let r = m.get(&j);
1530 assert_eq!(r, Some(&j));
1531 }
1532
1533 for j in i + 1..101 {
1534 let r = m.get(&j);
1535 assert_eq!(r, None);
1536 }
1537 }
1538
1539 for i in 101..201 {
1540 assert!(!m.contains_key(&i));
1541 }
1542
1543 for i in 1..101 {
1545 assert!(m.remove(&i).is_some());
1546
1547 for j in 1..i + 1 {
1548 assert!(!m.contains_key(&j));
1549 }
1550
1551 for j in i + 1..101 {
1552 assert!(m.contains_key(&j));
1553 }
1554 }
1555
1556 for i in 1..101 {
1557 assert!(!m.contains_key(&i));
1558 }
1559
1560 for i in 1..101 {
1561 m.insert(i, i);
1562 }
1563
1564 for i in (1..101).rev() {
1566 assert!(m.remove(&i).is_some());
1567
1568 for j in i..101 {
1569 assert!(!m.contains_key(&j));
1570 }
1571
1572 for j in 1..i {
1573 assert!(m.contains_key(&j));
1574 }
1575 }
1576 }
1577 }
1578
1579 #[test]
1580 fn test_find_mut() {
1581 let mut m = RBTree::new();
1582 m.insert(1, 12);
1583 m.insert(2, 8);
1584 m.insert(5, 14);
1585 let new = 100;
1586 match m.get_mut(&5) {
1587 None => panic!(),
1588 Some(x) => *x = new,
1589 }
1590 assert_eq!(m.get(&5), Some(&new));
1591 }
1592
1593 #[test]
1594 fn test_remove() {
1595 let mut m = RBTree::new();
1596 m.insert(1, 2);
1597 assert_eq!(*m.get(&1).unwrap(), 2);
1598 m.insert(5, 3);
1599 assert_eq!(*m.get(&5).unwrap(), 3);
1600 m.insert(9, 4);
1601 assert_eq!(*m.get(&1).unwrap(), 2);
1602 assert_eq!(*m.get(&5).unwrap(), 3);
1603 assert_eq!(*m.get(&9).unwrap(), 4);
1604 assert_eq!(m.remove(&1).unwrap(), 2);
1605 assert_eq!(m.remove(&5).unwrap(), 3);
1606 assert_eq!(m.remove(&9).unwrap(), 4);
1607 assert_eq!(m.len(), 0);
1608 }
1609
1610 #[test]
1611 fn test_is_empty() {
1612 let mut m = RBTree::new();
1613 m.insert(1, 2);
1614 assert!(!m.is_empty());
1615 assert!(m.remove(&1).is_some());
1616 assert!(m.is_empty());
1617 }
1618
1619 #[test]
1620 fn test_pop() {
1621 let mut m = RBTree::new();
1622 m.insert(2, 4);
1623 m.insert(1, 2);
1624 m.insert(3, 6);
1625 assert_eq!(m.len(), 3);
1626 assert_eq!(m.pop_first(), Some((1, 2)));
1627 assert_eq!(m.len(), 2);
1628 assert_eq!(m.pop_last(), Some((3, 6)));
1629 assert_eq!(m.len(), 1);
1630 assert_eq!(m.get_first(), Some((&2, &4)));
1631 assert_eq!(m.get_last(), Some((&2, &4)));
1632 }
1633
1634 #[test]
1635 fn test_iterate() {
1636 let mut m = RBTree::new();
1637 for i in 0..32 {
1638 m.insert(i, i * 2);
1639 }
1640 assert_eq!(m.len(), 32);
1641
1642 let mut observed: u32 = 0;
1643
1644 for (k, v) in m.iter() {
1645 assert_eq!(*v, *k * 2);
1646 observed |= 1 << *k;
1647 }
1648 assert_eq!(observed, 0xFFFF_FFFF);
1649 }
1650
1651 #[test]
1652 fn test_keys() {
1653 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
1654 let map: RBTree<_, _> = vec.into_iter().collect();
1655 let keys: Vec<_> = map.keys().cloned().collect();
1656 assert_eq!(keys.len(), 3);
1657 assert!(keys.contains(&1));
1658 assert!(keys.contains(&2));
1659 assert!(keys.contains(&3));
1660 }
1661
1662 #[test]
1663 fn test_values() {
1664 let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')];
1665 let map: RBTree<_, _> = vec.into_iter().collect();
1666 let values: Vec<_> = map.values().cloned().collect();
1667 assert_eq!(values.len(), 3);
1668 assert!(values.contains(&'a'));
1669 assert!(values.contains(&'b'));
1670 assert!(values.contains(&'c'));
1671 }
1672
1673 #[test]
1674 fn test_values_mut() {
1675 let vec = vec![(1, 1), (2, 2), (3, 3)];
1676 let mut map: RBTree<_, _> = vec.into_iter().collect();
1677 for value in map.values_mut() {
1678 *value = (*value) * 2
1679 }
1680 let values: Vec<_> = map.values().cloned().collect();
1681 assert_eq!(values.len(), 3);
1682 assert!(values.contains(&2));
1683 assert!(values.contains(&4));
1684 assert!(values.contains(&6));
1685 }
1686
1687 #[test]
1688 fn test_find() {
1689 let mut m = RBTree::new();
1690 assert!(m.get(&1).is_none());
1691 m.insert(1, 2);
1692 match m.get(&1) {
1693 None => panic!(),
1694 Some(v) => assert_eq!(*v, 2),
1695 }
1696 }
1697
1698 #[test]
1699 fn test_eq() {
1700 let mut m1 = RBTree::new();
1701 m1.insert(1, 2);
1702 m1.insert(2, 3);
1703 m1.insert(3, 4);
1704
1705 let mut m2 = RBTree::new();
1706 m2.insert(1, 2);
1707 m2.insert(2, 3);
1708
1709 assert!(m1 != m2);
1710
1711 m2.insert(3, 4);
1712
1713 assert_eq!(m1, m2);
1714 }
1715
1716 #[test]
1717 fn test_show() {
1718 let mut map = RBTree::new();
1719 let empty: RBTree<i32, i32> = RBTree::new();
1720
1721 map.insert(1, 2);
1722 map.insert(3, 4);
1723
1724 let map_str = format!("{:?}", map);
1725
1726 assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}");
1727 assert_eq!(format!("{:?}", empty), "{}");
1728 }
1729
1730 #[test]
1731 fn test_from_iter() {
1732 let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
1733
1734 let map: RBTree<_, _> = xs.iter().cloned().collect();
1735
1736 for &(k, v) in &xs {
1737 assert_eq!(map.get(&k), Some(&v));
1738 }
1739 }
1740
1741 #[test]
1742 fn test_size_hint() {
1743 let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
1744
1745 let map: RBTree<_, _> = xs.iter().cloned().collect();
1746
1747 let mut iter = map.iter();
1748
1749 for _ in iter.by_ref().take(3) {}
1750
1751 assert_eq!(iter.size_hint(), (3, Some(3)));
1752 }
1753
1754 #[test]
1755 fn test_iter_len() {
1756 let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
1757
1758 let map: RBTree<_, _> = xs.iter().cloned().collect();
1759
1760 let mut iter = map.iter();
1761
1762 for _ in iter.by_ref().take(3) {}
1763
1764 assert_eq!(iter.count(), 3);
1765 }
1766
1767 #[test]
1768 fn test_mut_size_hint() {
1769 let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
1770
1771 let mut map: RBTree<_, _> = xs.iter().cloned().collect();
1772
1773 let mut iter = map.iter_mut();
1774
1775 for _ in iter.by_ref().take(3) {}
1776
1777 assert_eq!(iter.size_hint(), (3, Some(3)));
1778 }
1779
1780 #[test]
1781 fn test_iter_mut_len() {
1782 let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)];
1783
1784 let mut map: RBTree<_, _> = xs.iter().cloned().collect();
1785
1786 let mut iter = map.iter_mut();
1787
1788 for _ in iter.by_ref().take(3) {}
1789
1790 assert_eq!(iter.count(), 3);
1791 }
1792
1793 #[test]
1794 fn test_index() {
1795 let mut map = RBTree::new();
1796
1797 map.insert(1, 2);
1798 map.insert(2, 1);
1799 map.insert(3, 4);
1800
1801 assert_eq!(map[&2], 1);
1802 }
1803
1804 #[test]
1805 #[should_panic]
1806 fn test_index_nonexistent() {
1807 let mut map = RBTree::new();
1808
1809 map.insert(1, 2);
1810 map.insert(2, 1);
1811 map.insert(3, 4);
1812
1813 map[&4];
1814 }
1815
1816 #[test]
1817 fn test_extend_iter() {
1818 let mut a = RBTree::new();
1819 a.insert(1, "one");
1820 let mut b = RBTree::new();
1821 b.insert(2, "two");
1822 b.insert(3, "three");
1823
1824 a.extend(b.into_iter());
1825
1826 assert_eq!(a.len(), 3);
1827 assert_eq!(a[&1], "one");
1828 assert_eq!(a[&2], "two");
1829 assert_eq!(a[&3], "three");
1830 }
1831
1832 #[test]
1833 fn test_rev_iter() {
1834 let mut a = RBTree::new();
1835 a.insert(1, 1);
1836 a.insert(2, 2);
1837 a.insert(3, 3);
1838
1839 assert_eq!(a.len(), 3);
1840 let mut cache = vec![];
1841 for e in a.iter().rev() {
1842 cache.push(e.0.clone());
1843 }
1844 assert_eq!(&cache, &vec![3, 2, 1]);
1845 }
1846
1847 #[test]
1848 fn test_drain() {
1849 let mut a = RBTree::new();
1850 a.insert(1, 1);
1851 a.insert(2, 2);
1852 a.insert(3, 3);
1853
1854 assert_eq!(a.len(), 3);
1855 let mut drain = a.drain();
1856 assert_eq!(drain.next().unwrap(), (1, 1));
1857 assert_eq!(drain.next().unwrap(), (2, 2));
1858 assert_eq!(a.len(), 1);
1859 }
1860}