annotate src/parallel_execution/rb_tree.cbc @ 274:d14eb393023d

fix generate_stub
author mir3636
date Wed, 01 Feb 2017 18:13:47 +0900
parents 081607dcf893
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 #include <stdio.h>
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
3 #include "context.h"
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4 #include "origin_cs.h"
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
5
131
a4507906938c Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 130
diff changeset
6 extern enum Relational compare(struct Node* node1, struct Node* node2);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7
159
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
8 typedef struct Tree {
194
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
9 union Data* tree;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
10 struct Node* node;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
11 enum Code put;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
12 enum Code get;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
13 enum Code remove;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
14 enum Code clear;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
15 enum Code next;
159
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
16 } Tree;
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
17
194
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
18 typedef struct RedBlackTree {
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
19 struct Node* root;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
20 struct Node* current; // reading node of original tree
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
21 struct Node* previous; // parent of reading node of original tree
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
22 struct Node* newNode; // writing node of new tree
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
23 struct Node* parent;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
24 struct Node* grandparent;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
25 struct Stack* nodeStack;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
26 int result;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
27 } RedBlackTree;
159
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
28
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
29 typedef struct RotateTree {
194
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
30 enum Code next;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
31 struct RedBlackTree* traverse;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
32 struct Tree* tree;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
33 } rotateTree;
159
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
34
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
35 typedef struct Node {
194
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
36 int key; // comparable data segment
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
37 union Data* value;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
38 struct Node* left;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
39 struct Node* right;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
40 // need to balancing
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
41 enum Color { Red, Black, } color;
081607dcf893 create generate_stub.pl
mir3636
parents: 159
diff changeset
42 } node;
159
f2c77b0761fc fix rb_stack.cbc
mir3636
parents: 157
diff changeset
43
126
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
44 void printTree1(union Data* data) {
132
7c309e1aea73 Code Gears stack api
one
parents: 131
diff changeset
45 struct Node* node = &data->node;
126
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
46 if (node == NULL) {
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
47 printf("NULL");
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
48 } else {
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
49 printf("key = %d (", node->key);
133
568730b1239e call stack interface in rb_tree
mir3636
parents: 132
diff changeset
50 printTree1((union Data*)(node->right));
126
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
51 printf("), (");
133
568730b1239e call stack interface in rb_tree
mir3636
parents: 132
diff changeset
52 printTree1((union Data*)(node->left));
126
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
53 printf(")");
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
54 }
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
55 }
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
56
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
57 void printTree(union Data* data) {
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
58 printTree1(data);
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
59 printf("\n");
c7ac153f86dd Fix rotate cs stack
one
parents: 125
diff changeset
60 }
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
61
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
62 __code put(struct Stack* nodeStack, struct Tree* tree, struct Node* node, struct Traverse* traverse, struct Node* root, __code next(...)) {
133
568730b1239e call stack interface in rb_tree
mir3636
parents: 132
diff changeset
63 printTree((union Data*)(tree->root));
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
64 Node* newNode = new Node();
122
73a679a85c04 node stack rewrite
ikkun
parents: 121
diff changeset
65 traverse->newNode = newNode;
73a679a85c04 node stack rewrite
ikkun
parents: 121
diff changeset
66 tree->root = newNode; // this should done at stackClear
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
67 traverse->parent = NULL;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 if (root) {
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
69 traverse->current = root;
131
a4507906938c Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 130
diff changeset
70 traverse->result = compare(traverse->current, node);
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
71 goto replaceNode(traverse, traverse->current, newNode);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
74 goto insertNode(traverse, traverse->node, newNode);
121
f708b271a7b8 node stack rewrite
ikkun
parents: 120
diff changeset
75 }
f708b271a7b8 node stack rewrite
ikkun
parents: 120
diff changeset
76
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
77 __code replaceNode(struct Traverse* traverse, struct Node* oldNode, struct Node* newNode) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
78 Stack* nodeStack = new Stack();
138
04a2f486a30d insert works but is not balanced
kono
parents: 137
diff changeset
79 traverse->previous = newNode;
121
f708b271a7b8 node stack rewrite
ikkun
parents: 120
diff changeset
80 *newNode = *oldNode;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
81 nodeStack->stack = traverse->nodeStack;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
82 nodeStack->data = newNode;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
83 nodeStack->next = replaceNode1;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
84 goto traverse->nodeStack->push(nodeStack);
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
85 // goto traverse->nodeStack->push(newNode, replaceNode1);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
88 __code replaceNode1(struct Traverse* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, int result, __code next(...)) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
89 Node* newnewNode = new Node();
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 if (result == EQ) {
121
f708b271a7b8 node stack rewrite
ikkun
parents: 120
diff changeset
91 newNode->value = node->value;
117
a574ba0da60f add comment rb_tree
ikkun
parents: 103
diff changeset
92 // go to stack clear
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
93 goto next(...);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 } else if (result == GT) {
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
95 traverse->current = oldNode->right;
121
f708b271a7b8 node stack rewrite
ikkun
parents: 120
diff changeset
96 newNode->right = newnewNode;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97 } else {
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
98 traverse->current = oldNode->left;
121
f708b271a7b8 node stack rewrite
ikkun
parents: 120
diff changeset
99 newNode->left = newnewNode;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100 }
122
73a679a85c04 node stack rewrite
ikkun
parents: 121
diff changeset
101 traverse->newNode = newnewNode;
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
102 if (traverse->current) {
131
a4507906938c Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 130
diff changeset
103 traverse->result = compare(traverse->current, node);
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
104 goto replaceNode(traverse, traverse->current, newNode);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
105 }
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
106 goto insertNode(traverse, traverse->node, newNode);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
107 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
108
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
109 __code insertNode(struct Traverse* traverse, struct Node* node, struct Node* newNode) {
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
110 *newNode = *node;
122
73a679a85c04 node stack rewrite
ikkun
parents: 121
diff changeset
111 newNode->color = Red;
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
112 traverse->current = newNode;
154
efef5d4df54f Add normal level and agda code
atton
parents: 150
diff changeset
113 goto traverse->nodeStack->get2(traverse, tree, insertCase1);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
114 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
115
154
efef5d4df54f Add normal level and agda code
atton
parents: 150
diff changeset
116 __code insertCase1(struct Node *parent, struct Node *grandparent, struct Traverse* traverse, struct Tree* tree) {
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
117 if (parent != NULL) {
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
118 traverse->parent = parent;
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
119 traverse->grandparent = grandparent;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
120 goto insertCase2(traverse);
122
73a679a85c04 node stack rewrite
ikkun
parents: 121
diff changeset
121 }
127
fe1fbfec7d01 stack clear
kono
parents: 126
diff changeset
122 tree->root->color = Black;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
123 goto stackClear(traverse);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
124 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
125
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
126 __code insertCase2(struct Traverse* traverse) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
127 if (traverse->parent->color == Black) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
128 goto stackClear(traverse);
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
129 }
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
130 goto insertCase3(traverse);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
133 __code insertCase3(struct Traverse* traverse) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
134 Stack* nodeStack = new Stack();
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 struct Node* uncle;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
137 if (traverse->grandparent->left == traverse->parent)
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
138 uncle = traverse->grandparent->right;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
139 else
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
140 uncle = traverse->grandparent->left;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
141
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
142 if (uncle && (uncle->color == Red)) {
117
a574ba0da60f add comment rb_tree
ikkun
parents: 103
diff changeset
143 // do insertcase1 on grandparent, stack must be pop by two
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
144 traverse->parent->color = Black;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
145 uncle->color = Black;
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
146 traverse->grandparent->color = Red;
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
147 traverse->current = traverse->grandparent;
138
04a2f486a30d insert works but is not balanced
kono
parents: 137
diff changeset
148 nodeStack->stack = (union Data*)traverse->nodeStack;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
149 nodeStack->next = insertCase1;
157
mir3636
parents: 154
diff changeset
150 goto traverse->nodeStack->pop2(nodeStack);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
151 }
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
152 goto insertCase4(traverse, traverse->rotateTree);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
153 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
155 __code insertCase4(struct Traverse* traverse, struct RotateTree* rotateTree) {
134
2eccf4564efe fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 133
diff changeset
156 struct Stack* nodeStack = traverse->nodeStack;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
157
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
158 if ((traverse->current == traverse->parent->right) && (traverse->parent == traverse->grandparent->left)) {
134
2eccf4564efe fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 133
diff changeset
159 traverse->current = traverse->current->left;
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
160 traverse->parent = traverse->grandparent;
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
161
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
162 rotateTree->traverse = traverse;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
163 rotateTree->next = insertCase5;
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
164
138
04a2f486a30d insert works but is not balanced
kono
parents: 137
diff changeset
165 nodeStack->stack = (union Data*)traverse->nodeStack;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
166 nodeStack->next = rotateLeft;
157
mir3636
parents: 154
diff changeset
167 goto nodeStack->pop(nodeStack);
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
168 } else if ((traverse->current == traverse->parent->left) && (traverse->parent == traverse->grandparent->right)) {
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
169 traverse->parent = traverse->grandparent;
134
2eccf4564efe fix stack call in rb_tree
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 133
diff changeset
170 traverse->current = traverse->current->right;
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
171
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
172 rotateTree->traverse = traverse;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
173 rotateTree->next = insertCase5;
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
174
138
04a2f486a30d insert works but is not balanced
kono
parents: 137
diff changeset
175 nodeStack->stack = (union Data*)traverse->nodeStack;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
176 nodeStack->next = rotateRight;
157
mir3636
parents: 154
diff changeset
177 goto nodeStack->pop(nodeStack);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
178 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
179
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
180 goto insertCase5(traverse);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
181 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
182
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
183 __code insertCase5(struct Traverse* traverse) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
184 Stack* stack = new Stack;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
185 nodeStack->stack = (union Data*)traverse->nodeStack;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
186 nodeStack->next = insertCase51;
157
mir3636
parents: 154
diff changeset
187 goto traverse->nodeStack->pop2(nodeStack);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
188 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
189
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
190 __code insertCase51(struct Traverse* traverse, struct RotateTree *rotateTree, struct Node* current, struct Node* parent, struct Node* grandparent) {
143
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
191 traverse->parent = parent;
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
192 traverse->grandparent = grandparent;
34a7a21edc36 recude stack get using traverse field
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 141
diff changeset
193
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
194 parent->color = Black;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
195 grandparent->color = Red;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
196
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
197 traverse->current = grandparent;
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
198
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
199 rotateTree->traverse = traverse;
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
200 rotateTree->next = stackClear;
147
f2275f5777f4 add treeRotate data
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 146
diff changeset
201
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
202 if ((current == parent->left) && (parent == grandparent->left))
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
203 goto rotateRight(traverse);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
204 else
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
205 goto rotateLeft(traverse);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
206 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
207
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
208 __code rotateLeft(struct Traverse* traverse) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
209 Stack* nodeStack = new Stack();
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
210 nodeStack->stack = (union Data*)traverse->nodeStack;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
211 nodeStack->next = rotateLeft1;
157
mir3636
parents: 154
diff changeset
212 goto traverse->nodeStack->get(nodeStack);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
213 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
215 __code rotateLeft1(struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node *parent,struct RotateTree *rotateTree) {
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
216 struct Node* tmp = node->right;
123
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
217
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
218 if (parent) {
146
423141c31664 fix rotate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 145
diff changeset
219 if (node == parent->left)
123
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
220 parent->left = tmp;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
221 else
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
222 parent->right = tmp;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
223 } else {
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
224 tree->root = tmp;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
225 }
117
a574ba0da60f add comment rb_tree
ikkun
parents: 103
diff changeset
226
123
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
227 node->right = tmp->left;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
228 tmp->left = node;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
229 traverse->current = tmp;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
230
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
231 goto rotateTree->next(...);
123
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
232 }
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
233
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
234 __code rotateRight(struct Traverse* traverse) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
235 Stack* nodeStack = new Stack();
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
236 nodeStack->stack = (union Data*)traverse->nodeStack;
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
237 nodeStack->next = rotateRight1;
157
mir3636
parents: 154
diff changeset
238 goto traverse->nodeStack->get(nodeStack);
123
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
239 }
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
240
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
241 __code rotateRight1(struct Node* node, struct Tree* tree, struct Traverse* traverse,struct Node *parent,struct RotateTree *rotateTree) {
123
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
242 struct Node* tmp = node->left;
933c80f48d06 node stack rewrite
ikkun
parents: 122
diff changeset
243
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
244 if (parent) {
146
423141c31664 fix rotate
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 145
diff changeset
245 if (node == parent->left)
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
246 parent->left = tmp;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
247 else
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
248 parent->right = tmp;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
249 } else {
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
250 tree->root = tmp;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
251 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
252
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
253 node->left = tmp->right;
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
254 tmp->right = node;
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
255 traverse->current = tmp;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
256
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
257 goto rotateTree->next(...);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
258 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
259
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
260 __code stackClear(struct Traverse* traverse) {
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
261 Stack* nodeStack = new Stack();
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
262 traverse->current = 0;
145
cc071cf1ba85 add stack clear interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 144
diff changeset
263 nodeStack->stack = (union Data*)traverse->nodeStack;
cc071cf1ba85 add stack clear interface
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 144
diff changeset
264 nodeStack->next = context->next;
157
mir3636
parents: 154
diff changeset
265 goto traverse->nodeStack->clear(nodeStack);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
266 }
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
267
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
268 __code get(struct Tree* tree, struct Traverse* traverse) {
92
851da1107223 implement twice
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
269 if (tree->root) {
851da1107223 implement twice
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
270 traverse->current = tree->root;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
271
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
272 goto search(traverse, traverse->node);
92
851da1107223 implement twice
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
273 }
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
274
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
275 goto traverse->next(...);
92
851da1107223 implement twice
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 91
diff changeset
276 }
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
277
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
278 __code search(struct Traverse* traverse, struct Node* node) {
131
a4507906938c Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 130
diff changeset
279 // compare(context, traverse, traverse->current->key, node->key);
a4507906938c Fix compile error but not work
Tatsuki IHA <e125716@ie.u-ryukyu.ac.jp>
parents: 130
diff changeset
280 traverse->result = compare(traverse->current, node);
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
281 if (traverse->result == EQ) {
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
282 *node = *traverse->current;
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
157
mir3636
parents: 154
diff changeset
284 goto traverse->next(...);
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
285 } else if (traverse->result == GT) {
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
286 traverse->current = traverse->current->right;
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
287 } else {
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
288 traverse->current = traverse->current->left;
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
289 }
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
290
91
1e074c3878c7 modify tree
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents: 87
diff changeset
291 if (traverse->current)
157
mir3636
parents: 154
diff changeset
292 goto search(traverse, traverse->node);
86
e06e1a9e569e create worker
Shohei KOKUBO <e105744@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293
150
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
294 goto traverse->next(...);
7164f59660d4 create .cbc
mir3636
parents: 149
diff changeset
295 }