// @(#)root/treeplayer:$Id$
// Author: Philippe Canal 06/06/2004

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

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

#include "TBranchProxyDescriptor.h"

#include "TClonesArray.h"
#include "TError.h"
#include "TROOT.h"

#include "TTreeFormula.h"
#include "TFormLeafInfo.h"
#include <ctype.h>

ClassImp(ROOT::TBranchProxyDescriptor);

namespace ROOT {

   TBranchProxyDescriptor::TBranchProxyDescriptor(const char *dataname,
                                                  const char *type,
                                                  const char *branchname,
                                                  Bool_t split,
                                                  Bool_t skipped,
                                                  Bool_t isleaflist) :
      TNamed(dataname,type),fBranchName(branchname),fIsSplit(split),fBranchIsSkipped(skipped),fIsLeafList(isleaflist)
   {
      // Constructor.

      fDataName = GetName();
      if (fDataName.Length() && fDataName[fDataName.Length()-1]=='.') fDataName.Remove(fDataName.Length()-1);

      fDataName.ReplaceAll(".","_");
      fDataName.ReplaceAll(":","_");
      fDataName.ReplaceAll("<","_");
      fDataName.ReplaceAll(">","_");
      if (!isalpha(fDataName[0])) fDataName.Insert(0,"_");
      fDataName.ReplaceAll(" ","");
      fDataName.ReplaceAll("*","st");
      fDataName.ReplaceAll("&","rf");

   }

   const char *TBranchProxyDescriptor::GetDataName()
   {
      // Get the name of the data member.
      return fDataName;
   }

   const char *TBranchProxyDescriptor::GetTypeName()
   {
      // Get the name of the type of the data member
      return GetTitle();
   }

   const char *TBranchProxyDescriptor::GetBranchName()
   {
      // Get the branch name.
      return fBranchName.Data();
   }

   Bool_t TBranchProxyDescriptor::IsEquivalent(const TBranchProxyDescriptor *other,
                                               Bool_t inClass)
   {
      // Return true if this description is the 'same' as the other decription.

      if ( !other ) return false;
      if ( other == this ) return true;

      if ( inClass ) {
         // If this description belong to a class, the branchname will be
         // stripped.
      } else {
         if ( fBranchName != other->fBranchName ) return false;
      }
      if ( fIsSplit != other->fIsSplit ) return false;
      if ( fBranchIsSkipped != other->fBranchIsSkipped) return false;
      if ( strcmp(GetName(),other->GetName()) ) return false;
      if ( strcmp(GetTitle(),other->GetTitle()) ) return false;
      return true;
   }

   Bool_t TBranchProxyDescriptor::IsSplit() const
   {
      // Return true if the branch is split
      return fIsSplit;
   }

   void TBranchProxyDescriptor::OutputDecl(FILE *hf, int offset, UInt_t maxVarname)
   {
      // Output the declaration corresponding to this proxy
      fprintf(hf,"%-*s%-*s %s;\n",  offset," ",  maxVarname, GetTypeName(), GetDataName()); // might want to add a comment
   }

   void TBranchProxyDescriptor::OutputInit(FILE *hf, int offset,
                                           UInt_t maxVarname,
                                           const char *prefix)
   {
      // Output the initialization corresponding to this proxy
      if (fIsSplit) {
         const char *subbranchname = GetBranchName();
         const char *above = "";
         if (strncmp(prefix,subbranchname,strlen(prefix))==0
             && strcmp(prefix,subbranchname)!=0)  {
            subbranchname += strlen(prefix)+1; // +1 for the dot "."
            above = "ffPrefix, ";
         }

         if (fBranchIsSkipped) {
            fprintf(hf,"\n%-*s      %-*s(director, obj.GetProxy(), \"%s\", %s\"%s\")",
                    offset," ", maxVarname, GetDataName(), GetDataName(), above, subbranchname);
         } else {
            if (fIsLeafList) {
               if (above[0]=='\0') {
                  fprintf(hf,"\n%-*s      %-*s(director, \"%s\", \"\", \"%s\")",
                          offset," ", maxVarname, GetDataName(), subbranchname, GetDataName());
               } else {
                  fprintf(hf,"\n%-*s      %-*s(director, %s\"%s\", \"%s\")",
                          offset," ", maxVarname, GetDataName(), above, subbranchname, GetDataName());
               }
            } else {
               fprintf(hf,"\n%-*s      %-*s(director, %s\"%s\")",
                       offset," ", maxVarname, GetDataName(), above, subbranchname);
            }
         }
      } else {

         fprintf(hf,"\n%-*s      %-*s(director, obj.GetProxy(), \"%s\")",
                 offset," ", maxVarname, GetDataName(), GetBranchName() );

         //fprintf(hf,"\n%-*s      %-*s(director, ffPrefix, \"\", \"%s\")",
         //        offset," ", maxVarname, GetName(), GetBranchName() );

      }
   }
}
 TBranchProxyDescriptor.cxx:1
 TBranchProxyDescriptor.cxx:2
 TBranchProxyDescriptor.cxx:3
 TBranchProxyDescriptor.cxx:4
 TBranchProxyDescriptor.cxx:5
 TBranchProxyDescriptor.cxx:6
 TBranchProxyDescriptor.cxx:7
 TBranchProxyDescriptor.cxx:8
 TBranchProxyDescriptor.cxx:9
 TBranchProxyDescriptor.cxx:10
 TBranchProxyDescriptor.cxx:11
 TBranchProxyDescriptor.cxx:12
 TBranchProxyDescriptor.cxx:13
 TBranchProxyDescriptor.cxx:14
 TBranchProxyDescriptor.cxx:15
 TBranchProxyDescriptor.cxx:16
 TBranchProxyDescriptor.cxx:17
 TBranchProxyDescriptor.cxx:18
 TBranchProxyDescriptor.cxx:19
 TBranchProxyDescriptor.cxx:20
 TBranchProxyDescriptor.cxx:21
 TBranchProxyDescriptor.cxx:22
 TBranchProxyDescriptor.cxx:23
 TBranchProxyDescriptor.cxx:24
 TBranchProxyDescriptor.cxx:25
 TBranchProxyDescriptor.cxx:26
 TBranchProxyDescriptor.cxx:27
 TBranchProxyDescriptor.cxx:28
 TBranchProxyDescriptor.cxx:29
 TBranchProxyDescriptor.cxx:30
 TBranchProxyDescriptor.cxx:31
 TBranchProxyDescriptor.cxx:32
 TBranchProxyDescriptor.cxx:33
 TBranchProxyDescriptor.cxx:34
 TBranchProxyDescriptor.cxx:35
 TBranchProxyDescriptor.cxx:36
 TBranchProxyDescriptor.cxx:37
 TBranchProxyDescriptor.cxx:38
 TBranchProxyDescriptor.cxx:39
 TBranchProxyDescriptor.cxx:40
 TBranchProxyDescriptor.cxx:41
 TBranchProxyDescriptor.cxx:42
 TBranchProxyDescriptor.cxx:43
 TBranchProxyDescriptor.cxx:44
 TBranchProxyDescriptor.cxx:45
 TBranchProxyDescriptor.cxx:46
 TBranchProxyDescriptor.cxx:47
 TBranchProxyDescriptor.cxx:48
 TBranchProxyDescriptor.cxx:49
 TBranchProxyDescriptor.cxx:50
 TBranchProxyDescriptor.cxx:51
 TBranchProxyDescriptor.cxx:52
 TBranchProxyDescriptor.cxx:53
 TBranchProxyDescriptor.cxx:54
 TBranchProxyDescriptor.cxx:55
 TBranchProxyDescriptor.cxx:56
 TBranchProxyDescriptor.cxx:57
 TBranchProxyDescriptor.cxx:58
 TBranchProxyDescriptor.cxx:59
 TBranchProxyDescriptor.cxx:60
 TBranchProxyDescriptor.cxx:61
 TBranchProxyDescriptor.cxx:62
 TBranchProxyDescriptor.cxx:63
 TBranchProxyDescriptor.cxx:64
 TBranchProxyDescriptor.cxx:65
 TBranchProxyDescriptor.cxx:66
 TBranchProxyDescriptor.cxx:67
 TBranchProxyDescriptor.cxx:68
 TBranchProxyDescriptor.cxx:69
 TBranchProxyDescriptor.cxx:70
 TBranchProxyDescriptor.cxx:71
 TBranchProxyDescriptor.cxx:72
 TBranchProxyDescriptor.cxx:73
 TBranchProxyDescriptor.cxx:74
 TBranchProxyDescriptor.cxx:75
 TBranchProxyDescriptor.cxx:76
 TBranchProxyDescriptor.cxx:77
 TBranchProxyDescriptor.cxx:78
 TBranchProxyDescriptor.cxx:79
 TBranchProxyDescriptor.cxx:80
 TBranchProxyDescriptor.cxx:81
 TBranchProxyDescriptor.cxx:82
 TBranchProxyDescriptor.cxx:83
 TBranchProxyDescriptor.cxx:84
 TBranchProxyDescriptor.cxx:85
 TBranchProxyDescriptor.cxx:86
 TBranchProxyDescriptor.cxx:87
 TBranchProxyDescriptor.cxx:88
 TBranchProxyDescriptor.cxx:89
 TBranchProxyDescriptor.cxx:90
 TBranchProxyDescriptor.cxx:91
 TBranchProxyDescriptor.cxx:92
 TBranchProxyDescriptor.cxx:93
 TBranchProxyDescriptor.cxx:94
 TBranchProxyDescriptor.cxx:95
 TBranchProxyDescriptor.cxx:96
 TBranchProxyDescriptor.cxx:97
 TBranchProxyDescriptor.cxx:98
 TBranchProxyDescriptor.cxx:99
 TBranchProxyDescriptor.cxx:100
 TBranchProxyDescriptor.cxx:101
 TBranchProxyDescriptor.cxx:102
 TBranchProxyDescriptor.cxx:103
 TBranchProxyDescriptor.cxx:104
 TBranchProxyDescriptor.cxx:105
 TBranchProxyDescriptor.cxx:106
 TBranchProxyDescriptor.cxx:107
 TBranchProxyDescriptor.cxx:108
 TBranchProxyDescriptor.cxx:109
 TBranchProxyDescriptor.cxx:110
 TBranchProxyDescriptor.cxx:111
 TBranchProxyDescriptor.cxx:112
 TBranchProxyDescriptor.cxx:113
 TBranchProxyDescriptor.cxx:114
 TBranchProxyDescriptor.cxx:115
 TBranchProxyDescriptor.cxx:116
 TBranchProxyDescriptor.cxx:117
 TBranchProxyDescriptor.cxx:118
 TBranchProxyDescriptor.cxx:119
 TBranchProxyDescriptor.cxx:120
 TBranchProxyDescriptor.cxx:121
 TBranchProxyDescriptor.cxx:122
 TBranchProxyDescriptor.cxx:123
 TBranchProxyDescriptor.cxx:124
 TBranchProxyDescriptor.cxx:125
 TBranchProxyDescriptor.cxx:126
 TBranchProxyDescriptor.cxx:127
 TBranchProxyDescriptor.cxx:128
 TBranchProxyDescriptor.cxx:129
 TBranchProxyDescriptor.cxx:130
 TBranchProxyDescriptor.cxx:131
 TBranchProxyDescriptor.cxx:132
 TBranchProxyDescriptor.cxx:133
 TBranchProxyDescriptor.cxx:134
 TBranchProxyDescriptor.cxx:135
 TBranchProxyDescriptor.cxx:136
 TBranchProxyDescriptor.cxx:137
 TBranchProxyDescriptor.cxx:138
 TBranchProxyDescriptor.cxx:139
 TBranchProxyDescriptor.cxx:140
 TBranchProxyDescriptor.cxx:141
 TBranchProxyDescriptor.cxx:142
 TBranchProxyDescriptor.cxx:143
 TBranchProxyDescriptor.cxx:144
 TBranchProxyDescriptor.cxx:145
 TBranchProxyDescriptor.cxx:146
 TBranchProxyDescriptor.cxx:147
 TBranchProxyDescriptor.cxx:148
 TBranchProxyDescriptor.cxx:149
 TBranchProxyDescriptor.cxx:150
 TBranchProxyDescriptor.cxx:151
 TBranchProxyDescriptor.cxx:152
 TBranchProxyDescriptor.cxx:153