Mercurial > hg > Gears > Gears
changeset 1051:62e938b798ec
copy up1
author | matac42 <matac@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Thu, 25 Jan 2024 17:24:51 +0900 |
parents | 88ece4cac620 |
children | cbcdd05bd65c |
files | src/parallel_execution/RedBlackTree.cbc |
diffstat | 1 files changed, 43 insertions(+), 25 deletions(-) [+] |
line wrap: on
line diff
--- a/src/parallel_execution/RedBlackTree.cbc Thu Jan 25 15:01:07 2024 +0900 +++ b/src/parallel_execution/RedBlackTree.cbc Thu Jan 25 17:24:51 2024 +0900 @@ -103,20 +103,33 @@ // __code leftDown(struct RedBlackTree* tree) { + struct Stack* inputStack = tree->inputStack; + + printf("leftDown\n"); + + goto inputStack->get(leftDown0); +} + +__code leftDown0(struct Node* node, struct RedBlackTree* tree, struct Stack* stack) { + struct Stack* inputStack = tree->inputStack; struct Node* newNode = &ALLOCATE(context, Node)->Node; + struct Node* data = (Node*)(stack->data); newNode->key = tree->current->key; newNode->value = (union Data*)new Integer(); ((Integer*)newNode->value)->value = ((Integer*)tree->current->value)->value; newNode->color = tree->current->color; - newNode->right = tree->current->right; - struct Stack* inputStack = tree->inputStack; - printf("leftDown\n"); - + if(data) { + data->left = newNode; + } + + printf("leftDown0\n"); + // 新規ノードをpushしている goto inputStack->push(newNode, leftDown1); } +// 実際にDownする __code leftDown1(struct RedBlackTree* tree) { struct Stack* nodeStack = tree->nodeStack; struct Node* oldNode = tree->current; @@ -129,12 +142,13 @@ __code leftDown2(struct RedBlackTree* tree) { struct Stack* inputStack = tree->inputStack; printf("leftDown2\n"); - if (tree->current->left) { - goto leftDown(tree->current->left, inputStack); - } else if (tree->current->right) { - goto rightDown(tree->current->right, inputStack); - } else { + if (tree->current) { + goto leftDown(tree, inputStack); + } else if (tree->current == NULL) { goto inputStack->pop(up); + // このあとnodeStack->popが必要 + } else if (tree->current->left) { + goto rightDown(tree, inputStack); } } @@ -151,26 +165,30 @@ goto nodeStack->push(newNode, leftDown); } -__code up(struct RedBlackTree* tree, struct Stack* inputStack) { +// +// upしつつright見つつ +// NULLからのup +__code up(struct RedBlackTree* tree) { struct Stack* nodeStack = tree->nodeStack; - struct Node* newNode = tree->newNode; - // inputStack->data見てるのは間違い - struct Node* node = tree->current; + printf("up\n"); - // popでNULLだった場合どうなる? - if (node->left) { - tree->current = node->right; - node->left = newNode; - goto nodeStack->push((union Data*)node, rightDown); - } else { - node->right = newNode; - newNode = node; - goto nodeStack->isEmpty(popWhenNoEmpty, popWhenEmpty); - } + // current付け替えしたい + // getして付け替えてpopだな... + goto nodeStack->get(up0); } -// upするときにstackの情報を元にcurrentを付け替えないといけないのでは? -__code up1(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack) { +__code up0(struct RedBlackTree* tree, struct Stack* stack) { + struct Stack* nodeStack = tree->nodeStack; + struct Node* data = (Node*)(stack->data); + tree->current = data; + + printf("up0\n"); + + goto nodeStack->pop(up1); +} + +// rightを見てさらにupするか考える +__code up1(struct RedBlackTree* tree) { struct Stack* nodeStack = tree->nodeStack; printf("up1\n"); goto nodeStack->pop(up2);