1use super::entry::Entry;
2use archery::{ArcTK, RcK, SharedPointer, SharedPointerKind};
3use core::borrow::Borrow;
4use core::cmp::Ordering;
5use core::fmt::Display;
6use core::hash::{Hash, Hasher};
7use core::iter::FromIterator;
8use core::marker::PhantomData;
9use core::ops::{Index, RangeBounds, RangeFull};
10
11pub type Iter<'a, K, V, P> =
13 core::iter::Map<IterPtr<'a, K, V, P>, fn(&'a SharedPointer<Entry<K, V>, P>) -> (&'a K, &'a V)>;
14pub type IterKeys<'a, K, V, P> = core::iter::Map<Iter<'a, K, V, P>, fn((&'a K, &V)) -> &'a K>;
15pub type IterValues<'a, K, V, P> = core::iter::Map<Iter<'a, K, V, P>, fn((&K, &'a V)) -> &'a V>;
16pub type RangeIter<'a, K, V, RB, Q, P> = core::iter::Map<
17 RangeIterPtr<'a, K, V, RB, Q, P>,
18 fn(&'a SharedPointer<Entry<K, V>, P>) -> (&'a K, &'a V),
19>;
20
21#[macro_export]
34macro_rules! rbt_map {
35 ($($k:expr => $v:expr),*) => {
36 {
37 #[allow(unused_mut)]
38 let mut m = $crate::RedBlackTreeMap::new();
39 $(
40 m.insert_mut($k, $v);
41 )*
42 m
43 }
44 };
45}
46
47#[macro_export]
61macro_rules! rbt_map_sync {
62 ($($k:expr => $v:expr),*) => {
63 {
64 #[allow(unused_mut)]
65 let mut m = $crate::RedBlackTreeMap::new_sync();
66 $(
67 m.insert_mut($k, $v);
68 )*
69 m
70 }
71 };
72}
73
74#[derive(Debug)]
103pub struct RedBlackTreeMap<K, V, P = RcK>
104where
105 P: SharedPointerKind,
106{
107 root: Option<SharedPointer<Node<K, V, P>, P>>,
108 size: usize,
109}
110
111pub type RedBlackTreeMapSync<K, V> = RedBlackTreeMap<K, V, ArcTK>;
112
113#[derive(Clone, Copy, Debug, PartialEq, Eq)]
114enum Color {
115 Red,
116 Black,
117}
118
119#[derive(Debug)]
120struct Node<K, V, P>
121where
122 P: SharedPointerKind,
123{
124 entry: SharedPointer<Entry<K, V>, P>,
125 color: Color,
126 left: Option<SharedPointer<Node<K, V, P>, P>>,
127 right: Option<SharedPointer<Node<K, V, P>, P>>,
128}
129
130impl<K, V, P> Clone for Node<K, V, P>
131where
132 P: SharedPointerKind,
133{
134 fn clone(&self) -> Node<K, V, P> {
135 Node {
136 entry: SharedPointer::clone(&self.entry),
137 color: self.color,
138 left: self.left.clone(),
139 right: self.right.clone(),
140 }
141 }
142}
143
144impl<K, V, P> Node<K, V, P>
145where
146 K: Ord,
147 P: SharedPointerKind,
148{
149 fn new_red(entry: Entry<K, V>) -> Node<K, V, P> {
150 Node { entry: SharedPointer::new(entry), color: Color::Red, left: None, right: None }
151 }
152
153 fn new_black(entry: Entry<K, V>) -> Node<K, V, P> {
154 Node { entry: SharedPointer::new(entry), color: Color::Black, left: None, right: None }
155 }
156
157 fn borrow(node: Option<&SharedPointer<Node<K, V, P>, P>>) -> Option<&Node<K, V, P>> {
158 node.map(Borrow::borrow)
159 }
160
161 fn left_color(&self) -> Option<Color> {
162 self.left.as_ref().map(|l| l.color)
163 }
164
165 fn right_color(&self) -> Option<Color> {
166 self.right.as_ref().map(|r| r.color)
167 }
168
169 fn get<Q: ?Sized>(&self, key: &Q) -> Option<&Entry<K, V>>
170 where
171 K: Borrow<Q>,
172 Q: Ord,
173 {
174 match key.cmp(self.entry.key.borrow()) {
175 Ordering::Less => self.left.as_ref().and_then(|l| l.get(key)),
176 Ordering::Equal => Some(&self.entry),
177 Ordering::Greater => self.right.as_ref().and_then(|r| r.get(key)),
178 }
179 }
180
181 fn first(&self) -> &Entry<K, V> {
182 match self.left {
183 Some(ref l) => l.first(),
184 None => &self.entry,
185 }
186 }
187
188 fn last(&self) -> &Entry<K, V> {
189 match self.right {
190 Some(ref r) => r.last(),
191 None => &self.entry,
192 }
193 }
194
195 fn balance(&mut self) {
268 use Color::Black as B;
269 use Color::Red as R;
270 use core::mem::swap;
271
272 match self.color {
273 B => {
274 let color_l: Option<Color> = self.left_color();
275 let color_l_l: Option<Color> = self.left.as_ref().and_then(|l| l.left_color());
276 let color_l_r: Option<Color> = self.left.as_ref().and_then(|l| l.right_color());
277 let color_r: Option<Color> = self.right_color();
278 let color_r_l: Option<Color> = self.right.as_ref().and_then(|r| r.left_color());
279 let color_r_r: Option<Color> = self.right.as_ref().and_then(|r| r.right_color());
280
281 match (color_l, color_l_l, color_l_r, color_r, color_r_l, color_r_r) {
282 (Some(R), Some(R), ..) => {
284 let mut node_l_ptr = self.left.take().unwrap();
285 let node_l: &mut Node<K, V, P> = SharedPointer::make_mut(&mut node_l_ptr);
286 let mut node_l_l_ptr = node_l.left.take().unwrap();
287 let node_l_l: &mut Node<K, V, P> =
288 SharedPointer::make_mut(&mut node_l_l_ptr);
289
290 self.color = Color::Red;
291 node_l.color = Color::Black;
292 node_l_l.color = Color::Black;
293
294 swap(&mut self.entry, &mut node_l.entry);
295 swap(&mut node_l.left, &mut node_l.right);
296 swap(&mut self.right, &mut node_l.right);
297
298 self.left = Some(node_l_l_ptr);
299 self.right = Some(node_l_ptr);
300 }
301
302 (Some(R), _, Some(R), ..) => {
304 let mut node_l_ptr = self.left.take().unwrap();
305 let node_l: &mut Node<K, V, P> = SharedPointer::make_mut(&mut node_l_ptr);
306 let mut node_l_r_ptr = node_l.right.take().unwrap();
307 let node_l_r: &mut Node<K, V, P> =
308 SharedPointer::make_mut(&mut node_l_r_ptr);
309
310 self.color = Color::Red;
311 node_l.color = Color::Black;
312 node_l_r.color = Color::Black;
313
314 swap(&mut self.entry, &mut node_l_r.entry);
315 swap(&mut node_l_r.left, &mut node_l_r.right);
316 swap(&mut node_l.right, &mut node_l_r.right);
317 swap(&mut self.right, &mut node_l_r.right);
318
319 self.right = Some(node_l_r_ptr);
320 self.left = Some(node_l_ptr);
321 }
322
323 (.., Some(R), Some(R), _) => {
325 let mut node_r_ptr = self.right.take().unwrap();
326 let node_r: &mut Node<K, V, P> = SharedPointer::make_mut(&mut node_r_ptr);
327 let mut node_r_l_ptr = node_r.left.take().unwrap();
328 let node_r_l: &mut Node<K, V, P> =
329 SharedPointer::make_mut(&mut node_r_l_ptr);
330
331 self.color = Color::Red;
332 node_r.color = Color::Black;
333 node_r_l.color = Color::Black;
334
335 swap(&mut self.entry, &mut node_r_l.entry);
336 swap(&mut node_r.left, &mut node_r_l.right);
337 swap(&mut node_r_l.left, &mut node_r_l.right);
338 swap(&mut self.left, &mut node_r_l.left);
339
340 self.left = Some(node_r_l_ptr);
341 self.right = Some(node_r_ptr);
342 }
343
344 (.., Some(R), _, Some(R)) => {
346 let mut node_r_ptr = self.right.take().unwrap();
347 let node_r: &mut Node<K, V, P> = SharedPointer::make_mut(&mut node_r_ptr);
348 let mut node_r_r_ptr = node_r.right.take().unwrap();
349 let node_r_r: &mut Node<K, V, P> =
350 SharedPointer::make_mut(&mut node_r_r_ptr);
351
352 self.color = Color::Red;
353 node_r.color = Color::Black;
354 node_r_r.color = Color::Black;
355
356 swap(&mut self.entry, &mut node_r.entry);
357 swap(&mut node_r.left, &mut node_r.right);
358 swap(&mut self.left, &mut node_r.left);
359
360 self.right = Some(node_r_r_ptr);
361 self.left = Some(node_r_ptr);
362 }
363
364 _ => (),
365 }
366 }
367 R => (),
368 }
369 }
370
371 fn insert(root: &mut Option<SharedPointer<Node<K, V, P>, P>>, key: K, value: V) -> bool {
373 fn ins<K: Ord, V, P: SharedPointerKind>(
374 node: &mut Option<SharedPointer<Node<K, V, P>, P>>,
375 k: K,
376 v: V,
377 is_root: bool,
378 ) -> bool {
379 match node {
380 Some(node) => {
381 let node = SharedPointer::make_mut(node);
382
383 let ret = match k.cmp(&node.entry.key) {
384 Ordering::Less => {
385 let is_new_key = ins(&mut node.left, k, v, false);
386
387 if is_new_key {
389 node.balance();
390 }
391
392 is_new_key
393 }
394 Ordering::Equal => {
395 node.entry = SharedPointer::new(Entry::new(k, v));
396
397 false
398 }
399 Ordering::Greater => {
400 let is_new_key = ins(&mut node.right, k, v, false);
401
402 if is_new_key {
404 node.balance();
405 }
406
407 is_new_key
408 }
409 };
410
411 if is_root {
412 node.color = Color::Black;
413 }
414
415 ret
416 }
417 None => {
418 *node = if is_root {
419 Some(SharedPointer::new(Node::new_black(Entry::new(k, v))))
420 } else {
421 Some(SharedPointer::new(Node::new_red(Entry::new(k, v))))
422 };
423
424 true
425 }
426 }
427 }
428
429 ins(root, key, value, true)
430 }
431
432 fn remove_fuse(
434 node: &mut Node<K, V, P>,
435 left: Option<SharedPointer<Node<K, V, P>, P>>,
436 right: Option<SharedPointer<Node<K, V, P>, P>>,
437 ) -> bool {
438 use Color::Black as B;
439 use Color::Red as R;
440
441 use core::mem::swap;
442
443 match (left, right) {
444 (None, None) => false,
445 (None, Some(r_ptr)) => {
446 crate::utils::replace(node, r_ptr);
447 true
448 }
449 (Some(l_ptr), None) => {
450 crate::utils::replace(node, l_ptr);
451 true
452 }
453 (Some(mut l_ptr), Some(mut r_ptr)) => {
454 match (l_ptr.color, r_ptr.color) {
455 (B, R) => {
456 let r = SharedPointer::make_mut(&mut r_ptr);
457 let rl = r.left.take();
458
459 Node::remove_fuse(node, Some(l_ptr), rl);
461
462 swap(node, r);
463
464 node.left = Some(r_ptr);
465 }
466 (R, B) => {
467 let l = SharedPointer::make_mut(&mut l_ptr);
468 let lr = l.right.take();
469
470 Node::remove_fuse(node, lr, Some(r_ptr));
472
473 swap(node, l);
474
475 node.right = Some(l_ptr);
476 }
477 (R, R) => {
478 let r = SharedPointer::make_mut(&mut r_ptr);
479 let rl = r.left.take();
480 let l = SharedPointer::make_mut(&mut l_ptr);
481 let lr = l.right.take();
482
483 let fused = Node::remove_fuse(node, lr, rl);
484
485 match node.color {
486 R if fused => {
487 let fl = node.left.take();
488 let fr = node.right.take();
489
490 l.right = fl;
491 r.left = fr;
492
493 node.left = Some(l_ptr);
494 node.right = Some(r_ptr);
495 }
496 _ => {
497 swap(l, node);
498
499 if fused {
500 r.left = Some(l_ptr);
501 }
502
503 node.right = Some(r_ptr);
504 }
505 }
506 }
507 (B, B) => {
508 let r = SharedPointer::make_mut(&mut r_ptr);
509 let rl = r.left.take();
510 let l = SharedPointer::make_mut(&mut l_ptr);
511 let lr = l.right.take();
512
513 let fused = Node::remove_fuse(node, lr, rl);
514
515 match node.color {
516 R if fused => {
517 let fl = node.left.take();
518 let fr = node.right.take();
519
520 l.right = fl;
521 r.left = fr;
522
523 node.left = Some(l_ptr);
524 node.right = Some(r_ptr);
525 }
526 _ => {
527 swap(l, node);
528
529 if fused {
530 r.left = Some(l_ptr);
531 }
532
533 node.color = Color::Red;
534 node.right = Some(r_ptr);
535
536 node.remove_balance_left();
537 }
538 }
539 }
540 }
541
542 true
543 }
544 }
545 }
546
547 fn remove_balance(&mut self) {
548 match (self.left_color(), self.right_color()) {
549 (Some(Color::Red), Some(Color::Red)) => {
550 SharedPointer::make_mut(self.left.as_mut().unwrap()).color = Color::Black;
551 SharedPointer::make_mut(self.right.as_mut().unwrap()).color = Color::Black;
552
553 self.color = Color::Red;
554 }
555 _ => {
556 debug_assert_eq!(self.color, Color::Black);
559 self.balance();
560 }
561 }
562 }
563
564 fn remove_balance_left(&mut self) {
565 use Color::Black as B;
566 use Color::Red as R;
567
568 use core::mem::swap;
569
570 let color_l: Option<Color> = self.left_color();
571 let color_r: Option<Color> = self.right_color();
572 let color_r_l: Option<Color> = self.right.as_ref().and_then(|r| r.left_color());
573
574 match (color_l, color_r, color_r_l) {
575 (Some(R), ..) => {
576 let self_l = SharedPointer::make_mut(self.left.as_mut().unwrap());
577
578 self.color = Color::Red;
579 self_l.color = Color::Black;
580 }
581 (_, Some(B), _) => {
582 let self_r = SharedPointer::make_mut(self.right.as_mut().unwrap());
583
584 self.color = Color::Black;
585 self_r.color = Color::Red;
586
587 self.remove_balance();
588 }
589 (_, Some(R), Some(B)) => {
590 let self_r = SharedPointer::make_mut(self.right.as_mut().unwrap());
591
592 let mut self_r_l_ptr = self_r.left.take().unwrap();
593 let self_r_l = SharedPointer::make_mut(&mut self_r_l_ptr);
594 let new_r_l = self_r_l.right.take();
595
596 self_r.color = Color::Black;
597 self_r.left = new_r_l;
598 SharedPointer::make_mut(self_r.right.as_mut().unwrap()).color = Color::Red;
599
600 self_r.remove_balance();
601
602 self.color = Color::Red;
603
604 self_r_l.right = self_r_l.left.take();
605 self_r_l.left = self.left.take();
606
607 swap(&mut self.entry, &mut self_r_l.entry);
608
609 self.left = Some(self_r_l_ptr);
610 }
611 _ => unreachable!(),
612 }
613 }
614
615 fn remove_balance_right(&mut self) {
616 use Color::Black as B;
617 use Color::Red as R;
618
619 use core::mem::swap;
620
621 let color_r: Option<Color> = self.right_color();
622 let color_l: Option<Color> = self.left_color();
623 let color_l_r: Option<Color> = self.left.as_ref().and_then(|l| l.right_color());
624
625 match (color_l, color_l_r, color_r) {
626 (.., Some(R)) => {
627 let self_r = SharedPointer::make_mut(self.right.as_mut().unwrap());
628
629 self.color = Color::Red;
630 self_r.color = Color::Black;
631 }
632 (Some(B), ..) => {
633 let self_l = SharedPointer::make_mut(self.left.as_mut().unwrap());
634
635 self.color = Color::Black;
636 self_l.color = Color::Red;
637
638 self.remove_balance();
639 }
640 (Some(R), Some(B), _) => {
641 let self_l = SharedPointer::make_mut(self.left.as_mut().unwrap());
642
643 let mut self_l_r_ptr = self_l.right.take().unwrap();
644 let self_l_r = SharedPointer::make_mut(&mut self_l_r_ptr);
645 let new_l_r = self_l_r.left.take();
646
647 self_l.color = Color::Black;
648 self_l.right = new_l_r;
649 SharedPointer::make_mut(self_l.left.as_mut().unwrap()).color = Color::Red;
650
651 self_l.remove_balance();
652
653 self.color = Color::Red;
654
655 self_l_r.left = self_l_r.right.take();
656 self_l_r.right = self.right.take();
657
658 swap(&mut self.entry, &mut self_l_r.entry);
659
660 self.right = Some(self_l_r_ptr);
661 }
662 _ => unreachable!(),
663 }
664 }
665
666 fn remove<Q: ?Sized>(root: &mut Option<SharedPointer<Node<K, V, P>, P>>, key: &Q) -> bool
670 where
671 K: Borrow<Q>,
672 Q: Ord,
673 {
674 fn del_left<K, V, Q: ?Sized, P>(node: &mut Node<K, V, P>, k: &Q) -> bool
675 where
676 K: Borrow<Q> + Ord,
677 Q: Ord,
678 P: SharedPointerKind,
679 {
680 let original_left_color = node.left_color();
681 let removed = del(&mut node.left, k, false);
682
683 node.color = Color::Red; if let Some(Color::Black) = original_left_color {
686 node.remove_balance_left();
687 }
688
689 removed
690 }
691
692 fn del_right<K, V, Q: ?Sized, P>(node: &mut Node<K, V, P>, k: &Q) -> bool
693 where
694 K: Borrow<Q> + Ord,
695 Q: Ord,
696 P: SharedPointerKind,
697 {
698 let original_right_color = node.right_color();
699
700 let removed = del(&mut node.right, k, false);
701
702 node.color = Color::Red; if let Some(Color::Black) = original_right_color {
705 node.remove_balance_right();
706 }
707
708 removed
709 }
710
711 fn del<K, V, Q: ?Sized, P>(
712 node: &mut Option<SharedPointer<Node<K, V, P>, P>>,
713 k: &Q,
714 is_root: bool,
715 ) -> bool
716 where
717 K: Borrow<Q> + Ord,
718 Q: Ord,
719 P: SharedPointerKind,
720 {
721 let (removed, make_node_none) = match *node {
722 Some(ref mut node) => {
723 let node = SharedPointer::make_mut(node);
724
725 let ret = match k.cmp(node.entry.key.borrow()) {
726 Ordering::Less => (del_left(node, k), false),
727 Ordering::Equal => {
728 let left = node.left.take();
729 let right = node.right.take();
730
731 let make_node_none = !Node::remove_fuse(node, left, right);
732
733 (true, make_node_none)
734 }
735 Ordering::Greater => (del_right(node, k), false),
736 };
737
738 if is_root {
739 node.color = Color::Black;
740 }
741
742 ret
743 }
744 None => (false, false),
745 };
746
747 if make_node_none {
748 *node = None;
749 }
750
751 removed
752 }
753
754 del(root, key, true)
755 }
756}
757
758impl<K, V, P> Node<K, V, P>
759where
760 K: Ord + Clone,
761 V: Clone,
762 P: SharedPointerKind,
763{
764 fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut Entry<K, V>>
765 where
766 K: Borrow<Q>,
767 Q: Ord,
768 {
769 match key.cmp(self.entry.key.borrow()) {
770 Ordering::Less => {
771 self.left.as_mut().and_then(|l| SharedPointer::make_mut(l).get_mut(key))
772 }
773 Ordering::Equal => Some(SharedPointer::make_mut(&mut self.entry)),
774 Ordering::Greater => {
775 self.right.as_mut().and_then(|r| SharedPointer::make_mut(r).get_mut(key))
776 }
777 }
778 }
779}
780
781impl<K, V> RedBlackTreeMapSync<K, V>
782where
783 K: Ord,
784{
785 #[must_use]
786 pub fn new_sync() -> RedBlackTreeMapSync<K, V> {
787 RedBlackTreeMap::new_with_ptr_kind()
788 }
789}
790
791impl<K, V> RedBlackTreeMap<K, V>
792where
793 K: Ord,
794{
795 #[must_use]
796 pub fn new() -> RedBlackTreeMap<K, V> {
797 RedBlackTreeMap::new_with_ptr_kind()
798 }
799}
800
801impl<K, V, P> RedBlackTreeMap<K, V, P>
802where
803 K: Ord,
804 P: SharedPointerKind,
805{
806 #[must_use]
807 pub fn new_with_ptr_kind() -> RedBlackTreeMap<K, V, P> {
808 RedBlackTreeMap { root: None, size: 0 }
809 }
810
811 #[must_use]
812 pub fn get<Q: ?Sized>(&self, key: &Q) -> Option<&V>
813 where
814 K: Borrow<Q>,
815 Q: Ord,
816 {
817 self.root.as_ref().and_then(|r| r.get(key)).map(|e| &e.value)
818 }
819
820 #[must_use]
821 pub fn get_key_value<Q: ?Sized>(&self, key: &Q) -> Option<(&K, &V)>
822 where
823 K: Borrow<Q>,
824 Q: Ord,
825 {
826 self.root.as_ref().and_then(|r| r.get(key)).map(|e| (&e.key, &e.value))
827 }
828
829 #[must_use]
830 pub fn first(&self) -> Option<(&K, &V)> {
831 self.root.as_ref().map(|r| r.first()).map(|e| (&e.key, &e.value))
832 }
833
834 #[must_use]
835 pub fn last(&self) -> Option<(&K, &V)> {
836 self.root.as_ref().map(|r| r.last()).map(|e| (&e.key, &e.value))
837 }
838
839 #[must_use]
840 pub fn insert(&self, key: K, value: V) -> RedBlackTreeMap<K, V, P> {
841 let mut new_map = self.clone();
842
843 new_map.insert_mut(key, value);
844
845 new_map
846 }
847
848 pub fn insert_mut(&mut self, key: K, value: V) {
849 let is_new_key = Node::insert(&mut self.root, key, value);
850
851 if is_new_key {
852 self.size += 1;
853 }
854 }
855
856 #[must_use]
857 pub fn remove<Q: ?Sized>(&self, key: &Q) -> RedBlackTreeMap<K, V, P>
858 where
859 K: Borrow<Q>,
860 Q: Ord,
861 {
862 let mut new_map = self.clone();
863
864 if new_map.remove_mut(key) {
865 new_map
866 } else {
867 self.clone()
869 }
870 }
871
872 pub fn remove_mut<Q: ?Sized>(&mut self, key: &Q) -> bool
873 where
874 K: Borrow<Q>,
875 Q: Ord,
876 {
877 let removed = Node::remove(&mut self.root, key);
878
879 if removed {
883 self.size -= 1;
884 }
885
886 removed
887 }
888
889 #[must_use]
890 pub fn contains_key<Q: ?Sized>(&self, key: &Q) -> bool
891 where
892 K: Borrow<Q>,
893 Q: Ord,
894 {
895 self.get(key).is_some()
896 }
897
898 pub(crate) fn ptr_eq<PO: SharedPointerKind>(&self, other: &RedBlackTreeMap<K, V, PO>) -> bool {
903 let a = self.root.as_ref().map_or(core::ptr::null(), SharedPointer::as_ptr);
904 let b = other
908 .root
909 .as_ref()
910 .map_or(core::ptr::null(), SharedPointer::as_ptr)
911 .cast::<Node<K, V, P>>();
912 core::ptr::eq(a, b)
913 }
914
915 #[must_use]
916 #[inline]
917 pub fn size(&self) -> usize {
918 self.size
919 }
920
921 #[must_use]
922 #[inline]
923 pub fn is_empty(&self) -> bool {
924 self.size() == 0
925 }
926
927 pub fn iter(&self) -> Iter<'_, K, V, P> {
928 self.iter_ptr().map(|e| (&e.key, &e.value))
929 }
930
931 #[must_use]
932 fn iter_ptr(&self) -> IterPtr<'_, K, V, P> {
933 IterPtr::new(self)
934 }
935
936 pub fn keys(&self) -> IterKeys<'_, K, V, P> {
937 self.iter().map(|(k, _)| k)
938 }
939
940 pub fn values(&self) -> IterValues<'_, K, V, P> {
941 self.iter().map(|(_, v)| v)
942 }
943
944 pub fn range<Q, RB>(&self, range: RB) -> RangeIter<'_, K, V, RB, Q, P>
945 where
946 K: Borrow<Q>,
947 Q: Ord + ?Sized,
948 RB: RangeBounds<Q>,
949 {
950 use core::ops::Bound::*;
951
952 match (range.start_bound(), range.end_bound()) {
953 (Excluded(s), Excluded(e)) if s == e => {
954 panic!("range start and end are equal and excluded")
955 }
956 (Included(s), Included(e))
957 | (Included(s), Excluded(e))
958 | (Excluded(s), Included(e))
959 | (Excluded(s), Excluded(e))
960 if s > e =>
961 {
962 panic!("range start is greater than range end")
963 }
964 (_, _) => RangeIterPtr::new(self, range).map(|e| (&e.key, &e.value)),
965 }
966 }
967}
968
969impl<K, V, P> RedBlackTreeMap<K, V, P>
970where
971 K: Ord + Clone,
972 V: Clone,
973 P: SharedPointerKind,
974{
975 pub fn get_mut<Q: ?Sized>(&mut self, key: &Q) -> Option<&mut V>
976 where
977 K: Borrow<Q>,
978 Q: Ord,
979 {
980 self.root
983 .as_mut()
984 .and_then(|r| SharedPointer::make_mut(r).get_mut(key).map(|e| &mut e.value))
985 }
986}
987
988impl<K, Q: ?Sized, V, P> Index<&Q> for RedBlackTreeMap<K, V, P>
989where
990 K: Ord + Borrow<Q>,
991 Q: Ord,
992 P: SharedPointerKind,
993{
994 type Output = V;
995
996 fn index(&self, key: &Q) -> &V {
997 self.get(key).expect("no entry found for key")
998 }
999}
1000
1001impl<K, V, P> Clone for RedBlackTreeMap<K, V, P>
1002where
1003 K: Ord,
1004 P: SharedPointerKind,
1005{
1006 fn clone(&self) -> RedBlackTreeMap<K, V, P> {
1007 RedBlackTreeMap { root: self.root.clone(), size: self.size }
1008 }
1009}
1010
1011impl<K, V, P> Default for RedBlackTreeMap<K, V, P>
1012where
1013 K: Ord,
1014 P: SharedPointerKind,
1015{
1016 fn default() -> RedBlackTreeMap<K, V, P> {
1017 RedBlackTreeMap::new_with_ptr_kind()
1018 }
1019}
1020
1021impl<K, V: PartialEq, P, PO> PartialEq<RedBlackTreeMap<K, V, PO>> for RedBlackTreeMap<K, V, P>
1022where
1023 K: Ord,
1024 P: SharedPointerKind,
1025 PO: SharedPointerKind,
1026{
1027 fn eq(&self, other: &RedBlackTreeMap<K, V, PO>) -> bool {
1028 if self.ptr_eq(other) {
1029 return true;
1030 }
1031 self.size() == other.size()
1032 && self.iter().all(|(key, value)| other.get(key).is_some_and(|v| *value == *v))
1033 }
1034}
1035
1036impl<K, V: Eq, P> Eq for RedBlackTreeMap<K, V, P>
1037where
1038 K: Ord,
1039 P: SharedPointerKind,
1040{
1041}
1042
1043impl<K: Ord, V: PartialOrd, P, PO> PartialOrd<RedBlackTreeMap<K, V, PO>>
1044 for RedBlackTreeMap<K, V, P>
1045where
1046 P: SharedPointerKind,
1047 PO: SharedPointerKind,
1048{
1049 fn partial_cmp(&self, other: &RedBlackTreeMap<K, V, PO>) -> Option<Ordering> {
1050 self.iter().partial_cmp(other.iter())
1051 }
1052}
1053
1054impl<K: Ord, V: Ord, P> Ord for RedBlackTreeMap<K, V, P>
1055where
1056 P: SharedPointerKind,
1057{
1058 fn cmp(&self, other: &RedBlackTreeMap<K, V, P>) -> Ordering {
1059 self.iter().cmp(other.iter())
1060 }
1061}
1062
1063impl<K: Hash, V: Hash, P: SharedPointerKind> Hash for RedBlackTreeMap<K, V, P>
1064where
1065 K: Ord,
1066{
1067 fn hash<H: Hasher>(&self, state: &mut H) {
1068 self.size().hash(state);
1072
1073 for e in self {
1074 e.hash(state);
1075 }
1076 }
1077}
1078
1079impl<K, V, P> Display for RedBlackTreeMap<K, V, P>
1080where
1081 K: Ord + Display,
1082 V: Display,
1083 P: SharedPointerKind,
1084{
1085 fn fmt(&self, fmt: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
1086 let mut first = true;
1087
1088 fmt.write_str("{")?;
1089
1090 for (k, v) in self {
1091 if !first {
1092 fmt.write_str(", ")?;
1093 }
1094 k.fmt(fmt)?;
1095 fmt.write_str(": ")?;
1096 v.fmt(fmt)?;
1097 first = false;
1098 }
1099
1100 fmt.write_str("}")
1101 }
1102}
1103
1104impl<'a, K, V, P> IntoIterator for &'a RedBlackTreeMap<K, V, P>
1105where
1106 K: Ord,
1107 P: SharedPointerKind,
1108{
1109 type Item = (&'a K, &'a V);
1110 type IntoIter = Iter<'a, K, V, P>;
1111
1112 fn into_iter(self) -> Iter<'a, K, V, P> {
1113 self.iter()
1114 }
1115}
1116
1117impl<K, V, P> FromIterator<(K, V)> for RedBlackTreeMap<K, V, P>
1119where
1120 K: Ord,
1121 P: SharedPointerKind,
1122{
1123 fn from_iter<I: IntoIterator<Item = (K, V)>>(into_iter: I) -> RedBlackTreeMap<K, V, P> {
1124 let mut map = RedBlackTreeMap::new_with_ptr_kind();
1125
1126 for (k, v) in into_iter {
1127 map.insert_mut(k, v);
1128 }
1129
1130 map
1131 }
1132}
1133
1134mod iter_utils {
1135 use super::{Entry, Node, RedBlackTreeMap};
1136 use alloc::vec::Vec;
1137 use archery::{SharedPointer, SharedPointerKind};
1138 use core::borrow::Borrow;
1139 use core::ops::Bound;
1140
1141 #[derive(Debug)]
1145 pub struct IterStack<'a, K, V, P>
1146 where
1147 P: SharedPointerKind,
1148 {
1149 stack: Vec<&'a Node<K, V, P>>,
1155 backwards: bool,
1156 }
1157
1158 impl<'a, K, V, P> IterStack<'a, K, V, P>
1159 where
1160 K: Ord,
1161 P: SharedPointerKind,
1162 {
1163 pub fn new<Q>(
1164 map: &'a RedBlackTreeMap<K, V, P>,
1165 start_bound: Bound<&Q>,
1166 end_bound: Bound<&Q>,
1167 backwards: bool,
1168 ) -> IterStack<'a, K, V, P>
1169 where
1170 K: Borrow<Q>,
1171 Q: Ord + ?Sized,
1172 {
1173 let size = conservative_height(map.size()) + 1;
1174
1175 let mut stack = IterStack { stack: Vec::with_capacity(size), backwards };
1176
1177 if let Some(ref root) = map.root {
1178 stack.dig_towards(root.borrow(), start_bound, end_bound);
1179 }
1180
1181 stack.clear_if_finished(start_bound, end_bound);
1182
1183 stack
1184 }
1185
1186 fn clear_if_finished<Q>(&mut self, start_bound: Bound<&Q>, end_bound: Bound<&Q>)
1187 where
1188 K: Borrow<Q>,
1189 Q: Ord + ?Sized,
1190 {
1191 use core::ops::Bound::*;
1192
1193 if let Some(entry) = self.current() {
1194 let in_range = if self.backwards {
1195 match start_bound {
1196 Included(v) => entry.key.borrow() >= v,
1197 Excluded(v) => entry.key.borrow() > v,
1198 Unbounded => true,
1199 }
1200 } else {
1201 match end_bound {
1202 Included(v) => entry.key.borrow() <= v,
1203 Excluded(v) => entry.key.borrow() < v,
1204 Unbounded => true,
1205 }
1206 };
1207
1208 if !in_range {
1209 self.stack.clear();
1210 }
1211 }
1212 }
1213
1214 #[inline]
1215 pub fn current(&self) -> Option<&'a SharedPointer<Entry<K, V>, P>> {
1216 self.stack.last().map(|node| &node.entry)
1217 }
1218
1219 fn dig<Q>(&mut self)
1220 where
1221 K: Borrow<Q>,
1222 Q: Ord + ?Sized,
1223 {
1224 let child = self.stack.last().and_then(|node| {
1225 let c = if self.backwards { node.right.as_ref() } else { node.left.as_ref() };
1226 Node::borrow(c)
1227 });
1228
1229 if let Some(c) = child {
1230 self.stack.push(c);
1231 self.dig();
1232 }
1233 }
1234
1235 fn dig_towards<Q>(
1236 &mut self,
1237 node: &'a Node<K, V, P>,
1238 start_bound: Bound<&Q>,
1239 end_bound: Bound<&Q>,
1240 ) where
1241 K: Borrow<Q>,
1242 Q: Ord + ?Sized,
1243 {
1244 use core::ops::Bound::*;
1245
1246 let in_range = if self.backwards {
1247 match end_bound {
1248 Included(v) => node.entry.key.borrow() <= v,
1249 Excluded(v) => node.entry.key.borrow() < v,
1250 Unbounded => true,
1251 }
1252 } else {
1253 match start_bound {
1254 Included(v) => node.entry.key.borrow() >= v,
1255 Excluded(v) => node.entry.key.borrow() > v,
1256 Unbounded => true,
1257 }
1258 };
1259
1260 if in_range {
1261 self.stack.push(node);
1262 }
1263
1264 let child = match (self.backwards, in_range) {
1265 (false, true) => &node.left,
1266 (false, false) => &node.right,
1267 (true, true) => &node.right,
1268 (true, false) => &node.left,
1269 };
1270
1271 if let Some(c) = child {
1272 self.dig_towards(c.borrow(), start_bound, end_bound);
1273 }
1274 }
1275
1276 pub fn advance<Q>(&mut self, start_bound: Bound<&Q>, end_bound: Bound<&Q>)
1277 where
1278 K: Borrow<Q>,
1279 Q: Ord + ?Sized,
1280 {
1281 if let Some(node) = self.stack.pop() {
1282 let child = if self.backwards { node.left.as_ref() } else { node.right.as_ref() };
1283
1284 if let Some(c) = Node::borrow(child) {
1285 self.stack.push(c);
1286 self.dig();
1287 }
1288
1289 self.clear_if_finished(start_bound, end_bound);
1290 }
1291 }
1292 }
1293
1294 pub fn lg_floor(size: usize) -> usize {
1295 debug_assert!(size > 0);
1296
1297 let c: usize = usize::BITS as usize - size.leading_zeros() as usize;
1298
1299 c - 1
1300 }
1301
1302 pub fn conservative_height(size: usize) -> usize {
1303 if size > 0 { 2 * lg_floor(size + 1) } else { 0 }
1304 }
1305}
1306
1307#[derive(Debug)]
1308pub struct IterPtr<'a, K, V, P>
1309where
1310 P: SharedPointerKind,
1311{
1312 range_iter: RangeIterPtr<'a, K, V, RangeFull, K, P>,
1313
1314 size: usize,
1316}
1317
1318impl<K, V, P> IterPtr<'_, K, V, P>
1319where
1320 K: Ord,
1321 P: SharedPointerKind,
1322{
1323 fn new(map: &RedBlackTreeMap<K, V, P>) -> IterPtr<'_, K, V, P> {
1324 IterPtr { range_iter: RangeIterPtr::new(map, ..), size: map.size }
1325 }
1326}
1327
1328impl<'a, K, V, P> Iterator for IterPtr<'a, K, V, P>
1329where
1330 K: Ord,
1331 P: SharedPointerKind,
1332{
1333 type Item = &'a SharedPointer<Entry<K, V>, P>;
1334
1335 fn next(&mut self) -> Option<&'a SharedPointer<Entry<K, V>, P>> {
1336 if self.size > 0 {
1337 self.size -= 1;
1338 self.range_iter.next()
1339 } else {
1340 None
1341 }
1342 }
1343
1344 fn size_hint(&self) -> (usize, Option<usize>) {
1345 (self.size, Some(self.size))
1346 }
1347}
1348
1349impl<'a, K, V, P> DoubleEndedIterator for IterPtr<'a, K, V, P>
1350where
1351 K: Ord,
1352 P: SharedPointerKind,
1353{
1354 fn next_back(&mut self) -> Option<&'a SharedPointer<Entry<K, V>, P>> {
1355 if self.size > 0 {
1356 self.size -= 1;
1357 self.range_iter.next_back()
1358 } else {
1359 None
1360 }
1361 }
1362}
1363
1364impl<K: Ord, V, P> ExactSizeIterator for IterPtr<'_, K, V, P> where P: SharedPointerKind {}
1365
1366#[derive(Debug)]
1367pub struct RangeIterPtr<'a, K, V, RB, Q: ?Sized, P>
1368where
1369 P: SharedPointerKind,
1370{
1371 map: &'a RedBlackTreeMap<K, V, P>,
1372
1373 stack_forward: Option<iter_utils::IterStack<'a, K, V, P>>,
1374 stack_backward: Option<iter_utils::IterStack<'a, K, V, P>>,
1375
1376 range: RB,
1377 _q: PhantomData<Q>,
1378}
1379
1380impl<'a, K, V, Q, RB, P> RangeIterPtr<'a, K, V, RB, Q, P>
1381where
1382 K: Ord + Borrow<Q>,
1383 Q: Ord + ?Sized,
1384 RB: RangeBounds<Q>,
1385 P: SharedPointerKind,
1386{
1387 fn new(map: &'a RedBlackTreeMap<K, V, P>, range: RB) -> RangeIterPtr<'a, K, V, RB, Q, P> {
1388 RangeIterPtr { map, stack_forward: None, stack_backward: None, range, _q: PhantomData }
1389 }
1390
1391 fn init_if_needed(&mut self, backwards: bool) {
1392 use iter_utils::IterStack;
1393
1394 let stack_field =
1395 if backwards { &mut self.stack_backward } else { &mut self.stack_forward };
1396
1397 if stack_field.is_none() {
1398 *stack_field = Some(IterStack::new(
1399 self.map,
1400 self.range.start_bound(),
1401 self.range.end_bound(),
1402 backwards,
1403 ));
1404 }
1405 }
1406
1407 fn is_remaining_range_empty(&self) -> bool {
1408 match (&self.stack_forward, &self.stack_backward) {
1409 (Some(stack_forward), Some(stack_backward)) => {
1410 match (stack_forward.current(), stack_backward.current()) {
1411 (Some(left), Some(right)) => left.key > right.key,
1412 (_, _) => true,
1413 }
1414 }
1415 (_, _) => false,
1416 }
1417 }
1418
1419 fn current_forward(&self) -> Option<&'a SharedPointer<Entry<K, V>, P>> {
1420 match self.is_remaining_range_empty() {
1421 true => None,
1422 false => self.stack_forward.as_ref().unwrap().current(),
1423 }
1424 }
1425
1426 fn advance_forward(&mut self) {
1427 self.stack_forward
1428 .as_mut()
1429 .unwrap()
1430 .advance(self.range.start_bound(), self.range.end_bound());
1431 }
1432
1433 fn current_backward(&self) -> Option<&'a SharedPointer<Entry<K, V>, P>> {
1434 match self.is_remaining_range_empty() {
1435 true => None,
1436 false => self.stack_backward.as_ref().unwrap().current(),
1437 }
1438 }
1439
1440 fn advance_backward(&mut self) {
1441 self.stack_backward
1442 .as_mut()
1443 .unwrap()
1444 .advance(self.range.start_bound(), self.range.end_bound());
1445 }
1446}
1447
1448impl<'a, K, V, RB, Q, P> Iterator for RangeIterPtr<'a, K, V, RB, Q, P>
1449where
1450 K: Ord + Borrow<Q>,
1451 Q: Ord + ?Sized,
1452 RB: RangeBounds<Q>,
1453 P: SharedPointerKind,
1454{
1455 type Item = &'a SharedPointer<Entry<K, V>, P>;
1456
1457 fn next(&mut self) -> Option<Self::Item> {
1458 self.init_if_needed(false);
1459
1460 let current = self.current_forward();
1461
1462 self.advance_forward();
1463
1464 current
1465 }
1466}
1467
1468impl<'a, K, V, RB, Q, P> DoubleEndedIterator for RangeIterPtr<'a, K, V, RB, Q, P>
1469where
1470 K: Ord + Borrow<Q>,
1471 Q: Ord + ?Sized,
1472 RB: RangeBounds<Q>,
1473 P: SharedPointerKind,
1474{
1475 fn next_back(&mut self) -> Option<&'a SharedPointer<Entry<K, V>, P>> {
1476 self.init_if_needed(true);
1477
1478 let current = self.current_backward();
1479
1480 self.advance_backward();
1481
1482 current
1483 }
1484}
1485
1486#[cfg(feature = "serde")]
1487pub mod serde {
1488 use super::*;
1489 use ::serde::de::{Deserialize, Deserializer, MapAccess, Visitor};
1490 use ::serde::ser::{Serialize, Serializer};
1491 use core::fmt;
1492 use core::marker::PhantomData;
1493
1494 impl<K, V, P> Serialize for RedBlackTreeMap<K, V, P>
1495 where
1496 K: Ord + Serialize,
1497 V: Serialize,
1498 P: SharedPointerKind,
1499 {
1500 fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
1501 serializer.collect_map(self)
1502 }
1503 }
1504
1505 impl<'de, K, V, P> Deserialize<'de> for RedBlackTreeMap<K, V, P>
1506 where
1507 K: Ord + Deserialize<'de>,
1508 V: Deserialize<'de>,
1509 P: SharedPointerKind,
1510 {
1511 fn deserialize<D: Deserializer<'de>>(
1512 deserializer: D,
1513 ) -> Result<RedBlackTreeMap<K, V, P>, D::Error> {
1514 deserializer.deserialize_map(RedBlackTreeMapVisitor {
1515 _phantom_entry: PhantomData,
1516 _phantom_p: PhantomData,
1517 })
1518 }
1519 }
1520
1521 struct RedBlackTreeMapVisitor<K, V, P>
1522 where
1523 P: SharedPointerKind,
1524 {
1525 _phantom_entry: PhantomData<(K, V)>,
1526 _phantom_p: PhantomData<P>,
1527 }
1528
1529 impl<'de, K, V, P> Visitor<'de> for RedBlackTreeMapVisitor<K, V, P>
1530 where
1531 K: Ord + Deserialize<'de>,
1532 V: Deserialize<'de>,
1533 P: SharedPointerKind,
1534 {
1535 type Value = RedBlackTreeMap<K, V, P>;
1536
1537 fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
1538 formatter.write_str("a map")
1539 }
1540
1541 fn visit_map<A>(self, mut map: A) -> Result<RedBlackTreeMap<K, V, P>, A::Error>
1542 where
1543 A: MapAccess<'de>,
1544 {
1545 let mut rb_tree_map = RedBlackTreeMap::new_with_ptr_kind();
1546
1547 while let Some((k, v)) = map.next_entry()? {
1548 rb_tree_map.insert_mut(k, v);
1549 }
1550
1551 Ok(rb_tree_map)
1552 }
1553 }
1554}
1555
1556#[cfg(test)]
1557mod test;