bool Tree::insertBelow(NodeRefPtr parent, PDRefCntPtr &elem) { std::list<NodeRefPtr>::iterator iter; NodeRefPtr newNode(new Node(parent, elem)); // add the subordinate nodes of newNode under // new node. In the next loop, we iterate nodes // under new node and remove them from parent. // Reason: if we remove nodes under parent in this // loop, iterator becomes invalid. ScopeLock myLock(treeLock); for(iter = parent->begin(); iter != parent->end(); iter++) { NodeRefPtr node = *iter; PDRefCntPtr data = node->getPolicyDecision(); switch(compare(data->getName(), elem->getName(), false)) { case AM_EXACT_MATCH: case AM_SUB_RESOURCE_MATCH: return false; case AM_NO_MATCH: break; case AM_SUPER_RESOURCE_MATCH: newNode->addNode(node); break; } } for(iter = newNode->begin(); iter != newNode->end(); iter++) { NodeRefPtr node = *iter; parent->remove(node); } parent->addNode(newNode); return true; }