1use core::fmt::Debug;
2use std::{alloc::Layout, cmp::Ordering, marker, ops::Index};
3use thiserror::Error;
4
5#[derive(Error, Debug)]
6#[cfg_attr(test, derive(PartialEq))]
7pub enum Error {
8 #[error("cannot insert, reached capacity limit of: {0}")]
9 ReachedCapacity(usize),
10}
11
12#[derive(Debug, PartialEq)]
13enum Color {
14 Red,
15 Black,
16}
17
18#[derive(Debug)]
19struct Node<K: Ord, V> {
20 color: Color,
21 left: NodePtr<K, V>,
22 right: NodePtr<K, V>,
23 parent: NodePtr<K, V>,
24 key: K,
25 value: V,
26}
27
28impl<K: Ord, V> Node<K, V> {
29 fn new(key: K, value: V, color: Color) -> Self {
30 Self::new_with_parent(key, value, color, NodePtr::null())
31 }
32
33 fn new_with_parent(
34 key: K,
35 value: V,
36 color: Color,
37 parent: NodePtr<K, V>,
38 ) -> Self {
39 Self {
40 color,
41 left: NodePtr::null(),
42 right: NodePtr::null(),
43 parent,
44 key,
45 value,
46 }
47 }
48}
49
50#[derive(Debug)]
51struct NodePtr<K: Ord, V>(*mut Node<K, V>);
52
53impl<K: Ord, V> Clone for NodePtr<K, V> {
54 fn clone(&self) -> NodePtr<K, V> {
55 *self
56 }
57}
58
59impl<K: Ord, V> Copy for NodePtr<K, V> {}
60
61impl<K: Ord, V> Ord for NodePtr<K, V> {
62 fn cmp(&self, other: &NodePtr<K, V>) -> Ordering {
63 unsafe { (*self.0).key.cmp(&(*other.0).key) }
64 }
65}
66
67impl<K: Ord, V> PartialOrd for NodePtr<K, V> {
68 fn partial_cmp(&self, other: &NodePtr<K, V>) -> Option<Ordering> {
69 Some(self.cmp(other))
70 }
71}
72
73impl<K: Ord, V> PartialEq for NodePtr<K, V> {
74 fn eq(&self, other: &NodePtr<K, V>) -> bool {
75 self.0 == other.0
76 }
77}
78
79impl<K: Ord, V> Eq for NodePtr<K, V> {}
80
81impl<K: Ord, V> NodePtr<K, V> {
82 #[inline]
83 fn null() -> NodePtr<K, V> {
84 NodePtr(std::ptr::null_mut())
85 }
86
87 #[inline]
88 fn is_null(&self) -> bool {
89 self.0.is_null()
90 }
91
92 fn as_option(&self) -> Option<&Node<K, V>> {
93 if self.0.is_null() {
94 None
95 } else {
96 unsafe { Some(&(*self.0)) }
97 }
98 }
99
100 fn as_option_mut(&self) -> Option<&mut Node<K, V>> {
101 if self.0.is_null() {
102 None
103 } else {
104 unsafe { Some(&mut (*self.0)) }
105 }
106 }
107
108 #[inline]
109 fn unsafe_deref(&self) -> &Node<K, V> {
110 unsafe { &(*self.0) }
111 }
112
113 fn find_min(&self) -> NodePtr<K, V> {
114 let mut node_ptr = self;
115 let mut result = node_ptr;
116 while let Some(node) = node_ptr.as_option_mut() {
117 result = node_ptr;
118 node_ptr = &node.left;
119 }
120 *result
121 }
122
123 fn find_max(&self) -> NodePtr<K, V> {
124 let mut node_ptr = self;
125 let mut result = node_ptr;
126 while let Some(node) = node_ptr.as_option_mut() {
127 result = node_ptr;
128 node_ptr = &node.right;
129 }
130 *result
131 }
132
133 fn next(&self) -> NodePtr<K, V> {
134 if self.is_null() {
135 return *self;
136 }
137
138 let right = self.unsafe_deref().right;
139 if !right.is_null() {
140 right.find_min()
141 } else {
142 let mut node_ptr = self;
143 let mut node = self.unsafe_deref();
144 loop {
145 if let Some(parent) = node.parent.as_option() {
146 if parent.left == *node_ptr {
147 return node.parent;
148 }
149 node_ptr = &node.parent;
150 node = parent;
151 } else {
152 return NodePtr::null();
153 }
154 }
155 }
156 }
157
158 fn prev(&self) -> NodePtr<K, V> {
159 if self.is_null() {
160 return *self;
161 }
162
163 let left = self.unsafe_deref().left;
164 if !left.is_null() {
165 left
166 } else {
167 let mut node_ptr = self;
168 let mut node = self.unsafe_deref();
169 loop {
170 if let Some(parent) = node.parent.as_option() {
171 if parent.right == *node_ptr {
172 return node.parent;
173 }
174 node_ptr = &node.parent;
175 node = parent;
176 } else {
177 return NodePtr::null();
178 }
179 }
180 }
181 }
182}
183
184pub struct Iter<'a, K: Ord + 'a, V: 'a> {
185 head: NodePtr<K, V>,
186 tail: NodePtr<K, V>,
187 length: usize,
188 _marker: marker::PhantomData<&'a ()>,
189}
190
191impl<'a, K: Ord + 'a, V: 'a> Clone for Iter<'a, K, V> {
192 fn clone(&self) -> Iter<'a, K, V> {
193 Iter {
194 head: self.head,
195 tail: self.tail,
196 length: self.length,
197 _marker: self._marker,
198 }
199 }
200}
201
202impl<'a, K: Ord + 'a, V: 'a> Iterator for Iter<'a, K, V> {
203 type Item = (&'a K, &'a V);
204
205 fn next(&mut self) -> Option<(&'a K, &'a V)> {
206 if self.length == 0 || self.head.is_null() {
207 return None;
208 }
209
210 let next = self.head.next();
211 let (key, value) =
212 unsafe { (&(*self.head.0).key, &(*self.head.0).value) };
213 self.head = next;
214 self.length -= 1;
215 Some((key, value))
216 }
217
218 fn size_hint(&self) -> (usize, Option<usize>) {
219 (self.length, Some(self.length))
220 }
221}
222
223impl<'a, K: Ord + 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> {
224 fn next_back(&mut self) -> Option<(&'a K, &'a V)> {
225 if self.length == 0 || self.tail.is_null() {
226 return None;
227 }
228
229 let prev = self.tail.prev();
230 let (key, value) =
231 unsafe { (&(*self.tail.0).key, &(*self.tail.0).value) };
232 self.tail = prev;
233 self.length -= 1;
234 Some((key, value))
235 }
236}
237
238pub struct IntoIter<K: Ord, V> {
239 head: NodePtr<K, V>,
240 tail: NodePtr<K, V>,
241 length: usize,
242
243 arena_ptr: *mut Node<K, V>,
246 arena_layout: Layout,
247}
248
249impl<K: Ord, V> Drop for IntoIter<K, V> {
250 fn drop(&mut self) {
251 let arena_ptr = self.arena_ptr;
252 let arena_layout = self.arena_layout;
253
254 for (_, _) in self {}
256
257 unsafe {
259 std::alloc::dealloc(arena_ptr as *mut u8, arena_layout);
260 }
261 }
262}
263
264impl<K: Ord, V> Iterator for IntoIter<K, V> {
265 type Item = (K, V);
266
267 fn next(&mut self) -> Option<(K, V)> {
268 if self.length == 0 || self.head.is_null() {
269 return None;
270 }
271
272 let next = self.head.next();
273 let (key, value) = unsafe {
274 (
275 core::ptr::read(&(*self.head.0).key),
276 core::ptr::read(&(*self.head.0).value),
277 )
278 };
279 self.head = next;
280 self.length -= 1;
281 Some((key, value))
282 }
283
284 fn size_hint(&self) -> (usize, Option<usize>) {
285 (self.length, Some(self.length))
286 }
287}
288
289impl<K: Ord, V> DoubleEndedIterator for IntoIter<K, V> {
290 fn next_back(&mut self) -> Option<(K, V)> {
291 if self.length == 0 || self.tail.is_null() {
292 return None;
293 }
294
295 let prev = self.tail.prev();
296 let (key, value) = unsafe {
297 (
298 core::ptr::read(&(*self.tail.0).key),
299 core::ptr::read(&(*self.tail.0).value),
300 )
301 };
302 self.tail = prev;
303 self.length -= 1;
304 Some((key, value))
305 }
306}
307
308pub struct RedBlackTree<K: Ord, V> {
309 arena: Vec<Node<K, V>>,
310 root: NodePtr<K, V>,
311}
312
313impl<K, V> Debug for RedBlackTree<K, V>
314where
315 K: Ord + Debug,
316 V: Debug,
317{
318 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
319 f.debug_map().entries(self.iter()).finish()
320 }
321}
322
323impl<K: Ord + Debug, V: Debug> RedBlackTree<K, V> {
324 fn print_tree(node_ptr: NodePtr<K, V>, level: usize, left: bool) {
325 if node_ptr.is_null() {
326 return;
327 }
328 let node = node_ptr.unsafe_deref();
329 let before = if level > 0 {
330 format!(
331 "{}|-{}-",
332 " ".repeat(level - 1),
333 if left { "L" } else { "R" }
334 )
335 } else {
336 "".to_string()
337 };
338 let color = match node.color {
339 Color::Red => "\x1b[31m",
340 Color::Black => "\x1b[90m",
341 };
342 println!("{}{}{:?}\x1b[0m: {:?}", before, color, node.key, node.value);
343 Self::print_tree(node.left, level + 1, true);
344 Self::print_tree(node.right, level + 1, false);
345 }
346
347 pub fn pretty_print(&self) {
348 Self::print_tree(self.root, 0, true);
349 }
350}
351
352impl<K, V> PartialEq for RedBlackTree<K, V>
353where
354 K: Eq + Ord,
355 V: PartialEq,
356{
357 fn eq(&self, other: &RedBlackTree<K, V>) -> bool {
358 if self.len() != other.len() {
359 return false;
360 }
361
362 self.iter()
363 .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v))
364 }
365}
366
367impl<K, V> Eq for RedBlackTree<K, V>
368where
369 K: Eq + Ord,
370 V: Eq,
371{
372}
373
374impl<'a, K, V> Index<&'a K> for RedBlackTree<K, V>
375where
376 K: Ord,
377{
378 type Output = V;
379
380 fn index(&self, index: &K) -> &V {
381 self.get(index).expect("key not found")
382 }
383}
384
385impl<K: Ord, V> IntoIterator for RedBlackTree<K, V> {
386 type Item = (K, V);
387 type IntoIter = IntoIter<K, V>;
388
389 fn into_iter(mut self) -> IntoIter<K, V> {
390 let length = self.len();
391 let head = self.root.find_min();
392 let tail = self.root.find_max();
393
394 self.clear_no_dealloc();
395
396 let arena_ptr = self.arena.as_mut_ptr();
397 let arena_layout =
398 Layout::array::<Node<K, V>>(self.arena.len()).unwrap();
399
400 std::mem::forget(self.arena);
401
402 IntoIter {
403 head,
404 tail,
405 length,
406 arena_ptr,
407 arena_layout,
408 }
409 }
410}
411
412impl<K: Ord, V> RedBlackTree<K, V> {
413 fn with_arena(arena: Vec<Node<K, V>>) -> Self {
414 Self {
415 arena,
416 root: NodePtr::null(),
417 }
418 }
419
420 pub fn with_capacity(capacity: usize) -> Self {
421 Self::with_arena(Vec::with_capacity(capacity))
422 }
423
424 fn clear_no_dealloc(&mut self) {
425 self.root = NodePtr::null();
426 }
427
428 pub fn clear(&mut self) {
429 self.clear_no_dealloc();
430 self.arena.clear();
431 }
432
433 pub fn iter(&self) -> Iter<K, V> {
435 Iter {
436 head: self.root.find_min(),
437 tail: self.root.find_max(),
438 length: self.len(),
439 _marker: marker::PhantomData,
440 }
441 }
442
443 #[inline]
444 pub fn len(&self) -> usize {
445 self.arena.len()
446 }
447
448 #[inline]
449 pub fn is_empty(&self) -> bool {
450 self.len() == 0
451 }
452
453 #[inline]
454 pub fn capacity(&self) -> usize {
455 self.arena.capacity()
456 }
457
458 fn alloc_node(&mut self, node: Node<K, V>) -> Result<NodePtr<K, V>, Error> {
459 if self.capacity() == self.len() {
460 return Err(Error::ReachedCapacity(self.capacity()));
461 }
462 self.arena.push(node);
463 unsafe {
464 Ok(NodePtr(self.arena.as_mut_ptr().add(self.arena.len() - 1)))
465 }
466 }
467
468 fn find_node(&self, key: &K) -> NodePtr<K, V> {
469 let mut node_ptr = self.root;
470
471 while let Some(node) = node_ptr.as_option_mut() {
472 let next = match key.cmp(&node.key) {
473 Ordering::Less => &mut node.left,
474 Ordering::Greater => &mut node.right,
475 Ordering::Equal => return node_ptr,
476 };
477 node_ptr = *next;
478 }
479
480 NodePtr::null()
481 }
482
483 pub fn get(&self, key: &K) -> Option<&V> {
484 let node_ptr = self.find_node(key);
485 if node_ptr.is_null() {
486 None
487 } else {
488 unsafe { Some(&(*node_ptr.0).value) }
489 }
490 }
491
492 pub fn contains_key(&self, k: &K) -> bool {
493 let node_ptr = self.find_node(k);
494 !node_ptr.is_null()
495 }
496
497 pub fn set(&mut self, key: K, value: V) -> Result<Option<V>, Error> {
498 let mut node_ptr = self.root;
499 if node_ptr.is_null() {
500 self.root = self.alloc_node(Node::new(key, value, Color::Black))?;
501 return Ok(None);
502 }
503
504 loop {
505 let node = unsafe { &mut *node_ptr.0 };
506 let (left, next_ptr) = match key.cmp(&node.key) {
507 Ordering::Less => (true, node.left),
508 Ordering::Greater => (false, node.right),
509 Ordering::Equal => {
510 return Ok(Some(std::mem::replace(&mut node.value, value)));
511 }
512 };
513
514 if next_ptr.is_null() {
515 let new_node_ptr = self.alloc_node(Node::new_with_parent(
516 key,
517 value,
518 Color::Red,
519 node_ptr,
520 ))?;
521
522 if left {
523 node.left = new_node_ptr;
524 } else {
525 node.right = new_node_ptr;
526 }
527
528 unsafe { self.insert_fixup(new_node_ptr) };
529 return Ok(None);
530 }
531
532 node_ptr = next_ptr;
533 }
534 }
535
536 unsafe fn insert_fixup(&mut self, inserted_node_ptr: NodePtr<K, V>) {
537 let mut node_ptr = inserted_node_ptr;
538 while node_ptr != self.root {
539 let node = &*node_ptr.0;
540 let parent_ptr = node.parent;
541 let parent = &mut *parent_ptr.0;
542 if parent.color == Color::Black {
543 break;
544 }
545
546 let grand_parent_ptr = parent.parent;
547 let grand_parent = &mut *grand_parent_ptr.0;
548
549 if parent_ptr == grand_parent.left {
550 let uncle_ptr = grand_parent.right;
551 let rotate = uncle_ptr.is_null()
552 || uncle_ptr.unsafe_deref().color == Color::Black;
553 if rotate {
554 if node_ptr == parent.right {
555 node_ptr = parent_ptr;
556 self.rotate_left(node_ptr);
557 }
558
559 (*(*node_ptr.0).parent.0).color = Color::Black;
560 (*grand_parent_ptr.0).color = Color::Red;
561 node_ptr = parent_ptr;
562 self.rotate_right(grand_parent_ptr);
563 } else {
564 let uncle = &mut *uncle_ptr.0;
565 parent.color = Color::Black;
566 uncle.color = Color::Black;
567 grand_parent.color = Color::Red;
568 node_ptr = grand_parent_ptr;
569 }
570 } else {
571 let uncle_ptr = grand_parent.left;
572 let rotate = uncle_ptr.is_null()
573 || uncle_ptr.unsafe_deref().color == Color::Black;
574 if rotate {
575 if node_ptr == parent.left {
576 node_ptr = parent_ptr;
577 self.rotate_right(node_ptr);
578 }
579
580 (*(*node_ptr.0).parent.0).color = Color::Black;
581 (*grand_parent_ptr.0).color = Color::Red;
582 node_ptr = parent_ptr;
583 self.rotate_left(grand_parent_ptr);
584 } else {
585 let uncle = &mut *uncle_ptr.0;
586 parent.color = Color::Black;
587 uncle.color = Color::Black;
588 grand_parent.color = Color::Red;
589 node_ptr = grand_parent_ptr;
590 }
591 }
592 }
593 (*self.root.0).color = Color::Black;
594 }
595
596 unsafe fn rotate_left(&mut self, node_ptr: NodePtr<K, V>) {
597 let node = &mut *node_ptr.0;
598 let right_ptr = node.right;
599 let right = &mut *right_ptr.0;
600
601 node.right = right.left;
602 if let Some(left) = right.left.as_option_mut() {
603 left.parent = node_ptr;
604 }
605
606 right.parent = node.parent;
607
608 match node.parent.as_option_mut() {
609 Some(parent) => {
610 if node_ptr == parent.left {
611 parent.left = right_ptr;
612 } else {
613 parent.right = right_ptr;
614 }
615 }
616 None => self.root = right_ptr,
617 }
618
619 right.left = node_ptr;
620 node.parent = right_ptr;
621 }
622
623 unsafe fn rotate_right(&mut self, node_ptr: NodePtr<K, V>) {
624 let node = &mut *node_ptr.0;
625 let left_ptr = node.left;
626 let left = &mut *left_ptr.0;
627
628 node.left = left.right;
629 if let Some(right) = left.right.as_option_mut() {
630 right.parent = node_ptr;
631 }
632
633 left.parent = node.parent;
634
635 match node.parent.as_option_mut() {
636 Some(parent) => {
637 if node_ptr == parent.right {
638 parent.right = left_ptr;
639 } else {
640 parent.left = left_ptr;
641 }
642 }
643 None => self.root = left_ptr,
644 }
645
646 left.right = node_ptr;
647 node.parent = left_ptr;
648 }
649}
650
651#[cfg(test)]
652mod tests {
653 use super::*;
654
655 #[test]
656 fn insert_int() {
657 let mut tree = RedBlackTree::with_capacity(2);
658 assert_eq!(tree.len(), 0);
659 assert_eq!(tree.set(1, 2), Ok(None));
660 assert_eq!(tree.len(), 1);
661 assert_eq!(tree.set(2, 4), Ok(None));
662 assert_eq!(tree.len(), 2);
663 assert_eq!(tree.set(2, 6), Ok(Some(4)));
664 assert_eq!(tree.len(), 2);
665 assert!(tree.contains_key(&1));
666 assert!(!tree.contains_key(&100));
667 assert_eq!(tree.get(&1), Some(&2));
668 assert_eq!(tree.get(&2), Some(&6));
669 assert_eq!(tree.get(&3), None);
670 assert!(tree.set(500, 600).is_err());
671 }
672
673 #[test]
674 fn insert_str() {
675 let mut tree = RedBlackTree::with_capacity(3);
676 assert_eq!(tree.set("B", "are"), Ok(None));
677 assert_eq!(tree.set("A", "B"), Ok(None));
678 assert_eq!(tree.set("A", "Trees"), Ok(Some("B")));
679 assert_eq!(tree.set("C", "cool"), Ok(None));
680 assert_eq!(tree.len(), 3);
681 assert!(tree.contains_key(&"C"));
682 assert!(!tree.contains_key(&"nope"));
683 assert_eq!(tree.get(&"A"), Some(&"Trees"));
684 assert_eq!(tree[&"B"], "are");
685 assert_eq!(tree.get(&"C"), Some(&"cool"));
686 assert_eq!(tree.get(&"D"), None);
687 assert!(tree.set("does not exist", "?").is_err());
688 }
689
690 #[test]
691 fn tree_that_runs_all_rotations_and_coloring() {
692 let mut tree = RedBlackTree::with_capacity(8);
693 for i in [8, 18, 5, 15, 17, 25, 40, 80] {
694 assert_eq!(tree.set(i, 0_u8), Ok(None));
695 }
696 let seventeen = tree.root.unsafe_deref();
697 assert_eq!(seventeen.color, Color::Black);
698
699 let eight = seventeen.left.unsafe_deref();
700 assert_eq!(eight.color, Color::Red);
701
702 let five = eight.left.unsafe_deref();
703 assert_eq!(five.color, Color::Black);
704
705 let fifteen = eight.right.unsafe_deref();
706 assert_eq!(fifteen.color, Color::Black);
707
708 let twentyfive = seventeen.right.unsafe_deref();
709 assert_eq!(twentyfive.color, Color::Red);
710
711 let eighteen = twentyfive.left.unsafe_deref();
712 assert_eq!(eighteen.color, Color::Black);
713
714 let forty = twentyfive.right.unsafe_deref();
715 assert_eq!(forty.color, Color::Black);
716
717 let eighty = forty.right.unsafe_deref();
718 assert_eq!(eighty.color, Color::Red);
719 }
720
721 #[test]
722 fn iter() {
723 let mut tree = RedBlackTree::with_capacity(4);
724 tree.set(100, "c").unwrap();
725 tree.set(50, "a").unwrap();
726 tree.set(75, "b").unwrap();
727 tree.set(150, "d").unwrap();
728 let mut iter = tree.iter();
729 assert_eq!(iter.next(), Some((&50, &"a")));
730 assert_eq!(iter.next(), Some((&75, &"b")));
731 assert_eq!(iter.next(), Some((&100, &"c")));
732 assert_eq!(iter.next(), Some((&150, &"d")));
733 assert_eq!(iter.next(), None);
734 }
735
736 #[test]
737 fn iter_clone() {
738 let mut tree = RedBlackTree::with_capacity(4);
739 tree.set(100, "c").unwrap();
740 tree.set(50, "a").unwrap();
741 tree.set(75, "b").unwrap();
742 tree.set(150, "d").unwrap();
743 let mut iter = tree.iter();
744 assert_eq!(iter.next(), Some((&50, &"a")));
745 assert_eq!(iter.next(), Some((&75, &"b")));
746
747 let mut cloned_iter = iter.clone();
748
749 assert_eq!(iter.next(), Some((&100, &"c")));
750 assert_eq!(iter.next(), Some((&150, &"d")));
751 assert_eq!(cloned_iter.next(), Some((&100, &"c")));
752 assert_eq!(cloned_iter.next(), Some((&150, &"d")));
753 assert_eq!(iter.next(), None);
754 assert_eq!(cloned_iter.next(), None);
755 }
756
757 #[test]
758 fn iter_reverse() {
759 let mut tree = RedBlackTree::with_capacity(4);
760 tree.set(100, "c").unwrap();
761 tree.set(50, "a").unwrap();
762 tree.set(75, "b").unwrap();
763 tree.set(150, "d").unwrap();
764 let mut iter = tree.iter().rev();
765 assert_eq!(iter.next(), Some((&150, &"d")));
766 assert_eq!(iter.next(), Some((&100, &"c")));
767 assert_eq!(iter.next(), Some((&75, &"b")));
768 assert_eq!(iter.next(), Some((&50, &"a")));
769 assert_eq!(iter.next(), None);
770 }
771
772 #[test]
773 fn into_iter() {
774 let mut tree = RedBlackTree::with_capacity(4);
775 tree.set(100, "c").unwrap();
776 tree.set(50, "a").unwrap();
777 tree.set(75, "b").unwrap();
778 tree.set(150, "d").unwrap();
779 let mut iter = tree.into_iter();
780 assert_eq!(iter.next(), Some((50, "a")));
781 assert_eq!(iter.next(), Some((75, "b")));
782 assert_eq!(iter.next(), Some((100, "c")));
783 assert_eq!(iter.next(), Some((150, "d")));
784 assert_eq!(iter.next(), None);
785 }
786
787 #[test]
788 fn into_iter_reverse() {
789 let mut tree = RedBlackTree::with_capacity(4);
790 tree.set(100, "c").unwrap();
791 tree.set(50, "a").unwrap();
792 tree.set(75, "b").unwrap();
793 tree.set(150, "d").unwrap();
794 let mut iter = tree.into_iter().rev();
795 assert_eq!(iter.next(), Some((150, "d")));
796 assert_eq!(iter.next(), Some((100, "c")));
797 assert_eq!(iter.next(), Some((75, "b")));
798 assert_eq!(iter.next(), Some((50, "a")));
799 assert_eq!(iter.next(), None);
800 }
801
802 #[test]
803 fn into_iter_for_loop_no_crash() {
804 struct User {
805 _name: String,
807 _age: u8,
808 }
809
810 let mut tree = RedBlackTree::with_capacity(2);
811 tree.set(
812 "id1",
813 User {
814 _name: "John Doe".to_string(),
815 _age: 123,
816 },
817 )
818 .unwrap();
819 tree.set(
820 "id2",
821 User {
822 _name: "Tony Solomonik".to_string(),
823 _age: 24,
824 },
825 )
826 .unwrap();
827
828 for (_, _) in tree {}
829 }
830
831 #[test]
832 fn clear() {
833 let mut tree = RedBlackTree::with_capacity(4);
834 assert_eq!(tree.capacity(), 4);
835 assert_eq!(tree.set(100, "c"), Ok(None));
836 assert_eq!(tree.set(50, "a"), Ok(None));
837 assert_eq!(tree.set(75, "b"), Ok(None));
838 assert_eq!(tree.set(150, "d"), Ok(None));
839 tree.clear();
840 assert_eq!(tree.capacity(), 4);
841 assert_eq!(tree.len(), 0);
842 }
843
844 #[test]
845 fn equality() {
846 let mut tree1 = RedBlackTree::with_capacity(4);
847 assert_eq!(tree1.set(100, "c"), Ok(None));
848 assert_eq!(tree1.set(50, "a"), Ok(None));
849 assert_eq!(tree1.set(75, "b"), Ok(None));
850 assert_eq!(tree1.set(150, "d"), Ok(None));
851
852 let mut tree2 = RedBlackTree::with_capacity(4);
853 assert_eq!(tree2.set(150, "d"), Ok(None));
854 assert_eq!(tree2.set(50, "a"), Ok(None));
855 assert_eq!(tree2.set(100, "c"), Ok(None));
856 assert_eq!(tree2.set(75, "b"), Ok(None));
857
858 assert_eq!(tree1, tree2);
859 }
860}