Mercurial > hg > GearsTemplate
changeset 273:08d0f920dad2
add RedBlackTree.cbc
author | mir3636 |
---|---|
date | Tue, 31 Jan 2017 17:19:01 +0900 |
parents | 68cf983475e7 |
children | d14eb393023d |
files | src/parallel_execution/RedBlackTree.cbc |
diffstat | 1 files changed, 727 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/parallel_execution/RedBlackTree.cbc Tue Jan 31 17:19:01 2017 +0900 @@ -0,0 +1,727 @@ +#include <stdio.h> + +#include "../context.h" +#include "../origin_cs.h" +#include "../stack.h" + +extern enum Relational compare(struct Node* node1, struct Node* node2); + +Tree* createRedBlackTree(struct Context* context) { + struct Tree* tree = new Tree(); + struct RedBlackTree* redBlackTree = new RedBlackTree(); + tree->tree = (union Data*)redBlackTree; + redBlackTree->root = NULL; + redBlackTree->nodeStack = &createSingleLinkedStack(context)->Stack; + tree->put = C_putRedBlackTree; + tree->get = C_getRedBlackTree; + // tree->remove = C_removeRedBlackTree; + // tree->clear = C_clearRedBlackTree; + return tree; +} + +void printTree1(union Data* data) { + struct Node* node = &data->Node; + if (node == NULL) { + printf("NULL"); + } else { + printf("key = %d (", node->key); + printTree1((union Data*)(node->right)); + printf("), ("); + printTree1((union Data*)(node->left)); + printf(")"); + } +} + +void printTree(union Data* data) { + printTree1(data); + printf("\n"); +} + +__code putRedBlackTree(struct RedBlackTree* traverse, struct Node* node, struct Node* root, struct Node* newNode) { + printTree((union Data*)(traverse->root)); + traverse->newNode = newNode; + traverse->root = newNode; // this should done at stackClear + traverse->parent = NULL; + if (root) { + traverse->current = root; + traverse->result = compare(traverse->current, node); + goto C_replaceNode(...); + } + + goto C_insertNode(...); +} + +__code putRedBlackTree_stub(struct Context* context) { + struct Node* newNode = &ALLOCATE(context, Node)->Node; + goto putRedBlackTree(context, + &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + Gearef(context, Tree)->node, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.root, + newNode + ); +} + +__code replaceNode(struct RedBlackTree* traverse, struct Node* oldNode, struct Node* newNode, struct Stack* nodeStack) { + traverse->previous = newNode; + *newNode = *oldNode; + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->data = (union Data*)(newNode); + nodeStack->next = C_replaceNode1; + goto meta(context, traverse->nodeStack->push); +} + +__code replaceNode_stub(struct Context* context) { + goto replaceNode(context, + &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.current, + //context->data[D_RedBlackTree]->RedBlackTree.newNode, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.newNode, + Gearef(context, Stack)); +} + +__code replaceNode1(struct RedBlackTree* traverse, struct Node* node, struct Node* oldNode, struct Node* newNode, struct Node* newnewNode, int result, __code next(...)) { + if (result == EQ) { + newNode->value = node->value; + // go to stack clear + goto meta(context, next); + } else if (result == GT) { + traverse->current = oldNode->right; + newNode->right = newnewNode; + } else { + traverse->current = oldNode->left; + newNode->left = newnewNode; + } + traverse->newNode = newnewNode; + if (traverse->current) { + traverse->result = compare(traverse->current, node); + goto C_replaceNode(...); + } + goto C_insertNode(...); + +} + +__code replaceNode1_stub(struct Context* context) { + struct Node* newnewNode = &ALLOCATE(context, Node)->Node; + goto replaceNode1(context, + &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + Gearef(context, Tree)->node, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.current, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.previous, + newnewNode, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.result, + Gearef(context, Tree)->next); +} + +__code insertNode(struct RedBlackTree* traverse, struct Stack *nodeStack, struct Node* node, struct Node* newNode) { + *newNode = *node; + newNode->color = Red; + traverse->current = newNode; + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_insertCase1; + goto meta(context, traverse->nodeStack->get2); +} + +__code insertNode_stub(struct Context* context) { + goto insertNode(context, + &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + Gearef(context, Stack), + Gearef(context, Tree)->node, + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.newNode); +} + +__code insertCase1(struct RedBlackTree* traverse, struct Node *parent, struct Node *grandparent) { + if (parent != NULL) { + traverse->parent = parent; + traverse->grandparent = grandparent; + goto C_insertCase2(...); + } + traverse->root->color = Black; + goto C_stackClear(...); +} + +__code insertCase1_stub(struct Context* context) { + goto insertCase1(context, + &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + &context->data[D_Stack]->Stack.data->Node, + &context->data[D_Stack]->Stack.data1->Node); +} + +__code insertCase2(struct RedBlackTree* traverse) { + if (traverse->parent->color == Black) { + goto C_stackClear(...); + } + goto C_insertCase3(...); +} + +__code insertCase2_stub(struct Context* context) { + goto insertCase2(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree); +} + +__code insertCase3(struct RedBlackTree* traverse, struct Stack* nodeStack) { + struct Node* uncle; + + if (traverse->grandparent->left == traverse->parent) + uncle = traverse->grandparent->right; + else + uncle = traverse->grandparent->left; + + if (uncle && (uncle->color == Red)) { + // do insertcase1 on grandparent, stack must be pop by two + traverse->parent->color = Black; + uncle->color = Black; + traverse->grandparent->color = Red; + traverse->current = traverse->grandparent; + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_insertCase1; + goto meta(context, traverse->nodeStack->pop2); + } + goto C_insertCase4(...); +} + +__code insertCase3_stub(struct Context* context) { + goto insertCase3(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + Gearef(context, Stack)); +} + +__code insertCase4(struct RedBlackTree* traverse, struct RotateTree* rotateTree) { + struct Stack* nodeStack = traverse->nodeStack; + + if ((traverse->current == traverse->parent->right) && (traverse->parent == traverse->grandparent->left)) { + traverse->current = traverse->current->left; + traverse->parent = traverse->grandparent; + + rotateTree->traverse = traverse; + rotateTree->next = C_insertCase5; + + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_rotateLeft; + goto meta(context, nodeStack->pop); + } else if ((traverse->current == traverse->parent->left) && (traverse->parent == traverse->grandparent->right)) { + traverse->parent = traverse->grandparent; + traverse->current = traverse->current->right; + + rotateTree->traverse = traverse; + rotateTree->next = C_insertCase5; + + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_rotateRight; + goto meta(context, nodeStack->pop); + } + + goto C_insertCase5(...); +} + +__code insertCase4_stub(struct Context* context) { + goto insertCase4(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, RotateTree)); +} + +__code insertCase5(struct RedBlackTree* traverse,struct Stack *nodeStack) { + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_insertCase51; + goto meta(context, traverse->nodeStack->pop2); +} + +__code insertCase5_stub(struct Context* context) { + goto insertCase5(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Stack)); +} + +__code insertCase51(struct RedBlackTree* traverse, struct RotateTree *rotateTree, struct Node* current, struct Node* parent, struct Node* grandparent) { + traverse->parent = parent; + traverse->grandparent = grandparent; + + parent->color = Black; + grandparent->color = Red; + + traverse->current = grandparent; + + rotateTree->traverse = traverse; + rotateTree->next = C_stackClear; + + if ((current == parent->left) && (parent == grandparent->left)) + goto C_rotateRight(...); + else + goto C_rotateLeft(...); +} + +__code insertCase51_stub(struct Context* context) { + struct Node* parent = &context->data[D_Stack]->Stack.data->Node; + struct Node* grandparent = &context->data[D_Stack]->Stack.data1->Node; + goto insertCase51(context, + &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, + Gearef(context, RotateTree), + Gearef(context, Tree)->tree->Tree.tree->RedBlackTree.current, + parent, + grandparent); +} + +__code rotateLeft(struct RedBlackTree* traverse,struct Stack* nodeStack) { + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_rotateLeft1; + goto meta(context, traverse->nodeStack->get); +} + +__code rotateLeft_stub(struct Context* context) { + struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; + goto rotateLeft(context, traverse, Gearef(context, Stack)); +} + +__code rotateLeft1(struct Node* node, struct RedBlackTree* traverse, struct Node *parent,struct RotateTree *rotateTree) { + struct Node* tmp = node->right; + + if (parent) { + if (node == parent->left) + parent->left = tmp; + else + parent->right = tmp; + } else { + traverse->root = tmp; + } + + node->right = tmp->left; + tmp->left = node; + traverse->current = tmp; + + goto meta(context, rotateTree->next); +} + +__code rotateLeft1_stub(struct Context* context) { + struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; + struct Node* parent = &context->data[D_Stack]->Stack.data->Node; + goto rotateLeft1(context, + traverse->current, + traverse, + parent, + Gearef(context, RotateTree)); +} + +__code rotateRight(struct RedBlackTree* traverse,struct Stack *nodeStack) { + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = C_rotateRight1; + goto meta(context, traverse->nodeStack->get); +} + +__code rotateRight_stub(struct Context* context) { + struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; + goto rotateLeft(context, traverse, Gearef(context, Stack)); +} + +__code rotateRight1(struct Node* node, struct RedBlackTree* traverse,struct Node *parent,struct RotateTree *rotateTree) { + struct Node* tmp = node->left; + + if (parent) { + if (node == parent->left) + parent->left = tmp; + else + parent->right = tmp; + } else { + traverse->root = tmp; + } + + node->left = tmp->right; + tmp->right = node; + traverse->current = tmp; + + goto meta(context, rotateTree->next); +} + +__code rotateRight1_stub(struct Context* context) { + struct RedBlackTree* traverse = context->data[D_RotateTree]->RotateTree.traverse; + struct Node* parent = &context->data[D_Stack]->Stack.data->Node; + goto rotateRight1(context, + traverse->current, + traverse, + parent, + Gearef(context, RotateTree)); +} + +__code stackClear(struct RedBlackTree* traverse,struct Stack *nodeStack, __code next(...)) { + traverse->current = 0; + nodeStack->stack = (union Data*)traverse->nodeStack; + nodeStack->next = next; + goto meta(context, traverse->nodeStack->clear); +} + +__code stackClear_stub(struct Context* context) { + goto stackClear(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Stack), + Gearef(context, Tree)->next); +} + + +__code getRedBlackTree(struct RedBlackTree* traverse, __code next(...)) { + if (traverse->root) { + traverse->current = traverse->root; + + goto C_search(...); + } + + goto next(...); +} + +__code getRedBlackTree_stub(struct Context* context) { + goto getRedBlackTree(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Tree)->next); +} + +__code search(struct RedBlackTree* traverse, struct Node* node, __code next(...)) { + // compare(context, traverse, traverse->current->key, node->key); + traverse->result = compare(traverse->current, node); + if (traverse->result == EQ) { + *node = *traverse->current; + + goto meta(context, next); + } else if (traverse->result == GT) { + traverse->current = traverse->current->right; + } else { + traverse->current = traverse->current->left; + } + + if (traverse->current) + goto C_search(...); + + goto next(...); +} + +__code search_stub(struct Context* context) { + goto search(context, &Gearef(context, Tree)->tree->Tree.tree->RedBlackTree, Gearef(context, Node), Gearef(context, Tree)->next); +} + +/* /\* __code delete(struct Context* context, struct Tree* tree) { *\/ */ +/* /\* if (tree->root) { *\/ */ +/* /\* stack_push(context->code_stack, &context->next); *\/ */ +/* /\* context->next = Delete1; *\/ */ +/* /\* goto meta(context, Get); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, context->next); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete_stub(struct Context* context) { *\/ */ +/* /\* goto delete(context, &context->data[Tree]->tree); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete1(struct Context* context, struct Tree* tree, struct Allocate* allocate) { *\/ */ +/* /\* allocate->size = sizeof(struct Node); *\/ */ +/* /\* allocator(context); *\/ */ + +/* /\* struct Node* root = tree->root; *\/ */ + +/* /\* tree->root = &context->data[context->dataNum]->node; *\/ */ +/* /\* tree->current = root; *\/ */ + +/* /\* compare(context, tree, tree->current->key, context->data[Node]->node.key); *\/ */ + +/* /\* goto meta(context, Replace_d1); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete1_stub(struct Context* context) { *\/ */ +/* /\* goto delete1(context, &context->data[Tree]->tree, &context->data[Allocate]->allocate); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete2(struct Context* context, struct Node* current) { *\/ */ +/* /\* if (current->color == Black) { *\/ */ +/* /\* struct Node* child = current->right == NULL ? current->left : current->right; *\/ */ +/* /\* current->color = child == NULL ? Black : child->color; *\/ */ + +/* /\* goto meta(context, DeleteCase1); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, Delete3); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete2_stub(struct Context* context) { *\/ */ +/* /\* goto delete2(context, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete3(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ +/* /\* struct Node* tmp = current->right == NULL ? current->left : current->right; *\/ */ + +/* /\* if (current->parent) { *\/ */ +/* /\* if (current == current->parent->left) *\/ */ +/* /\* current->parent->left = tmp; *\/ */ +/* /\* else *\/ */ +/* /\* current->parent->right = tmp; *\/ */ +/* /\* } else { *\/ */ +/* /\* tree->root = tmp; *\/ */ +/* /\* } *\/ */ + +/* /\* if (tmp) *\/ */ +/* /\* tmp->parent = current->parent; *\/ */ + +/* /\* if (current->parent == NULL && tmp) *\/ */ +/* /\* tmp->color = Black; *\/ */ + +/* /\* current == current->parent->left ? (current->parent->left = NULL) : (current->parent->right = NULL); *\/ */ + +/* /\* stack_pop(context->code_stack, &context->next); *\/ */ +/* /\* goto meta(context, context->next); *\/ */ +/* /\* } *\/ */ + +/* /\* __code delete3_stub(struct Context* context) { *\/ */ +/* /\* goto delete3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code replaceNodeForDelete1(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode, int result) { *\/ */ +/* /\* *newNode = *oldNode; *\/ */ + +/* /\* if (result == EQ) *\/ */ +/* /\* goto meta(context, Replace_d2); *\/ */ +/* /\* else if (result == GT) *\/ */ +/* /\* tree->current = newNode->right; *\/ */ +/* /\* else *\/ */ +/* /\* tree->current = newNode->left; *\/ */ + +/* /\* tree->current->parent = newNode; *\/ */ + +/* /\* if (tree->current->left == NULL && tree->current->right == NULL) *\/ */ +/* /\* goto meta(context, Delete2); *\/ */ + +/* /\* if (result == GT) *\/ */ +/* /\* newNode->right = context->heap; *\/ */ +/* /\* else if (result == LT) *\/ */ +/* /\* newNode->left = context->heap; *\/ */ + +/* /\* allocator(context); *\/ */ + +/* /\* compare(context, tree, tree->current->key, context->data[Node]->node.key); *\/ */ + +/* /\* goto meta(context, Replace_d1); *\/ */ +/* /\* } *\/ */ + +/* /\* __code replaceNodeForDelete1_stub(struct Context* context) { *\/ */ +/* /\* goto replaceNodeForDelete1(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node, context->data[Tree]->tree.result); *\/ */ +/* /\* } *\/ */ + +/* /\* __code replaceNodeForDelete2(struct Context* context, struct Tree* tree, struct Node* newNode) { *\/ */ +/* /\* if (tree->current->left && tree->current->right) { *\/ */ +/* /\* newNode->left->parent = newNode; *\/ */ +/* /\* tree->current = newNode->left; *\/ */ +/* /\* newNode->left = context->heap; *\/ */ +/* /\* tree->deleted = newNode; *\/ */ + +/* /\* allocator(context); *\/ */ +/* /\* tree->current->parent = newNode; *\/ */ + +/* /\* goto meta(context, FindMax1); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, Delete2); *\/ */ +/* /\* } *\/ */ + +/* /\* __code replaceNodeForDelete2_stub(struct Context* context) { *\/ */ +/* /\* goto replaceNodeForDelete2(context, &context->data[Tree]->tree, &context->data[context->dataNum]->node); *\/ */ +/* /\* } *\/ */ + +/* /\* __code findMax1(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode) { *\/ */ +/* /\* *newNode = *oldNode; *\/ */ + +/* /\* if (newNode->right) *\/ */ +/* /\* goto meta(context, FindMax2); *\/ */ + +/* /\* tree->deleted->key = newNode->key; *\/ */ +/* /\* tree->deleted->value = newNode->value; *\/ */ + +/* /\* tree->current = newNode; *\/ */ + +/* /\* goto meta(context, Delete2); *\/ */ +/* /\* } *\/ */ + +/* /\* __code findMax1_stub(struct Context* context) { *\/ */ +/* /\* goto findMax1(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node); *\/ */ +/* /\* } *\/ */ + + +/* /\* __code findMax2(struct Context* context, struct Tree* tree, struct Node* oldNode, struct Node* newNode) { *\/ */ +/* /\* *newNode = *oldNode; *\/ */ + +/* /\* if (newNode->right->right) { *\/ */ +/* /\* tree->current = newNode->right; *\/ */ +/* /\* newNode->right = context->heap; *\/ */ + +/* /\* allocator(context); *\/ */ +/* /\* tree->current->parent = newNode; *\/ */ + +/* /\* goto meta(context, FindMax2); *\/ */ +/* /\* } *\/ */ + +/* /\* tree->deleted->key = newNode->right->key; *\/ */ +/* /\* tree->deleted->value = newNode->right->value; *\/ */ + +/* /\* tree->current = newNode; *\/ */ + +/* /\* goto meta(context, Delete2); *\/ */ +/* /\* } *\/ */ + +/* /\* __code findMax2_stub(struct Context* context) { *\/ */ +/* /\* goto findMax2(context, &context->data[Tree]->tree, context->data[Tree]->tree.current, &context->data[context->dataNum]->node); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase1(struct Context* context, struct Node* current) { *\/ */ +/* /\* if (current->parent) *\/ */ +/* /\* goto meta(context, DeleteCase2); *\/ */ + +/* /\* goto meta(context, Delete3); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase1_stub(struct Context* context) { *\/ */ +/* /\* goto deleteCase1(context, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase2(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ +/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ + +/* /\* if ((sibling == NULL ? Black : sibling->color) == Red) { *\/ */ +/* /\* current->parent->color = Red; *\/ */ +/* /\* sibling->color = Black; *\/ */ + +/* /\* current == current->parent->left ? (current->parent->left = context->heap) : (current->parent->right = context->heap); *\/ */ +/* /\* allocator(context); *\/ */ +/* /\* context->data[context->dataNum]->node = *sibling; *\/ */ + +/* /\* tree->current = current->parent; *\/ */ + +/* /\* context->next = DeleteCase3; *\/ */ +/* /\* stack_push(context->code_stack, &context->next); *\/ */ + +/* /\* if (current == current->parent->left) *\/ */ +/* /\* goto meta(context, RotateL); *\/ */ +/* /\* else *\/ */ +/* /\* goto meta(context, RotateR); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, DeleteCase3); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase2_stub(struct Context* context) { *\/ */ +/* /\* goto deleteCase2(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase3(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ +/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ + +/* /\* if (current->parent->color == Black && *\/ */ +/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ +/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ +/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ +/* /\* sibling->color = Red; *\/ */ + +/* /\* tree->current = current->parent; *\/ */ +/* /\* goto meta(context, DeleteCase1); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, DeleteCase4); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase3_stub(struct Context* context) { *\/ */ +/* /\* goto deleteCase3(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase4(struct Context* context, struct Node* current) { *\/ */ +/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ + +/* /\* if (current->parent->color == Red && *\/ */ +/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ +/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ +/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ +/* /\* sibling->color = Red; *\/ */ +/* /\* current->parent->color = Black; *\/ */ + +/* /\* goto meta(context, Delete3); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, DeleteCase5); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase4_stub(struct Context* context) { *\/ */ +/* /\* goto deleteCase4(context, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase5(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ +/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ +/* /\* sibling->parent = current->parent; *\/ */ + +/* /\* if (current == current->parent->left && *\/ */ +/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ +/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Red && *\/ */ +/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Black) { *\/ */ +/* /\* sibling->color = Red; *\/ */ +/* /\* sibling->left->color = Black; *\/ */ + +/* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ +/* /\* allocator(context); *\/ */ +/* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ +/* /\* *tmp = *sibling; *\/ */ +/* /\* tmp->parent = current; *\/ */ + +/* /\* tmp->left = context->heap; *\/ */ +/* /\* allocator(context); *\/ */ +/* /\* context->data[context->dataNum]->node = *sibling->left; *\/ */ +/* /\* context->data[context->dataNum]->node.parent = tmp; *\/ */ + +/* /\* tree->current = tmp; *\/ */ + +/* /\* context->next = DeleteCase6; *\/ */ +/* /\* stack_push(context->code_stack, &context->next); *\/ */ + +/* /\* goto meta(context, RotateR); *\/ */ +/* /\* } else if (current == current->parent->right && *\/ */ +/* /\* (sibling == NULL ? Black : sibling->color) == Black && *\/ */ +/* /\* (sibling->left == NULL ? Black : sibling->left->color) == Black && *\/ */ +/* /\* (sibling->right == NULL ? Black : sibling->right->color) == Red) { *\/ */ +/* /\* sibling->color = Red; *\/ */ +/* /\* sibling->right->color = Black; *\/ */ + +/* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ +/* /\* allocator(context); *\/ */ +/* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ +/* /\* *tmp = *sibling; *\/ */ +/* /\* tmp->parent = current; *\/ */ + +/* /\* tmp->right = context->heap; *\/ */ +/* /\* allocator(context); *\/ */ +/* /\* context->data[context->dataNum]->node = *sibling->right; *\/ */ +/* /\* context->data[context->dataNum]->node.parent = tmp; *\/ */ + +/* /\* tree->current = tmp; *\/ */ + +/* /\* context->next = DeleteCase6; *\/ */ +/* /\* stack_push(context->code_stack, &context->next); *\/ */ +/* /\* goto meta(context, RotateL); *\/ */ +/* /\* } *\/ */ + +/* /\* goto meta(context, DeleteCase6); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase5_stub(struct Context* context) { *\/ */ +/* /\* goto deleteCase5(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase6(struct Context* context, struct Tree* tree, struct Node* current) { *\/ */ +/* /\* struct Node* sibling = current == current->parent->left ? current->parent->right : current->parent->left; *\/ */ + +/* /\* sibling == sibling->parent->left ? (sibling->parent->left = context->heap) : (sibling->parent->right = context->heap); *\/ */ +/* /\* allocator(context); *\/ */ +/* /\* struct Node* tmp = &context->data[context->dataNum]->node; *\/ */ +/* /\* *tmp = *sibling; *\/ */ +/* /\* tmp->parent = current; *\/ */ + +/* /\* tmp->color = current->parent->color; *\/ */ +/* /\* current->parent->color = Black; *\/ */ + +/* /\* context->next = Delete3; *\/ */ +/* /\* stack_push(context->code_stack, &context->next); *\/ */ + +/* /\* if (current == current->parent->left) { *\/ */ +/* /\* tmp->right->color = Black; *\/ */ +/* /\* tree->current = current->parent; *\/ */ + +/* /\* goto meta(context, RotateL); *\/ */ +/* /\* } else { *\/ */ +/* /\* tmp->left->color = Black; *\/ */ +/* /\* tree->current = current->parent; *\/ */ + +/* /\* goto meta(context, RotateR); *\/ */ +/* /\* } *\/ */ +/* /\* } *\/ */ + +/* /\* __code deleteCase6_stub(struct Context* context) { *\/ */ +/* /\* goto deleteCase6(context, &context->data[Tree]->tree, context->data[Tree]->tree.current); *\/ */ +/* /\* } *\/ */