annotate src/parallel_execution/RedBlackTreeReWright.cbc @ 495:2e7ea81e5943

Work BoundedBuffer if singlethread
author Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
date Sun, 31 Dec 2017 04:36:20 +0900
parents ac244346c85d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
1 #include <stdio.h>
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
2
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
3 #include "../context.h"
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
4 #include "../compare.c"
468
ac244346c85d Change used interface syntax from #include to #interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 463
diff changeset
5 #interface "Tree.h"
ac244346c85d Change used interface syntax from #include to #interface
Tatsuki IHA <innparusu@cr.ie.u-ryukyu.ac.jp>
parents: 463
diff changeset
6 #interface "Stack.h"
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
7
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
8 extern enum Relational compare(struct Node* node1, struct Node* node2);
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
9
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
10
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
11 Tree* createRedBlackTree(struct Context* context) {
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
12 struct Tree* tree = new Tree();
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
13 struct RedBlackTree* rbtree = new RedBlackTree();
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
14
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
15 tree->tree = (union Data*)rbtree;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
16 rbtree->root = NULL;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
17 rbtree->nodeStack = (union Data*)createSingleLinkedStack(context);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
18 tree->put = C_putRedBlackTree;
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
19 // tree->get = C_getRedBlackTree;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
20 // tree->remove = C_removeRedBlackTree;
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
21 // tree->clear = C_clearRedBlackTree;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
22 return tree;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
23 }
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
24
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
25 void printNode(struct Node* node) {
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
26 if (node == NULL) {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
27 printf("leaf");
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
28 } else {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
29 printf("((%d,%d (",node->color, node->key);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
30 printNode(node->right);
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
31 printf(") (");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
32 printNode(node->left);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
33 printf(")");
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
34 }
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
35 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
36
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
37 void printTree(struct RedBlackTree* tree) {
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
38 printf("\n");
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
39 tree->current = tree->root;
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
40 printNode(tree->current);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
41 printf(")\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
42 }
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
43
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
44 __code putRedBlackTree(struct RedBlackTree* tree, struct Node* node, __code next(...)) {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
45 printf("C_putRedBlackTree\n");
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
46 printf("value->%d,key->%d \n",node->value,node->key);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
47 tree->previous = tree->newNode;
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
48 tree->newNode = node;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
49 tree->newNode->color = Red;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
50 tree->current = tree->root;
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
51 goto insertRBTree(node, tree);
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
52 }
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
53
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
54 __code stackClear(struct RedBlackTree* tree, struct Stack* nodeStack, __code next(...)) {
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
55 tree->current = 0;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
56 nodeStack->stack = tree->nodeStack;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
57 nodeStack->next = next;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
58 goto meta(context, tree->nodeStack->clear);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
59 }
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
60
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
61 __code getRedBlackTree(struct RedBlackTree* tree, __code next(...)) {
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
62 if (tree->root) {
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
63 tree->current = tree->root;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
64 goto insertRBTree();
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
65 // goto deleteRBTree();
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
66 }
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
67 goto next(...);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
68 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
69
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
70 __code insertRBTree(struct Node* node, struct RedBlackTree* tree, struct Stack* stack, __code next(...)) {
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
71 // first case tree->current = root;
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
72 printf("C_insertRBTree\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
73 printf("value->%d,key->%d\n",node->value,node->key);
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
74 printf("newNode value->%d,newNode key->%d\n",tree->newNode->value,tree->newNode->key);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
75
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
76 if (tree->root == NULL) {
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
77 printf("insertRBTree_root eq NULL\n");
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
78 tree->root = tree->newNode;
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
79 tree->root->color = Black;
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
80 printf("tree->root->key = %d, tree->root->color = %d \n",tree->root->key,tree->root->color);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
81 printTree(tree);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
82 goto next(tree,...);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
83 } else {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
84 goto searchInsertLocation(node, tree, stack);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
85 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
86 }
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
87
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
88 __code insertRBTree_stub(struct Context* context) {
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
89 Node* node = Gearef(context, Tree)->node;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
90 RedBlackTree* tree = (RedBlackTree*)GearImpl(context, Tree, tree);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
91 Stack* stack = createSingleLinkedStack(context);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
92 enum Code next = Gearef(context, Tree)->next;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
93 goto insertRBTree(context, node, tree, stack, next);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
94 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
95
455
a44dbeb08895 Fix nodeStack
innparusu
parents: 454
diff changeset
96 __code searchInsertLocation(struct Node* node, struct RedBlackTree* tree) {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
97 // first case tree->current = root; PreCase remove root=NULL case.don't exist firstCase tree->current=NULL
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
98 printf("C_searchInsertLocation\n");
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
99 printf("nownode->key %d , previous->key %d \n",tree->newNode->key,tree->previous->key);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
100
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
101 tree->result = compare(tree->current, node);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
102 printf("tree->current->key = %d, node->key %d\n",tree->current->key,node->key);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
103 printf("compare (%d,%d)\n",tree->current,node);
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
104
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
105 Stack* stack = tree->nodeStack;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
106
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
107 if (tree->current == NULL) {
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
108 printf("goto insertLocationBackInsert stack->pop\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
109 goto stack->pop(insertLocationBackInsert);
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
110 }
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
111 if (tree->result == GT) {
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
112 printf("GT searchInsertLocation\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
113 tree->current = tree->current->right;
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
114 goto stack->push(tree->newNode,insertLocationBackInsert);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
115 } else if (tree->result == LT) {
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
116 printf("LT searchInsertLocation\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
117 tree->current = tree->current->left;
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
118 goto stack->push(tree->newNode, searchInsertLocation);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
119 } else if (tree->result == EQ) {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
120 printf("already member this node : __code searchInsertLocation()\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
121 goto meta(context, C_exit_code);
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
122 } else {
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
123 printf("$insert value tree : __code searchInsertLocation() \n");
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
124 goto meta(context, C_exit_code);
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
125 }
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
126 }
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
127
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
128 __code searchInsertLocation_stub(struct Context* context) {
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
129 Node* node = Gearef(context, Tree)->node;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
130 RedBlackTree* tree = (RedBlackTree*)GearImpl(context, Tree, tree);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
131 Stack* stack = (struct Stack*)Gearef(context, Stack)->stack;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
132 goto searchInsertLocation(context, node, tree);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
133 }
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
134
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
135 __code insertLocationBackInsert(struct RedBlackTree* tree, struct Node* node, struct Stack* stack) {
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
136 printf("C_insertLocationBackInsert\n");
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
137 struct Node* hoge = stack->data;
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
138 printf("stackpopdata%d\n",stack->data);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
139 tree->current = tree->previous;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
140 // tree->current = nodeStack->data;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
141 // this CS is ones only backTrace, and insert node
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
142 tree->result = compare(tree->previous,tree->newNode);
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
143 printf("back,compare\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
144 if (tree->result == GT) {
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
145 printf("GT\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
146 tree->current->right = tree->newNode;
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
147 printTree(tree);
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
148 goto insertBalance(tree, stack, node, next);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
149 } else if (tree->result == LT) {
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
150 printf("LT\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
151 tree->current->left = tree->newNode;
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
152 goto insertBalance(tree, stack, node, next);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
153 } else {
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
154 printf("error : __code insertLocationBackTrace() \n");
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
155 goto meta(context, C_exit_code);
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
156 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
157 }
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
158
460
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
159 __code insertLocationBackInsert_stub(struct Context* context) {
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
160 RedBlackTree* tree = (RedBlackTree*)GearImpl(context, Tree, tree);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
161 SingleLinkedStack* singleLinkedStack = (SingleLinkedStack*)GearImpl(context, Stack, stack);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
162 Node* node = Gearef(context, Tree)->node;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
163 Stack* stack = (struct Stack*)Gearef(context, Stack)->stack;
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
164 goto insertLocationBackInsert(context, tree, node, stack);
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
165 }
5fd0502a6c35 Split RedBlackTree.cbc RedBlackTreeReWrite.cbc
ryokka
parents: 455
diff changeset
166
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
167 __code insertBalance(struct RedBlackTree* tree, struct Node* nodeStack, struct Node* node, __code next(...)) {
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
168 printf("C_insertBalance\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
169 struct Node* traceNode = tree->nodeStack->data;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
170 tree->current = traceNode;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
171 struct Stack* stack = tree->nodeStack;
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
172
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
173 // exit insertion code
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
174 if (tree->current == tree->root) {
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
175 tree->current->color = Black;
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
176 printTree(tree);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
177 //printTree
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
178 goto next(tree,...);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
179 }
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
180
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
181
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
182 //current color eq Red
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
183 if (tree->current->color == Red)
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
184 goto stack->pop(insertBalance);
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
185
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
186 // current color eq Black
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
187 if (tree->current->left->left || tree->current->left->right) {
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
188 goto insertBalanceLeft(tree,nodeStack);
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
189 } else if (tree->current->right->left || tree->current->right->right) {
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
190 goto insertBalanceRight(tree,nodeStack);
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
191 } else {
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
192 goto stack->pop(insertBalance);
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
193 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
194 }
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
195
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
196 __code insertBalanceLeft(struct RedBlackTree* tree, struct Node* nodeStack, struct Node* node) {
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
197 printf("C_insertBalanceLeft\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
198 struct Stack* stack = tree->nodeStack;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
199
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
200 if (tree->current->color == Black && tree->current->left->color == Red && tree->current->left->left->color == Red) {
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
201 struct Node* tmpCurrent = tree->current;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
202 struct Node* tmpLeft = tree->current->left;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
203 struct Node* tmpLeftLeft = tree->current->left->left;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
204
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
205 tree->current = tmpLeft;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
206 tree->current->right = tmpCurrent;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
207 tree->current->left = tmpLeftLeft;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
208 tree->current->right->left = tmpLeft->right;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
209 tree->current->color = Red;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
210 tree->current->left->color = Black;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
211 tree->current->right->color = Black;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
212 goto stack->pop(insertBalance);
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
213
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
214 } else if(tree->current->color == Black && tree->current->left->color == Red && tree->current->left->right->color == Red) {
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
215 struct Node* tmpCurrent = tree->current;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
216 struct Node* tmpLeft = tree->current->left;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
217 struct Node* tmpLeftRight = tree->current->left->right;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
218
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
219 tree->current = tmpLeft;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
220 tree->current->right = tmpCurrent;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
221 tree->current->left = tmpLeftRight;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
222 tree->current->right->left = tmpLeft->left;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
223 tree->current->color = Red;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
224 tree->current->left->color = Black;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
225 tree->current->right->color = Black;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
226 goto stack->pop(insertBalance);
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
227
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
228 }
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
229 }
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
230
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
231 __code insertBalanceRight(struct RedBlackTree* tree, struct Node* nodeStack, struct Node* node) {
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
232 printf("C_insertBalanceLeft\n");
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
233 struct Stack* stack = tree->nodeStack;
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
234
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
235 if (tree->current->color == Black && tree->current->right->color == Red && tree->current->right->right->color == Red) {
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
236 struct Node* tmpCurrent = tree->current;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
237 struct Node* tmpRight = tree->current->right;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
238 struct Node* tmpRightRight = tree->current->right->right;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
239
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
240 tree->current = tmpRight;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
241 tree->current->left = tmpCurrent;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
242 tree->current->right = tmpRightRight;
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
243 tree->current->left->right = tmpRight->left;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
244 tree->current->color = Red;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
245 tree->current->left->color = Black;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
246 tree->current->right->color = Black;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
247 goto stack->pop(insertBalance);
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
248
454
77de0283ac92 Debug RedBlackTree.cbc.
ryokka
parents: 452
diff changeset
249 } else if (tree->current->color == Black && tree->current->right->color == Red && tree->current->right->left->color == Red) {
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
250
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
251 struct Node* tmpCurrent = tree->current;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
252 struct Node* tmpRight = tree->current->right;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
253 struct Node* tmpRightLeft = tree->current->right->left;
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
254
446
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
255 tree->current = tmpRight;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
256 tree->current->right = tmpCurrent;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
257 tree->current->left = tmpRightLeft;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
258 tree->current->left->right = tmpRight->right;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
259 tree->current->color = Red;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
260 tree->current->left->color = Black;
41a6f8482374 fix RedBlackTree.cbc Insert, printTree. but occur error
ryokka
parents: 445
diff changeset
261 tree->current->right->color = Black;
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
262 goto stack->pop(insertBalance);
273
08d0f920dad2 add RedBlackTree.cbc
mir3636
parents:
diff changeset
263
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
264 } else {
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
265 printf("unkwon error : __code insertBalanceRight() \n");
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
266 goto meta(context, C_exit_code);
445
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
267 }
f02bd096af64 fix RedBlackTree.cbc Insertion
ryokka
parents: 426
diff changeset
268 }
452
1432d924c472 fix RedBlackTree.cbc Insert, debug now
ryokka
parents: 446
diff changeset
269 // insertCode end