@@ -62,17 +62,6 @@ struct RBTree
62
62
63
63
static RBNode sentinel = {RBBLACK , RBNIL , RBNIL , NULL };
64
64
65
- /*
66
- * Values used in the RBTreeIterator.next_state field, with an
67
- * InvertedWalk iterator.
68
- */
69
- typedef enum InvertedWalkNextStep
70
- {
71
- NextStepBegin ,
72
- NextStepUp ,
73
- NextStepLeft ,
74
- NextStepRight
75
- } InvertedWalkNextStep ;
76
65
77
66
/*
78
67
* rb_create: create an empty RBTree
@@ -567,6 +556,7 @@ rb_delete_node(RBTree *rb, RBNode *z)
567
556
RBNode * x ,
568
557
* y ;
569
558
559
+ /* This is just paranoia: we should only get called on a valid node */
570
560
if (!z || z == RBNIL )
571
561
return ;
572
562
@@ -730,114 +720,6 @@ rb_right_left_iterator(RBTreeIterator *iter)
730
720
return iter -> last_visited ;
731
721
}
732
722
733
- static RBNode *
734
- rb_direct_iterator (RBTreeIterator * iter )
735
- {
736
- if (iter -> last_visited == NULL )
737
- {
738
- iter -> last_visited = iter -> rb -> root ;
739
- return iter -> last_visited ;
740
- }
741
-
742
- if (iter -> last_visited -> left != RBNIL )
743
- {
744
- iter -> last_visited = iter -> last_visited -> left ;
745
- return iter -> last_visited ;
746
- }
747
-
748
- do
749
- {
750
- if (iter -> last_visited -> right != RBNIL )
751
- {
752
- iter -> last_visited = iter -> last_visited -> right ;
753
- break ;
754
- }
755
-
756
- /* go up and one step right */
757
- for (;;)
758
- {
759
- RBNode * came_from = iter -> last_visited ;
760
-
761
- iter -> last_visited = iter -> last_visited -> parent ;
762
- if (iter -> last_visited == NULL )
763
- {
764
- iter -> is_over = true;
765
- break ;
766
- }
767
-
768
- if ((iter -> last_visited -> right != came_from ) && (iter -> last_visited -> right != RBNIL ))
769
- {
770
- iter -> last_visited = iter -> last_visited -> right ;
771
- return iter -> last_visited ;
772
- }
773
- }
774
- }
775
- while (iter -> last_visited != NULL );
776
-
777
- return iter -> last_visited ;
778
- }
779
-
780
- static RBNode *
781
- rb_inverted_iterator (RBTreeIterator * iter )
782
- {
783
- RBNode * came_from ;
784
- RBNode * current ;
785
-
786
- current = iter -> last_visited ;
787
-
788
- loop :
789
- switch ((InvertedWalkNextStep ) iter -> next_step )
790
- {
791
- /* First call, begin from root */
792
- case NextStepBegin :
793
- current = iter -> rb -> root ;
794
- iter -> next_step = NextStepLeft ;
795
- goto loop ;
796
-
797
- case NextStepLeft :
798
- while (current -> left != RBNIL )
799
- current = current -> left ;
800
-
801
- iter -> next_step = NextStepRight ;
802
- goto loop ;
803
-
804
- case NextStepRight :
805
- if (current -> right != RBNIL )
806
- {
807
- current = current -> right ;
808
- iter -> next_step = NextStepLeft ;
809
- goto loop ;
810
- }
811
- else /* not moved - return current, then go up */
812
- iter -> next_step = NextStepUp ;
813
- break ;
814
-
815
- case NextStepUp :
816
- came_from = current ;
817
- current = current -> parent ;
818
- if (current == NULL )
819
- {
820
- iter -> is_over = true;
821
- break ; /* end of iteration */
822
- }
823
- else if (came_from == current -> right )
824
- {
825
- /* return current, then continue to go up */
826
- break ;
827
- }
828
- else
829
- {
830
- /* otherwise we came from the left */
831
- Assert (came_from == current -> left );
832
- iter -> next_step = NextStepRight ;
833
- goto loop ;
834
- }
835
- }
836
-
837
- iter -> last_visited = current ;
838
- return current ;
839
- }
840
-
841
723
/*
842
724
* rb_begin_iterate: prepare to traverse the tree in any of several orders
843
725
*
@@ -849,7 +731,7 @@ rb_inverted_iterator(RBTreeIterator *iter)
849
731
* tree are allowed.
850
732
*
851
733
* The iterator state is stored in the 'iter' struct. The caller should
852
- * treat it as opaque struct.
734
+ * treat it as an opaque struct.
853
735
*/
854
736
void
855
737
rb_begin_iterate (RBTree * rb , RBOrderControl ctrl , RBTreeIterator * iter )
@@ -867,13 +749,6 @@ rb_begin_iterate(RBTree *rb, RBOrderControl ctrl, RBTreeIterator *iter)
867
749
case RightLeftWalk : /* visit right, then self, then left */
868
750
iter -> iterate = rb_right_left_iterator ;
869
751
break ;
870
- case DirectWalk : /* visit self, then left, then right */
871
- iter -> iterate = rb_direct_iterator ;
872
- break ;
873
- case InvertedWalk : /* visit left, then right, then self */
874
- iter -> iterate = rb_inverted_iterator ;
875
- iter -> next_step = NextStepBegin ;
876
- break ;
877
752
default :
878
753
elog (ERROR , "unrecognized rbtree iteration order: %d" , ctrl );
879
754
}
0 commit comments