PHCompositeNode.C
//-----------------------------------------------------------------------------
// $Header: /afs/rhic/phenix/cvsroot/offline/framework/phool/PHCompositeNode.C,v 1.12 2001/03/12 14:42:05 pinkenbu Exp $
//
// The PHOOL's Software
// Copyright (C) PHENIX collaboration, 1999
//
// Implementation of class PHCompositeNode
//
//-----------------------------------------------------------------------------
#include <iostream>
#include "PHCompositeNode.h"
#include "PHPointerListIterator.h"
PHCompositeNode::PHCompositeNode() : PHNode("NULL")
{
}
PHCompositeNode::PHCompositeNode(const PHString& name) : PHNode(name)
{
type = "PHCompositeNode";
objecttype = "PHCompositeNode";
}
PHCompositeNode::~PHCompositeNode()
{
subNodes.clearAndDestroy();
}
PHBoolean PHCompositeNode::addNode(PHNode* newNode)
{
//
// Check all existing subNodes for name-conflict.
//
PHPointerListIterator<PHNode> nodeIter(subNodes);
PHNode* thisNode;
while ((thisNode = nodeIter())) {
if (thisNode->getName() == newNode->getName()) {
PHMessage("PHCompositeNode::addNode", PHError, "name conflict");
return False;
}
}
//
// No conflict, so we can append the new node.
//
newNode->setParent(this);
return (subNodes.append(newNode));
}
void PHCompositeNode::prune()
{
PHPointerListIterator<PHNode> nodeIter(subNodes);
PHNode* thisNode;
while ((thisNode = nodeIter())) {
if (!thisNode->isPersistent()) {
subNodes.removeAt(nodeIter.pos());
--nodeIter;
delete thisNode;
}
else {
thisNode->prune();
}
}
}
void PHCompositeNode::forgetMe(PHNode* child)
{
PHPointerListIterator<PHNode> nodeIter(subNodes);
PHNode* thisNode;
while (child && (thisNode = nodeIter())) {
if (thisNode == child) {
subNodes.removeAt(nodeIter.pos());
child = 0;
}
}
}
PHBoolean PHCompositeNode::write(PHIOManager * IOManager, const PHString& path)
{
PHString newPath;
if (path != "")
newPath = path + "/" + name;
else
newPath = name;
PHPointerListIterator<PHNode> nodeIter(subNodes);
PHNode* thisNode;
PHBoolean success = True;
while ((thisNode = nodeIter())) {
if (!(thisNode->write(IOManager, newPath)))
success = False;
}
return success;
}
void PHCompositeNode::print(const PHString& path)
{
PHString newPath = " " + path;
cout << path << name << " (" << type << ")/" << endl;
PHPointerListIterator<PHNode> nodeIter(subNodes);
PHNode* thisNode;
while ((thisNode = nodeIter())) {
thisNode->print(newPath);
}
}