comparison src/parallel_execution/rb_tree.c @ 133:933c80f48d06

node stack rewrite
author ikkun
date Wed, 28 Sep 2016 19:02:25 +0900
parents 73a679a85c04
children 36ac17d37be4
comparison
equal deleted inserted replaced
132:73a679a85c04 133:933c80f48d06
215 __code insertCase4_2(struct Context* context, struct Traverse* traverse) { 215 __code insertCase4_2(struct Context* context, struct Traverse* traverse) {
216 traverse->current = traverse->current->right; 216 traverse->current = traverse->current->right;
217 goto meta(context, InsertCase5); 217 goto meta(context, InsertCase5);
218 } 218 }
219 219
220 __code insert4_2_stub(struct Context* context) { 220 __code insert4_2_stub(struct Context* context) {
221 struct Allocate* allocate = &context->data[Allocate]->allocate; 221 struct Allocate* allocate = &context->data[Allocate]->allocate;
222 allocate->size = sizeof(struct Element); 222 allocate->size = sizeof(struct Element);
223 allocator(context); 223 allocator(context);
224 struct Element* element = &context->data[context->dataNum]->node; 224 struct Element* element = &context->data[context->dataNum]->node;
225 element->data = (struct Data*)traverse->current; 225 element->data = (struct Data*)traverse->current;
247 } 247 }
248 248
249 // put rotateLeft's continuation as argument 249 // put rotateLeft's continuation as argument
250 __code rotateLeft(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent) { 250 __code rotateLeft(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent) {
251 struct Node* tmp = node->right; 251 struct Node* tmp = node->right;
252 struct Node* parent = 0;
253
254 // if you have a pararent as an argument , we don't need stack operation
255 stack_pop(context->node_stack, &parent);
256 252
257 if (parent) { 253 if (parent) {
258 if (node == parent->left) 254 if (node == parent->left)
259 parent->left = tmp; 255 parent->left = tmp;
260 else 256 else
261 parent->right = tmp; 257 parent->right = tmp;
262 } else { 258 } else {
263 tree->root = tmp; 259 tree->root = tmp;
264 } 260 }
265 261 element->data = (struct Data*)parent;
266 stack_push(context->node_stack, &parent); 262
267
268 node->right = tmp->left; 263 node->right = tmp->left;
269 tmp->left = node; 264 tmp->left = node;
270 traverse->current = tmp; 265 traverse->current = tmp;
271 266
272 goto meta(context, traverse->rotateNext); 267 goto meta(context, traverse->rotateNext);
273 } 268 }
274 269
275 __code rotateLeft_stub(struct Context* context) { 270 __code rotateLeft_stub(struct Context* context) {
271 struct Traverse* traverse = context->data[Traverse]->traverse;
272 struct Node* parent = (traverse->nodeStack)?(struct Node*)traverse->nodeStack->data:NULL;
273 traverse->nodeStack = traverse->nodeStack->next;
274 struct Allocate* allocate = &context->data[Allocate]->allocate;
275 allocate->size = sizeof(struct Element);
276 allocator(context);
277 struct Element* element = &context->data[context->dataNum]->node;
276 goto rotateLeft(context, 278 goto rotateLeft(context,
277 context->data[Traverse]->traverse.current, 279 context->data[Traverse]->traverse.current,
278 &context->data[Tree]->tree, 280 &context->data[Tree]->tree,
279 &context->data[Traverse]->traverse); 281 &context->data[Traverse]->traverse);
280 } 282 }
281 283
282 __code rotateRight(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse) { 284 __code rotateRight(struct Context* context, struct Node* node, struct Tree* tree, struct Traverse* traverse, struct Node* parent, struct Node* element) {
283 struct Node* tmp = node->left; 285 struct Node* tmp = node->left;
284 struct Node* parent = 0; 286
285
286 stack_pop(context->node_stack, &parent);
287
288 if (parent) { 287 if (parent) {
289 if (node == parent->left) 288 if (node == parent->left)
290 parent->left = tmp; 289 parent->left = tmp;
291 else 290 else
292 parent->right = tmp; 291 parent->right = tmp;
293 } else { 292 } else {
294 tree->root = tmp; 293 tree->root = tmp;
295 } 294 }
296 295
297 stack_push(context->node_stack, &parent); 296 element->data = (struct Data*)parent;
298 297
299 node->left = tmp->right; 298 node->left = tmp->right;
300 tmp->right = node; 299 tmp->right = node;
301 traverse->current = tmp; 300 traverse->current = tmp;
302 301
303 goto meta(context, traverse->rotateNext); 302 goto meta(context, traverse->rotateNext);
304 } 303 }
305 304
306 __code rotateRight_stub(struct Context* context) { 305 __code rotateRight_stub(struct Context* context) {
306 struct Allocate* allocate = &context->data[Allocate]->allocate;
307 allocate->size = sizeof(struct Element);
308 allocator(context);
309 struct Element* element = &context->data[context->dataNum]->node;
307 goto rotateRight(context, 310 goto rotateRight(context,
308 context->data[Traverse]->traverse.current, 311 context->data[Traverse]->traverse.current,
309 &context->data[Tree]->tree, 312 &context->data[Tree]->tree,
310 &context->data[Traverse]->traverse); 313 &context->data[Traverse]->traverse);
311 } 314 }
312 315
313 __code stackClear(struct Context* context, stack_ptr node_stack, struct Traverse* traverse) { 316 __code stackClear(struct Context* context, stack_ptr node_stack, struct Traverse* traverse) {
314 if (stack_pop(node_stack, &traverse->current) == 0)
315 goto meta(context, StackClear);
316
317 traverse->current = 0; 317 traverse->current = 0;
318 318
319 goto meta(context, context->next); 319 goto meta(context, context->next);
320 } 320 }
321 321