comparison src/parallel_execution/rb_tree.c @ 121:f708b271a7b8

node stack rewrite
author ikkun
date Tue, 27 Sep 2016 17:48:17 +0900
parents 2493f4226ca6
children 73a679a85c04
comparison
equal deleted inserted replaced
120:2493f4226ca6 121:f708b271a7b8
6 extern void allocator(struct Context* context); 6 extern void allocator(struct Context* context);
7 extern void compare(struct Context* context, struct Traverse* traverse, int key1, int key2); 7 extern void compare(struct Context* context, struct Traverse* traverse, int key1, int key2);
8 8
9 extern int num; 9 extern int num;
10 10
11 __code put(struct Context* context, struct Tree* tree, struct Traverse* traverse, struct Node* root, struct Allocate* allocate) { 11 __code put(struct Context* context, struct Tree* tree, struct Traverse* traverse, struct Node* root, struct Node* node) {
12 // tree->root=allocator(context,struct Node);
13 allocate->size = sizeof(struct Node);
14 allocator(context);
15
16 // we don't need this push
17 stack_push(context->code_stack, &context->next);
18
19 tree->root = &context->data[context->dataNum]->node;
20
21 if (root) { 12 if (root) {
22 traverse->current = root; 13 traverse->current = root;
23 // traverse->result=compare(...) 14 // traverse->result=compare(...)
24 compare(context, traverse, traverse->current->key, context->data[Node]->node.key); 15 compare(context, traverse, traverse->current->key, node->key);
25 16 // goto replaceNode(traverse->current, newNode, traverse->result);
26 goto meta(context, Replace); 17 goto meta(context, Replace);
27 } 18 }
28 19
29 goto meta(context, Insert); 20 goto meta(context, Insert);
30 } 21 }
31 22
32 __code put_stub(struct Context* context) { 23 __code put_stub(struct Context* context) {
24 struct Allocate* allocate = &context->data[Allocate]->allocate;
25 allocate->size = sizeof(struct Node);
26 allocator(context);
27
28 context->data[Tree]->tree->root = &context->data[context->dataNum]->node;
29
33 goto put(context, 30 goto put(context,
34 &context->data[Tree]->tree, 31 &context->data[Tree]->tree,
35 &context->data[Traverse]->traverse, 32 &context->data[Traverse]->traverse,
36 context->data[Tree]->tree.root, 33 context->data[Tree]->tree.root,
37 &context->data[Allocate]->allocate); 34 &context->data[Node]->node);
38 } 35 }
39 36
40 __code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, int result) { 37 __code replaceNode(struct Context* context, struct Traverse* traverse, struct Node* oldNode, struct Node* newNode, struct Element* element) {
41 *newNode = *oldNode; 38 *newNode = *oldNode;
42 stack_push(context->node_stack, &newNode); 39 element->next = traverse->stack;
43 40 element->data = (struct Data* )newNode;
41 traverse->stack = element;
42 goto meta(context, Replace1);
43 }
44
45 __code replaceNode_stub(struct Context* context) {
46 struct Allocate* allocate = &context->data[Allocate]->allocate;
47 allocate->size = sizeof(struct Node);
48 allocator(context);
49 struct Node* newNode = &context->data[context->dataNum]->node;
50
51 allocate->size = sizeof(struct Element);
52 allocator(context);
53 struct Element* element = &context->data[context->dataNum]->node;
54 goto replaceNode(context,
55 &context->data[Traverse]->traverse,
56 context->data[Traverse]->traverse.current,
57 newNode,
58 element);
59 }
60
61 __code replaceNode1(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, struct Node* newnewNode, int result) {
44 if (result == EQ) { 62 if (result == EQ) {
45 newNode->value = context->data[Node]->node.value; 63 newNode->value = node->value;
46
47 // go to stack clear 64 // go to stack clear
48 stack_pop(context->code_stack, &context->next);
49 goto meta(context, context->next); 65 goto meta(context, context->next);
50 } else if (result == GT) { 66 } else if (result == GT) {
51 traverse->current = oldNode->right; 67 traverse->current = oldNode->right;
52 newNode->right = context->heap; // allocator(context,struct Node) 68 newNode->right = newnewNode;
53 } else { 69 } else {
54 traverse->current = oldNode->left; 70 traverse->current = oldNode->left;
55 newNode->left = context->heap; 71 newNode->left = newnewNode;
56 } 72 }
57 73
74 if (traverse->current) {
75 compare(context, traverse, traverse->current->key, node->key);
76 goto meta(context, Replace);
77 }
78
79 goto meta(context, Insert);
80
81 }
82
83 __code replaceNode1_stub(struct Context* context) {
84 struct Allocate* allocate = &context->data[Allocate]->allocate;
85 allocate->size = sizeof(struct Node);
58 allocator(context); 86 allocator(context);
59 87 struct Node* newnewNode = &context->data[context->dataNum]->node;
60 if (traverse->current) { 88 goto replaceNode1(context,
61 compare(context, traverse, traverse->current->key, context->data[Node]->node.key);
62 goto meta(context, Replace);
63 }
64
65 goto meta(context, Insert);
66 }
67
68 __code replaceNode_stub(struct Context* context) {
69 goto replaceNode(context,
70 &context->data[Traverse]->traverse, 89 &context->data[Traverse]->traverse,
90 context->data[Node]->node,
71 context->data[Traverse]->traverse.current, 91 context->data[Traverse]->traverse.current,
72 &context->data[context->dataNum]->node, // new Node 92 (struct Node*)context->data[traverse]->traverse->stack->data,
73 context->data[Traverse]->traverse.result); 93 context->data[Traverse]->traverse.result);
74 } 94 }
75 95
76 __code insertNode(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* newNode) { 96 __code insertNode(struct Context* context, struct Traverse* traverse, struct Node* node, struct Node* newNode) {
77 node->color = Red; 97 node->color = Red;