void NSDFWriter::writeModelTree() { vector< string > tokens; ObjId mRoot(modelRoot_); string rootPath = MODELTREEPATH + string("/") + mRoot.element()->getName(); hid_t rootGroup = require_group(filehandle_, rootPath); hid_t tmp; htri_t exists; herr_t status; deque<Id> nodeQueue; deque<hid_t> h5nodeQueue; nodeQueue.push_back(mRoot); h5nodeQueue.push_back(rootGroup); // TODO: need to clarify what happens with array elements. We can // have one node per vec and set a count field for the number of // elements while (nodeQueue.size() > 0){ ObjId node = nodeQueue.front(); nodeQueue.pop_front(); hid_t prev = h5nodeQueue.front();; h5nodeQueue.pop_front(); vector < Id > children; Neutral::children(node.eref(), children); for ( unsigned int ii = 0; ii < children.size(); ++ii){ string name = children[ii].element()->getName(); // skip the system elements if (children[ii].path() == "/Msgs" || children[ii].path() == "/clock" || children[ii].path() == "/classes" || children[ii].path() == "/postmaster"){ continue; } exists = H5Lexists(prev, name.c_str(), H5P_DEFAULT); if (exists > 0){ tmp = H5Gopen2(prev, name.c_str(), H5P_DEFAULT); } else { tmp = H5Gcreate2(prev, name.c_str(), H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT); } writeScalarAttr< string >(tmp, "uid", children[ii].path()); nodeQueue.push_back(children[ii]); h5nodeQueue.push_back(tmp); } status = H5Gclose(prev); } }
int RsdCpuScriptImpl::invokeRoot() { RsdCpuScriptImpl * oldTLS = mCtx->setTLS(this); int ret = mRoot(); mCtx->setTLS(oldTLS); return ret; }