Back to index

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); 
   } 
} 
 

Back to index