#ifndef ROOT_TBranchElement
#define ROOT_TBranchElement
#ifndef ROOT_TBranch
#include "TBranch.h"
#endif
#ifndef ROOT_TClassRef
#include "TClassRef.h"
#endif
#include <vector>
class TFolder;
class TStreamerInfo;
class TVirtualCollectionProxy;
class TVirtualArray;
class TBranchElement : public TBranch {
friend class TTreeCloner;
protected:
enum {
kBranchFolder = BIT(14),
kDeleteObject = BIT(16),
kCache = BIT(18),
kOwnOnfileObj = BIT(19),
kAddressSet = BIT(20)
};
protected:
TString fClassName;
TString fTargetClassName;
TString fParentName;
TString fClonesName;
TVirtualCollectionProxy *fCollProxy;
UInt_t fCheckSum;
Int_t fClassVersion;
Int_t fID;
Int_t fType;
Int_t fStreamerType;
Int_t fMaximum;
Int_t fSTLtype;
Int_t fNdata;
TBranchElement *fBranchCount;
TBranchElement *fBranchCount2;
TStreamerInfo *fInfo;
char *fObject;
TVirtualArray *fOnfileObject;
Bool_t fInit;
Bool_t fInitOffsets;
TClassRef fCurrentClass;
TClassRef fParentClass;
TClassRef fBranchClass;
Int_t *fBranchOffset;
Int_t fBranchID;
std::vector<Int_t> fIDs;
private:
TBranchElement(const TBranchElement&);
TBranchElement& operator=(const TBranchElement&);
protected:
void BuildTitle(const char* name);
virtual void InitializeOffsets();
virtual void InitInfo();
Bool_t IsMissingCollection() const;
TClass *GetCurrentClass();
TClass *GetParentClass();
void ReleaseObject();
void SetBranchCount(TBranchElement* bre);
void SetBranchCount2(TBranchElement* bre) { fBranchCount2 = bre; }
Int_t Unroll(const char* name, TClass* cltop, TClass* cl, char* ptr, Int_t basketsize, Int_t splitlevel, Int_t btype);
void ValidateAddress() const;
void Init(TTree *tree, TBranch *parent, const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
void Init(TTree *tree, TBranch *parent, const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
void Init(TTree *tree, TBranch *parent, const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
public:
TBranchElement();
TBranchElement(TTree *tree, const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
TBranchElement(TTree *tree, const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
TBranchElement(TTree *tree, const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
TBranchElement(TBranch *parent, const char* name, TStreamerInfo* sinfo, Int_t id, char* pointer, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t btype = 0);
TBranchElement(TBranch *parent, const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
TBranchElement(TBranch *parent, const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = -1);
virtual ~TBranchElement();
virtual void Browse(TBrowser* b);
virtual Int_t Fill();
virtual void FillLeaves(TBuffer& b);
virtual TBranch *FindBranch(const char *name);
virtual TLeaf *FindLeaf(const char *name);
virtual char *GetAddress() const;
TBranchElement *GetBranchCount() const { return fBranchCount; }
TBranchElement *GetBranchCount2() const { return fBranchCount2; }
Int_t *GetBranchOffset() const { return fBranchOffset; }
UInt_t GetCheckSum() { return fCheckSum; }
virtual const char *GetClassName() const { return fClassName.Data(); }
virtual const char *GetClonesName() const { return fClonesName.Data(); }
TVirtualCollectionProxy *GetCollectionProxy();
virtual Int_t GetEntry(Long64_t entry = 0, Int_t getall = 0);
const char *GetIconName() const;
Int_t GetID() const { return fID; }
TStreamerInfo *GetInfo() const;
char *GetObject() const;
virtual const char *GetParentName() const { return fParentName.Data(); }
virtual Int_t GetMaximum() const;
Int_t GetNdata() const { return fNdata; }
Int_t GetType() const { return fType; }
Int_t GetStreamerType() const { return fStreamerType; }
virtual TString GetTargetClassName() { return fTargetClassName; }
virtual const char *GetTypeName() const;
Double_t GetValue(Int_t i, Int_t len, Bool_t subarr = kFALSE) const;
virtual void *GetValuePointer() const;
Int_t GetClassVersion() { return fClassVersion; }
Bool_t IsBranchFolder() const { return TestBit(kBranchFolder); }
Bool_t IsFolder() const;
virtual Bool_t IsObjectOwner() const { return TestBit(kDeleteObject); }
virtual Bool_t Notify() { if (fAddress) { ResetAddress(); } return 1; }
virtual void Print(Option_t* option = "") const;
void PrintValue(Int_t i) const;
virtual void ReadLeaves(TBuffer& b);
virtual void Reset(Option_t* option = "");
virtual void ResetAddress();
virtual void ResetDeleteObject();
virtual void SetAddress(void* addobj);
virtual void SetObject(void *objadd);
virtual void SetBasketSize(Int_t buffsize);
virtual void SetBranchFolder() { SetBit(kBranchFolder); }
virtual void SetClassName(const char* name) { fClassName = name; }
inline void SetParentClass(TClass* clparent);
virtual void SetParentName(const char* name) { fParentName = name; }
virtual void SetTargetClassName(const char *name);
virtual void SetupAddresses();
virtual void SetType(Int_t btype) { fType = btype; }
ClassDef(TBranchElement,9)
};
inline void TBranchElement::SetParentClass(TClass* clparent)
{
fParentClass = clparent;
fParentName = clparent ? clparent->GetName() : "";
}
#endif // ROOT_TBranchElement