Re: [ROOT] TNode::SetParent()

From: Glen R. Salo (gsalo@mrcstl.com)
Date: Thu Aug 30 2001 - 15:57:34 MEST


Should there be a check to insure that parent is not a child of this? 
Perhaps something like:

  TNode *pp = parent;
  while(pp) {
    if (pp == this) {
      printf("Error: Cannot set parent node to be a child node.\n");
      printf("       Operation not performed!\n");
      return;
    }
    pp = pp->GetParent();
  }

Glen

On 29-Aug-2001 Rene Brun wrote:
> Hi Robert,
> 
> Your analysis is correct. TNode::SetParent was not doing the complete
> job.
> Your fix is OK. I introduced it into the current CVS head.
> Thanks for this report.
> 
> Rene Brun
> 
> Robert Hatcher wrote:
>> 
>> Hi,
>>   Currently in TNode.h there is the declaration & definition for the
>> method to change a TNode's parent, e.g.:
>> 
>>    virtual void        SetParent(TNode *parent) {fParent=parent;}
>> 
>> But this does only half the work necessary.  The parent losing the
>> custody battle is never informed and continues to think they have
>> this child.  I think the right code is:
>> 
>> void TNode::SetParent(TNode *parent)
>> {
>>    // set the pointer to the parent, keep parents informed about who
>>    they have
>> 
>>    if (fParent)   fParent->GetListOfNodes()->Remove(this);
>>    else         gGeometry->GetListOfNodes()->Remove(this);
>> 
>>    fParent = parent;
>> 
>>    if (fParent) {
>>       fParent->BuildListOfNodes(); // new parent might not have list
>>       fParent->GetListOfNodes()->Add(this);
>>    }
>>    else gGeometry->GetListOfNodes()->Add(this);
>> }
>> 
>> Could this be the distributed definition?  There are times when
>> building a geometry it's easier to build a "containee" node before
>> one builds the "container" node and then after the fact make
>> the right adjustments.
>> 
>> Thanks,
>> -robert
>> 
>> Robert W. Hatcher   |  rhatcher@slac.stanford.edu
>> Research Associate  |  650.926.3171  [FAX 4001 or 3587]
>> Stanford University |  PO Box 4349, MS #63, Stanford CA 94309



This archive was generated by hypermail 2b29 : Tue Jan 01 2002 - 17:50:59 MET