# HG changeset patch # User matac42 # Date 1706162467 -32400 # Node ID 88ece4cac6204be412efe35e72fba5c885eec151 # Parent 24390402f72dc9ec940e536e7be22ce691b1f4fa rm init push & unnecessary stack diff -r 24390402f72d -r 88ece4cac620 src/parallel_execution/RedBlackTree.cbc --- a/src/parallel_execution/RedBlackTree.cbc Wed Jan 24 18:50:52 2024 +0900 +++ b/src/parallel_execution/RedBlackTree.cbc Thu Jan 25 15:01:07 2024 +0900 @@ -94,30 +94,30 @@ __code copyRedBlackTree(struct RedBlackTree* tree) { tree->current = tree->root; - struct Stack* nodeStack = tree->nodeStack; - struct Node* oldNode = tree->current; - struct Node* newNode = tree->newNode; - tree->previous = newNode; - newNode = oldNode; - goto nodeStack->push((union Data*)newNode, leftDown); + goto leftDown(tree); } -__code leftDown(struct RedBlackTree* tree, struct Stack* outputStack) { +// +// leftDown*() +// currentをinputStackにpushして、current->leftがあれば降りる +// + +__code leftDown(struct RedBlackTree* tree) { struct Node* newNode = &ALLOCATE(context, Node)->Node; newNode->key = tree->current->key; - // newNode->value = tree->current->value; 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"); - + // 新規ノードをpushしている goto inputStack->push(newNode, leftDown1); } -__code leftDown1(struct RedBlackTree* tree, struct Stack* outputStack) { +__code leftDown1(struct RedBlackTree* tree) { struct Stack* nodeStack = tree->nodeStack; struct Node* oldNode = tree->current; tree->current = tree->current->left; @@ -126,21 +126,19 @@ goto nodeStack->push((union Data*)oldNode, leftDown2); } -__code leftDown2(struct RedBlackTree* tree, struct Stack* outputStack) { +__code leftDown2(struct RedBlackTree* tree) { struct Stack* inputStack = tree->inputStack; printf("leftDown2\n"); if (tree->current->left) { - // ここではnodeStackを積みたいが...... - // leftDown2を作るか - goto leftDown(tree->current->left, inputStack, outputStack); + goto leftDown(tree->current->left, inputStack); } else if (tree->current->right) { - goto rightDown(tree->current->right, inputStack, outputStack); + goto rightDown(tree->current->right, inputStack); } else { goto inputStack->pop(up); } } -__code rightDown(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) { +__code rightDown(struct RedBlackTree* tree, struct Stack* inputStack) { struct Node* newNode = &ALLOCATE(context, Node)->Node; newNode->key = tree->current->key; newNode->value = (union Data*)new Integer(); @@ -153,7 +151,7 @@ goto nodeStack->push(newNode, leftDown); } -__code up(struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) { +__code up(struct RedBlackTree* tree, struct Stack* inputStack) { struct Stack* nodeStack = tree->nodeStack; struct Node* newNode = tree->newNode; // inputStack->data見てるのは間違い @@ -172,19 +170,19 @@ } // upするときにstackの情報を元にcurrentを付け替えないといけないのでは? -__code up1(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) { +__code up1(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack) { struct Stack* nodeStack = tree->nodeStack; printf("up1\n"); goto nodeStack->pop(up2); } -__code up2(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) { +__code up2(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack) { printf("up2\n"); tree->current->right = node->right; - goto up(tree, inputStack, outputStack); + goto up(tree, inputStack); } -__code popWhenEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack, __code next(...)) { +__code popWhenEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, __code next(...)) { // treeの入れ替え // struct Tree* newTree = new Tree(); struct RedBlackTree* newRedBlackTree = new RedBlackTree(); @@ -197,7 +195,7 @@ goto next(...); } -__code popWhenNoEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack, struct Stack* outputStack) { +__code popWhenNoEmpty(struct Node* node, struct RedBlackTree* tree, struct Stack* inputStack) { struct Stack* nodeStack = tree->nodeStack; printf("popWhenNoEmpty\n"); goto nodeStack->pop(up1);