void Leaf::SetParent(const boost::shared_ptr<Node> &newParent) { boost::shared_ptr<Node> oldParent = GetParent().lock(); boost::shared_ptr<Leaf> self = static_pointer_cast<Leaf>(GetSelf().lock()); if (oldParent.get() != 0) { // we have a parent, so update our state // here reference count should be > 1 (at least one in the // parent, and one in this routine) assert(self.use_count() > 1); if (newParent.get() == 0) { // time to clean up OnUnlink(); ClearCachedData(); oldParent->RemoveChildReference(self); } // we remove ourself from the old parent's list of children oldParent->RemoveChildReference(self); // we add ourself to the new parent's list of children if (newParent.get() != 0) { newParent->AddChildReference(self); } } mParent = newParent; if (newParent.get() == 0) { return; } // assure a unique name among our siblings boost::shared_ptr<Leaf> sibling = newParent->GetChild(mName); if (sibling != self) { stringstream ss; ss << mName << "_" << newParent->GetNumberOfChildren() << ">"; mName = ss.str().c_str(); } // we have been linked, so now we can do something :) OnLink(); }
bool RubySceneImporter::ReadGraph(sexp_t* sexp, boost::shared_ptr<BaseNode> root) { while (sexp != 0) { switch (sexp->ty) { case SEXP_VALUE: { string name = Lookup(string(sexp->val)); if (name == S_NODE) { sexp = sexp->next; boost::shared_ptr<BaseNode> node = CreateNode(sexp); if (node.get() == 0) { return false; } root->AddChildReference(node); root = node; } else if (name == S_SELECT) { sexp = sexp->next; string name(sexp->val); //todo: use abbrevTable here? boost::shared_ptr<BaseNode> node = dynamic_pointer_cast<BaseNode>(root->GetChild(name)); if (node.get() == 0) { GetLog()->Error() << "ERROR: Select: " << name << " not found\n"; return false; } root = node; } else if (name == S_PWD) { GetLog()->Debug() << "DEBUG: pwd: " << root->GetFullPath() << "\n"; } else if (name == S_TEMPLATE) { sexp = sexp->next; return ParseTemplate(sexp); } else if (name == S_DEFINE) { sexp = sexp->next; return ParseDefine(sexp); } else if (name == S_SWITCH) { sexp = sexp->next; return ParseSwitch(sexp, root); } else { return ReadMethodCall(sexp, root); } } break; case SEXP_LIST: if (! ReadGraph(sexp->list,root)) { return false; } break; default: return false; } sexp = sexp->next; } return true; }