ROOT logo
// @(#)root/base:$Id: TFriendProxyDescriptor.cxx 21547 2007-12-20 18:19:50Z pcanal $
// Author: Philippe Canal  13/05/2003

/*************************************************************************
 * Copyright (C) 1995-2000, Rene Brun, Fons Rademakers and al.           *
 * All rights reserved.                                                  *
 *                                                                       *
 * For the licensing terms see $ROOTSYS/LICENSE.                         *
 * For the list of contributors see $ROOTSYS/README/CREDITS.             *
 *************************************************************************/

//////////////////////////////////////////////////////////////////////////
//                                                                      //
// TFriendProxyDescriptor                                               //
//                                                                      //
// Hold the processed information about a Friend TTree while            //
// TTreeProxyGenerator is parsing the TTree information.                //
// Also contains the routine use to generate the appropriate code       //
// fragment in the result of MakeProxy.                                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

#include "TFriendProxyDescriptor.h"
#include "TBranchProxyDescriptor.h"
#include "TList.h"

ClassImp(ROOT::TFriendProxyDescriptor);

namespace ROOT {

   TFriendProxyDescriptor::TFriendProxyDescriptor(const char *treename,
                                                  const char *aliasname,
                                                  Int_t index) :
      TNamed(treename,aliasname),
      fDuplicate(kFALSE),
      fIndex(index)
   {
      // Constructor
   }

   Bool_t TFriendProxyDescriptor::IsEquivalent(const TFriendProxyDescriptor *other)
   {
      // Return true if this descriptor and the other are equivalent (describe the
      // same entity).

      if ( !other ) return kFALSE;
      if ( strcmp(GetName(),other->GetName()) ) return kFALSE;

      TBranchProxyDescriptor *desc;
      TBranchProxyDescriptor *othdesc;

      if ( fListOfTopProxies.GetSize() != other->fListOfTopProxies.GetSize() ) return kFALSE;
      TIter next(&fListOfTopProxies);
      TIter othnext(&other->fListOfTopProxies);
      while ( (desc=(TBranchProxyDescriptor*)next()) ) {
         othdesc=(TBranchProxyDescriptor*)othnext();
         if (!desc->IsEquivalent(othdesc) ) return kFALSE;
      }
      return kTRUE;
   }

   void TFriendProxyDescriptor::OutputClassDecl(FILE *hf, int offset, UInt_t maxVarname)
   {
      // Print the declaration needed for this descriptor.

      fprintf(hf,"%-*sstruct TFriendPx_%s : public TFriendProxy {\n", offset," ", GetName() );
      fprintf(hf,"%-*s   TFriendPx_%s(TBranchProxyDirector *director,TTree *tree,Int_t index) :\n",
              offset," ", GetName() );
      fprintf(hf,"%-*s      %-*s(director,tree,index)",offset," ",maxVarname,"TFriendProxy");
      TBranchProxyDescriptor *data;
      TIter next = &fListOfTopProxies;
      while ( (data = (TBranchProxyDescriptor*)next()) ) {
         fprintf(hf,",\n%-*s      %-*s(&fDirector,\"%s\")",
                 offset," ",maxVarname, data->GetDataName(), data->GetBranchName());
      }
      fprintf(hf,"\n%-*s   { }\n",offset," ");

      fprintf(hf, "\n%-*s   // Proxy for each of the branches and leaves of the tree\n",offset," ");
      next.Reset();
      while ( (data = (TBranchProxyDescriptor*)next()) ) {
         data->OutputDecl(hf, offset+3, maxVarname);
      }
      fprintf(hf,"%-*s};\n",offset," ");
   }

   void TFriendProxyDescriptor::OutputDecl(FILE *hf, int offset, UInt_t maxVarname)
   {
      // Print the declaration needed for this descriptor.

      TString typeName = "TFriendPx_";
      typeName += GetName();
      fprintf(hf,"%-*s%-*s %s;\n",
              offset," ",maxVarname,typeName.Data(),GetTitle());
   }

}
 TFriendProxyDescriptor.cxx:1
 TFriendProxyDescriptor.cxx:2
 TFriendProxyDescriptor.cxx:3
 TFriendProxyDescriptor.cxx:4
 TFriendProxyDescriptor.cxx:5
 TFriendProxyDescriptor.cxx:6
 TFriendProxyDescriptor.cxx:7
 TFriendProxyDescriptor.cxx:8
 TFriendProxyDescriptor.cxx:9
 TFriendProxyDescriptor.cxx:10
 TFriendProxyDescriptor.cxx:11
 TFriendProxyDescriptor.cxx:12
 TFriendProxyDescriptor.cxx:13
 TFriendProxyDescriptor.cxx:14
 TFriendProxyDescriptor.cxx:15
 TFriendProxyDescriptor.cxx:16
 TFriendProxyDescriptor.cxx:17
 TFriendProxyDescriptor.cxx:18
 TFriendProxyDescriptor.cxx:19
 TFriendProxyDescriptor.cxx:20
 TFriendProxyDescriptor.cxx:21
 TFriendProxyDescriptor.cxx:22
 TFriendProxyDescriptor.cxx:23
 TFriendProxyDescriptor.cxx:24
 TFriendProxyDescriptor.cxx:25
 TFriendProxyDescriptor.cxx:26
 TFriendProxyDescriptor.cxx:27
 TFriendProxyDescriptor.cxx:28
 TFriendProxyDescriptor.cxx:29
 TFriendProxyDescriptor.cxx:30
 TFriendProxyDescriptor.cxx:31
 TFriendProxyDescriptor.cxx:32
 TFriendProxyDescriptor.cxx:33
 TFriendProxyDescriptor.cxx:34
 TFriendProxyDescriptor.cxx:35
 TFriendProxyDescriptor.cxx:36
 TFriendProxyDescriptor.cxx:37
 TFriendProxyDescriptor.cxx:38
 TFriendProxyDescriptor.cxx:39
 TFriendProxyDescriptor.cxx:40
 TFriendProxyDescriptor.cxx:41
 TFriendProxyDescriptor.cxx:42
 TFriendProxyDescriptor.cxx:43
 TFriendProxyDescriptor.cxx:44
 TFriendProxyDescriptor.cxx:45
 TFriendProxyDescriptor.cxx:46
 TFriendProxyDescriptor.cxx:47
 TFriendProxyDescriptor.cxx:48
 TFriendProxyDescriptor.cxx:49
 TFriendProxyDescriptor.cxx:50
 TFriendProxyDescriptor.cxx:51
 TFriendProxyDescriptor.cxx:52
 TFriendProxyDescriptor.cxx:53
 TFriendProxyDescriptor.cxx:54
 TFriendProxyDescriptor.cxx:55
 TFriendProxyDescriptor.cxx:56
 TFriendProxyDescriptor.cxx:57
 TFriendProxyDescriptor.cxx:58
 TFriendProxyDescriptor.cxx:59
 TFriendProxyDescriptor.cxx:60
 TFriendProxyDescriptor.cxx:61
 TFriendProxyDescriptor.cxx:62
 TFriendProxyDescriptor.cxx:63
 TFriendProxyDescriptor.cxx:64
 TFriendProxyDescriptor.cxx:65
 TFriendProxyDescriptor.cxx:66
 TFriendProxyDescriptor.cxx:67
 TFriendProxyDescriptor.cxx:68
 TFriendProxyDescriptor.cxx:69
 TFriendProxyDescriptor.cxx:70
 TFriendProxyDescriptor.cxx:71
 TFriendProxyDescriptor.cxx:72
 TFriendProxyDescriptor.cxx:73
 TFriendProxyDescriptor.cxx:74
 TFriendProxyDescriptor.cxx:75
 TFriendProxyDescriptor.cxx:76
 TFriendProxyDescriptor.cxx:77
 TFriendProxyDescriptor.cxx:78
 TFriendProxyDescriptor.cxx:79
 TFriendProxyDescriptor.cxx:80
 TFriendProxyDescriptor.cxx:81
 TFriendProxyDescriptor.cxx:82
 TFriendProxyDescriptor.cxx:83
 TFriendProxyDescriptor.cxx:84
 TFriendProxyDescriptor.cxx:85
 TFriendProxyDescriptor.cxx:86
 TFriendProxyDescriptor.cxx:87
 TFriendProxyDescriptor.cxx:88
 TFriendProxyDescriptor.cxx:89
 TFriendProxyDescriptor.cxx:90
 TFriendProxyDescriptor.cxx:91
 TFriendProxyDescriptor.cxx:92
 TFriendProxyDescriptor.cxx:93
 TFriendProxyDescriptor.cxx:94
 TFriendProxyDescriptor.cxx:95
 TFriendProxyDescriptor.cxx:96