Mercurial > hg > Gears > GearsAgda
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; |