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; }
// create a new node int Node_New(World *inWorld, NodeDef *def, int32 inID, Node** outNode) { if (inID < 0) { if (inID == -1) { // -1 means generate an id for the event HiddenWorld* hw = inWorld->hw; inID = hw->mHiddenID = (hw->mHiddenID - 8) | 0x80000000; } else { return kSCErr_ReservedNodeID; } } if (World_GetNode(inWorld, inID)) { return kSCErr_DuplicateNodeID; } Node* node = (Node*)World_Alloc(inWorld, def->mAllocSize); node->mWorld = inWorld; node->mDef = def; node->mParent = 0; node->mPrev = 0; node->mNext = 0; node->mIsGroup = false; node->mID = inID; node->mHash = Hash(inID); if (!World_AddNode(inWorld, node)) { World_Free(inWorld, node); return kSCErr_TooManyNodes; } inWorld->hw->mRecentID = inID; *outNode = node; return kSCErr_None; }
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; }