comparison src/parallel_execution/rb_tree.c @ 138:04a2f486a30d

insert works but is not balanced
author kono
date Tue, 08 Nov 2016 19:39:40 +0900
parents 909d0548284f
children c13b07d15d86
comparison
equal deleted inserted replaced
137:909d0548284f 138:04a2f486a30d
1 #include <stdio.h> 1 #include <stdio.h>
2 2
3 #include "context.h" 3 #include "context.h"
4 #include "origin_cs.h" 4 #include "origin_cs.h"
5 5
6 extern union Data* allocator(struct Context* context);
7 extern enum Relational compare(struct Node* node1, struct Node* node2); 6 extern enum Relational compare(struct Node* node1, struct Node* node2);
8 7
9 void printTree1(union Data* data) { 8 void printTree1(union Data* data) {
10 struct Node* node = &data->node; 9 struct Node* node = &data->node;
11 if (node == NULL) { 10 if (node == NULL) {
29 traverse->newNode = newNode; 28 traverse->newNode = newNode;
30 tree->root = newNode; // this should done at stackClear 29 tree->root = newNode; // this should done at stackClear
31 if (root) { 30 if (root) {
32 traverse->current = root; 31 traverse->current = root;
33 traverse->result = compare(traverse->current, node); 32 traverse->result = compare(traverse->current, node);
34 nodeStack->data = (union Data*)(newNode); 33 goto meta(context, Replace);
35 nodeStack->next = Replace1;
36 goto meta(context, nodeStack->push);
37 } 34 }
38 35
39 goto meta(context, Insert); 36 goto meta(context, Insert);
40 } 37 }
41 38
42 __code put_stub(struct Context* context) { 39 __code put_stub(struct Context* context) {
43 struct Node* newNode = &ALLOCATE(context, Node)->node; 40 struct Node* newNode = &ALLOCATE(context, Node)->node;
44 goto put(context, 41 goto put(context,
45 context->data[Traverse]->traverse.nodeStack, 42 &context->data[Stack]->stack,
46 &context->data[Tree]->tree, 43 &context->data[Tree]->tree,
47 &context->data[Node]->node, 44 &context->data[Node]->node,
48 &context->data[Traverse]->traverse, 45 &context->data[Traverse]->traverse,
49 context->data[Tree]->tree.root, 46 context->data[Tree]->tree.root,
50 newNode 47 newNode
51 ); 48 );
52 } 49 }
53 50
54 __code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, struct Stack* nodeStack) { 51 __code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, struct Stack* nodeStack) {
52 traverse->previous = newNode;
55 *newNode = *oldNode; 53 *newNode = *oldNode;
54 nodeStack->stack = (union Data*)traverse->nodeStack;
56 nodeStack->data = (union Data*)(newNode); 55 nodeStack->data = (union Data*)(newNode);
57 nodeStack->next = Replace1; 56 nodeStack->next = Replace1;
58 goto meta(context, nodeStack->push); 57 goto meta(context, traverse->nodeStack->push);
59 } 58 }
60 59
61 __code replaceNode_stub(struct Context* context) { 60 __code replaceNode_stub(struct Context* context) {
62 goto replaceNode(context, 61 goto replaceNode(context,
63 &context->data[Traverse]->traverse, 62 &context->data[Traverse]->traverse,
64 context->data[Traverse]->traverse.current, 63 context->data[Traverse]->traverse.current,
65 context->data[Traverse]->traverse.newNode, 64 context->data[Traverse]->traverse.newNode,
66 context->data[Traverse]->traverse.nodeStack); 65 &context->data[Stack]->stack);
67 } 66 }
68 67
69 __code replaceNode1(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, struct Node* newnewNode, int result) { 68 __code replaceNode1(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, struct Node* newnewNode, int result) {
70 if (result == EQ) { 69 if (result == EQ) {
71 newNode->value = node->value; 70 newNode->value = node->value;
92 struct Node* newnewNode = &ALLOCATE(context, Node)->node; 91 struct Node* newnewNode = &ALLOCATE(context, Node)->node;
93 goto replaceNode1(context, 92 goto replaceNode1(context,
94 &context->data[Traverse]->traverse, 93 &context->data[Traverse]->traverse,
95 &context->data[Node]->node, 94 &context->data[Node]->node,
96 context->data[Traverse]->traverse.current, 95 context->data[Traverse]->traverse.current,
97 &context->data[Traverse]->traverse.nodeStack->data->node, 96 context->data[Traverse]->traverse.previous,
98 newnewNode, 97 newnewNode,
99 context->data[Traverse]->traverse.result); 98 context->data[Traverse]->traverse.result);
100 } 99 }
101 100
102 __code insertNode(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* newNode) { 101 __code insertNode(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* newNode) {
125 goto insertCase1(context, 124 goto insertCase1(context,
126 &context->data[Tree]->tree, 125 &context->data[Tree]->tree,
127 &context->data[Traverse]->traverse.nodeStack->stack->singleLinkedStack); 126 &context->data[Traverse]->traverse.nodeStack->stack->singleLinkedStack);
128 } 127 }
129 128
130 __code insertCase2(struct Context* context, struct Stack* nodeStack, struct Node* parent) { 129 __code insertCase2(struct Context* context, struct Traverse* traverse, struct Stack* nodeStack, struct Node* parent) {
131 if (parent->color == Black) { 130 if (parent->color == Black) {
132 goto meta(context, StackClear); 131 goto meta(context, StackClear);
133 } 132 }
133 nodeStack->stack = (union Data*)traverse->nodeStack;
134 nodeStack->next = InsertCase3; 134 nodeStack->next = InsertCase3;
135 goto meta(context, nodeStack->get2); 135 goto meta(context, traverse->nodeStack->get2);
136 } 136 }
137 137
138 __code insert2_stub(struct Context* context) { 138 __code insert2_stub(struct Context* context) {
139 struct SingleLinkedStack *nodeStack = (struct SingleLinkedStack*)context->data[Traverse]->traverse.nodeStack->stack; 139 struct SingleLinkedStack *nodeStack = (struct SingleLinkedStack*)context->data[Traverse]->traverse.nodeStack->stack;
140 goto insertCase2(context, context->data[Traverse]->traverse.nodeStack, &nodeStack->top->data->node); 140 goto insertCase2(context, &context->data[Traverse]->traverse, &context->data[Stack]->stack, &nodeStack->top->data->node);
141 } 141 }
142 142
143 __code insertCase3(struct Context* context, struct Traverse* traverse, struct Node* parent, struct Node* grandparent) { 143 __code insertCase3(struct Context* context, struct Traverse* traverse, struct Stack* nodeStack, struct Node* parent, struct Node* grandparent) {
144 struct Stack* nodeStack = traverse->nodeStack;
145 struct Node* uncle; 144 struct Node* uncle;
146 145
147 if (grandparent->left == parent) 146 if (grandparent->left == parent)
148 uncle = grandparent->right; 147 uncle = grandparent->right;
149 else 148 else
153 // do insertcase1 on grandparent, stack must be pop by two 152 // do insertcase1 on grandparent, stack must be pop by two
154 parent->color = Black; 153 parent->color = Black;
155 uncle->color = Black; 154 uncle->color = Black;
156 grandparent->color = Red; 155 grandparent->color = Red;
157 traverse->current = grandparent; 156 traverse->current = grandparent;
157 nodeStack->stack = (union Data*)traverse->nodeStack;
158 nodeStack->next = InsertCase1; 158 nodeStack->next = InsertCase1;
159 goto meta(context, nodeStack->pop2); 159 goto meta(context, traverse->nodeStack->pop2);
160 } 160 }
161 nodeStack->stack = (union Data*)traverse->nodeStack;
161 nodeStack->next = InsertCase4; 162 nodeStack->next = InsertCase4;
162 goto meta(context, nodeStack->get2); 163 goto meta(context, traverse->nodeStack->get2);
163 } 164 }
164 165
165 __code insert3_stub(struct Context* context) { 166 __code insert3_stub(struct Context* context) {
166 goto insertCase3(context, &context->data[Traverse]->traverse, 167 goto insertCase3(context, &context->data[Traverse]->traverse,
168 &context->data[Stack]->stack,
167 &context->data[Traverse]->traverse.nodeStack->data->node, 169 &context->data[Traverse]->traverse.nodeStack->data->node,
168 &context->data[Traverse]->traverse.nodeStack->data1->node 170 &context->data[Traverse]->traverse.nodeStack->data1->node
169 ); 171 );
170 } 172 }
171 173
174 traverse->current = parent; 176 traverse->current = parent;
175 177
176 if ((current == parent->right) && (parent == grandparent->left)) { 178 if ((current == parent->right) && (parent == grandparent->left)) {
177 traverse->current = traverse->current->left; 179 traverse->current = traverse->current->left;
178 traverse->rotateNext = InsertCase5; 180 traverse->rotateNext = InsertCase5;
181 nodeStack->stack = (union Data*)traverse->nodeStack;
179 nodeStack->next = RotateL; 182 nodeStack->next = RotateL;
180 goto meta(context, nodeStack->get); 183 goto meta(context, nodeStack->get);
181 } else if ((current == parent->left) && (parent == grandparent->right)) { 184 } else if ((current == parent->left) && (parent == grandparent->right)) {
182 traverse->current = traverse->current->right; 185 traverse->current = traverse->current->right;
183 traverse->rotateNext = InsertCase5; 186 traverse->rotateNext = InsertCase5;
187 nodeStack->stack = (union Data*)traverse->nodeStack;
184 nodeStack->next = RotateR; 188 nodeStack->next = RotateR;
185 goto meta(context, nodeStack->get); 189 goto meta(context, nodeStack->get);
186 } 190 }
187 191
188 traverse->current = current; 192 traverse->current = current;
195 &context->data[Traverse]->traverse.nodeStack->data1->node); 199 &context->data[Traverse]->traverse.nodeStack->data1->node);
196 } 200 }
197 201
198 __code insertCase5(struct Context* context, struct Traverse* traverse) { 202 __code insertCase5(struct Context* context, struct Traverse* traverse) {
199 struct Stack* nodeStack = traverse->nodeStack; 203 struct Stack* nodeStack = traverse->nodeStack;
204 nodeStack->stack = (union Data*)traverse->nodeStack;
200 nodeStack->next = InsertCase51; 205 nodeStack->next = InsertCase51;
201 goto meta(context, nodeStack->pop2); 206 goto meta(context, nodeStack->pop2);
202 } 207 }
203 208
204 __code insert5_stub(struct Context* context) { 209 __code insert5_stub(struct Context* context) {
225 } 230 }
226 231
227 // put rotateLeft's continuation as argument 232 // put rotateLeft's continuation as argument
228 __code rotateLeft(struct Context* context, struct Traverse* traverse) { 233 __code rotateLeft(struct Context* context, struct Traverse* traverse) {
229 struct Stack* nodeStack = traverse->nodeStack; 234 struct Stack* nodeStack = traverse->nodeStack;
235 nodeStack->stack = (union Data*)traverse->nodeStack;
230 nodeStack->next = RotateL1; 236 nodeStack->next = RotateL1;
231 goto meta(context, nodeStack->get); 237 goto meta(context, nodeStack->get);
232 } 238 }
233 239
234 __code rotateLeft_stub(struct Context* context) { 240 __code rotateLeft_stub(struct Context* context) {