Expr* Expr::remove() { if (list) { if (next) next->prev = prev; else list->tail = prev; if (prev) prev->next = next; else list->head = next; list->length--; next = NULL; prev = NULL; list = NULL; } else { callReplaceChild(this, NULL); } if (parentSymbol) { remove_help(this, 'r'); } else { trace_remove(this, 'R'); } return this; }
void save_help_olc(HELP_OLC *data) { // first, remove our old helpfile from disc LIST *kwds = parse_keywords(data->old_keywords); char *primary = listGet(kwds, 0); if(primary && *primary) remove_help(primary); deleteListWith(kwds, free); // now, add our new one add_help(data->keywords, bufferString(data->info), data->user_groups, data->related, TRUE); }
Val* Tree<Key,Val>::remove(Key key) { Node<Key,Val>* node=root;//change *root but not root int find=0; Val* returnval=NULL; while (find==0) { if (!node) return NULL; if (*(node->lkey)==key) { find=1; returnval=node->lval; } else if ((node->rkey!=NULL)&&(*(node->rkey)==key)) { find=2; returnval=node->rval; }else { if (IsThreeNode(node)) { if (key<*(node->lkey)) node=node->left; else if (key>*(node->rkey)) node=node->right; else node=node->center; }else { if (key<*(node->lkey)) node=node->left; else node=node->center; } } } Val val=*returnval; bool a=remove_help(root,key,val); if (a) { Node<Key,Val>* n=root; root=root->left; n->left=NULL; delete n; } return returnval; }
void Expr::replace(Expr* new_ast) { if (new_ast->parentSymbol || new_ast->parentExpr) INT_FATAL(new_ast, "Argument is already in AST in Expr::replace"); if (new_ast->list) INT_FATAL(new_ast, "Argument is in a list in Expr::replace"); if (list) { new_ast->next = next; new_ast->prev = prev; new_ast->list = list; if (next) next->prev = new_ast; else list->tail = new_ast; if (prev) prev->next = new_ast; else list->head = new_ast; next = NULL; prev = NULL; list = NULL; } else { callReplaceChild(this, new_ast); } Symbol* myParentSymbol = parentSymbol; Expr* myParentExpr = parentExpr; remove_help(this, 'p'); insert_help(new_ast, myParentExpr, myParentSymbol); // Update the _this field in a FnSymbol if necessary. if (DefExpr* def = toDefExpr(this)) if (ArgSymbol* arg = toArgSymbol(def->sym)) if (FnSymbol* fn = toFnSymbol(myParentSymbol)) if (fn->_this == arg) fn->_this = toDefExpr(new_ast)->sym; }
static bool remove_help(Node<Key,Val>* node, Key &key, Val &val) { if (node->left!=NULL) //interior node { if (key<*(node->lkey)) //left { bool a=remove_help(node->left, key,val); if (a) //become 1-node at left { return fix_left(node); } } else if (key==*(node->lkey)) //lkey { Key* succ_key; Val* succ_val; bool b=inordersuccessor_and_delete(node->center, succ_key, succ_val); node->lkey=succ_key; node->lval=succ_val; if (b) //become 1-node at center { if (fixinorder(node->center)) { return fix_center(node); } } } //others situation:rkey,center,right at 3-node else if (node->rkey!=NULL) //3-node { if (key<*(node->rkey)) //center at 3-node { bool a=remove_help(node->center, key,val); if (a) //become 1-node at center { return fix_center(node); } } else if (key > *(node->rkey)) //right at 3-node { bool a=remove_help(node->right, key,val); if (a) //become 1-node at right { fix_right(node); return false; } } else //rkey of 3-node { Key* succ_key; Val* succ_val; bool b=inordersuccessor_and_delete(node->right, succ_key, succ_val); node->rkey=succ_key; node->rval=succ_val; if (b) { if (fixinorder(node->right)) { fix_right(node); return false; } } } } //2-node, must be center else { bool a=remove_help(node->center, key, val); if (a) { return fix_center(node); } } } //leaf node else { if (key==*(node->lkey)) //lkey of 2-node or 3-node { node->lkey=node->rkey; node->lval=node->rval; node->rkey=NULL; node->rval=NULL; node->right=NULL; return (node->lkey==NULL); } else if ((node->rkey!=NULL)&&(*(node->rkey)==key))//rkey of 3-node { node->rkey=NULL; node->rval=NULL; } } return false; }