コード例 #1
0
int Node_Delete (root_t* tree, tree_t* node)
{
    TREE_CHECK (tree);
    NODE_CHECK (node);

    if (node->left)
    {
        TEC (Node_Delete (tree, node->left), node->left);
    }

    if (node->right)
    {
        TEC (Node_Delete (tree, node->right), node->right);
    }

    if (node->parent->left == node) node->parent->left = NULL;
    if (node->parent->right == node) node->parent->right = NULL;

    Tree_Update_Sizes (tree, node->parent, -1);

    TEC (Node_Destruct (node), node);

    TREE_CHECK (tree);

    return TREE_OK;
}
コード例 #2
0
int Tree_Destruct (root_t* tree)
{
    TREE_CHECK (tree);

    if (tree->root->left)  TEC (Node_Delete (tree, tree->root->left),  tree);
    if (tree->root->right) TEC (Node_Delete (tree, tree->root->right), tree);

    ISERR (Node_Destruct (tree->root), tree);

    tree->size = Poison;

    free (tree);

    return TREE_OK;
}
コード例 #3
0
ファイル: SC_Group.cpp プロジェクト: 2mc/supercollider
void Group_DeleteAll(Group *inGroup)
{
	Node *child = inGroup->mHead;
	while (child) {
        Node *next = child->mNext;
        child->mPrev = child->mNext = 0;
        child->mParent = 0;
		Node_Delete(child);
		child = next;
	}
	inGroup->mHead = inGroup->mTail = 0;
}
コード例 #4
0
ファイル: SC_MiscCmds.cpp プロジェクト: 2mc/supercollider
SCErr meth_n_free(World *inWorld, int inSize, char *inData, ReplyAddress* /*inReply*/)
{
	sc_msg_iter msg(inSize, inData);

	while (msg.remain()) {
		Node *node = Msg_GetNode(inWorld, msg);
		if (!node) return kSCErr_NodeNotFound;

		Node_Delete(node);
	}

	return kSCErr_None;
}
コード例 #5
0
ファイル: SC_Group.cpp プロジェクト: 2mc/supercollider
void Group_DeepFreeGraphs(Group *inGroup)
{
	Node *child = inGroup->mHead;
	while (child) {
        Node *next = child->mNext;
		if (child->mIsGroup) {
			Group_DeepFreeGraphs((Group*)child);
		} else {
			Node_Remove(child);
			Node_Delete(child);
		}
		child = next;
	}
}
コード例 #6
0
ファイル: tree.cpp プロジェクト: StrausMG/learning
int Tree_Replace_Right (node* tree)
{
	int err_index;
	ASSERT_NODE_OK (tree);

	if (tree -> left) Tree_Delete (tree -> left);
	node* new_tree = tree -> right;
	node* tmp_tree = tree -> prev;

	if (tree == tree -> prev -> left )
	{ 
		Node_Delete (tree);
		Tree_Add_Left (tmp_tree, new_tree);
	}

	else
	{
		Node_Delete (tree);
		Tree_Add_Right (tmp_tree, new_tree);
	}

	ASSERT_NODE_OK (new_tree);
return HAPPY;
}
コード例 #7
0
ファイル: SC_Graph.cpp プロジェクト: DSastre/supercollider
void Graph_RemoveID(World* inWorld, Graph *inGraph)
{
	if (!World_RemoveNode(inWorld, &inGraph->mNode)) {
		int err = kSCErr_Failed; // shouldn't happen..
		throw err;
	}

	HiddenWorld* hw = inWorld->hw;
	int id = hw->mHiddenID = (hw->mHiddenID - 8) | 0x80000000;
	inGraph->mNode.mID = id;
	inGraph->mNode.mHash = Hash(id);
    if (!World_AddNode(inWorld, &inGraph->mNode)) {
		scprintf("mysterious failure in Graph_RemoveID\n");
		Node_Delete(&inGraph->mNode);
		// enums are uncatchable. must throw an int.
		int err = kSCErr_Failed; // shouldn't happen..
		throw err;
    }

	//inWorld->hw->mRecentID = id;
}
コード例 #8
0
ファイル: SC_Node.cpp プロジェクト: HuaxingXu/supercollider
void Node_Replace(Node* s, Node *replaceThisOne)
{
	//scprintf("->Node_Replace\n");
	Group *group = replaceThisOne->mParent;
	if (!group) return; // failed
	if (s->mID == 0) return;

	s->mParent = group;
	s->mPrev = replaceThisOne->mPrev;
	s->mNext = replaceThisOne->mNext;

	if (s->mPrev) s->mPrev->mNext = s;
	else group->mHead = s;

	if (s->mNext) s->mNext->mPrev = s;
	else group->mTail = s;

	replaceThisOne->mPrev = replaceThisOne->mNext = 0;
	replaceThisOne->mParent = 0;

	Node_Delete(replaceThisOne);
	//scprintf("<-Node_Replace\n");
}
コード例 #9
0
ファイル: SC_Node.cpp プロジェクト: HuaxingXu/supercollider
void Node_RemoveID(Node *inNode)
{
	if (inNode->mID == 0) return; // failed
  
  World* world = inNode->mWorld;
	if (!World_RemoveNode(world, inNode)) {
		int err = kSCErr_Failed; // shouldn't happen..
		throw err;
	}
  
	HiddenWorld* hw = world->hw;
	int id = hw->mHiddenID = (hw->mHiddenID - 8) | 0x80000000;
	inNode->mID = id;
	inNode->mHash = Hash(id);
  if (!World_AddNode(world, inNode)) {
		scprintf("mysterious failure in Node_RemoveID\n");
		Node_Delete(inNode);
		// enums are uncatchable. must throw an int.
		int err = kSCErr_Failed; // shouldn't happen..
		throw err;
  }
  
	//inWorld->hw->mRecentID = id;
}