12 #ifndef ROOT_TBranchElement
13 #define ROOT_TBranchElement
36 class TVirtualCollectionProxy;
37 class TVirtualCollectionIterators;
38 class TVirtualCollectionPtrIterators;
43 class TBranchElement :
public TBranch {
46 friend class TTreeCloner;
47 friend class TLeafElement;
52 kBranchFolder = BIT(14),
53 kDeleteObject = BIT(16),
55 kOwnOnfileObj = BIT(19),
56 kAddressSet = BIT(20),
58 kDecomposedObj = BIT(21)
78 TVirtualCollectionProxy *fCollProxy;
80 Version_t fClassVersion;
87 TBranchElement *fBranchCount;
88 TBranchElement *fBranchCount2;
91 TVirtualArray *fOnfileObject;
93 Bool_t fInInitInfo : 1;
94 Bool_t fInitOffsets: 1;
95 TClassRef fTargetClass;
96 TClassRef fCurrentClass;
97 TClassRef fParentClass;
98 TClassRef fBranchClass;
99 TClassRef fClonesClass;
100 Int_t *fBranchOffset;
102 TStreamerInfoActions::TIDs fNewIDs;
103 TStreamerInfoActions::TActionSequence *fReadActionSequence;
104 TStreamerInfoActions::TActionSequence *fFillActionSequence;
105 TVirtualCollectionIterators *fIterators;
106 TVirtualCollectionIterators *fWriteIterators;
107 TVirtualCollectionPtrIterators *fPtrIterators;
111 TBranchElement(
const TBranchElement&);
112 TBranchElement& operator=(
const TBranchElement&);
114 static void SwitchContainer(TObjArray *);
118 void BuildTitle(
const char* name);
119 virtual void InitializeOffsets();
120 virtual void InitInfo();
121 Bool_t IsMissingCollection()
const;
122 TStreamerInfo *FindOnfileInfo(TClass *valueClass,
const TObjArray &branches)
const;
123 TClass *GetParentClass();
124 TStreamerInfo *GetInfoImp()
const;
125 void ReleaseObject();
127 void SetBranchCount(TBranchElement* bre);
128 void SetBranchCount2(TBranchElement* bre) { fBranchCount2 = bre; }
129 Int_t Unroll(
const char* name, TClass* cltop, TClass* cl,
char* ptr, Int_t basketsize, Int_t splitlevel, Int_t btype);
130 inline void ValidateAddress()
const;
132 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);
133 void Init(TTree *tree, TBranch *parent,
const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = ROOT::RCompressionSetting::EAlgorithm::kInherit);
134 void Init(TTree *tree, TBranch *parent,
const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = ROOT::RCompressionSetting::EAlgorithm::kInherit);
136 void SetActionSequence(TClass *originalClass, TStreamerInfo *localInfo, TStreamerInfoActions::TActionSequence::SequenceGetter_t create, TStreamerInfoActions::TActionSequence *&actionSequence);
137 void ReadLeavesImpl(TBuffer& b);
138 void ReadLeavesMakeClass(TBuffer& b);
139 void ReadLeavesCollection(TBuffer& b);
140 void ReadLeavesCollectionSplitPtrMember(TBuffer& b);
141 void ReadLeavesCollectionSplitVectorPtrMember(TBuffer& b);
142 void ReadLeavesCollectionMember(TBuffer& b);
143 void ReadLeavesClones(TBuffer& b);
144 void ReadLeavesClonesMember(TBuffer& b);
145 void ReadLeavesCustomStreamer(TBuffer& b);
146 void ReadLeavesMember(TBuffer& b);
147 void ReadLeavesMemberBranchCount(TBuffer& b);
148 void ReadLeavesMemberCounter(TBuffer& b);
149 void SetReadLeavesPtr();
150 void SetReadActionSequence();
151 void SetupAddressesImpl();
153 void FillLeavesImpl(TBuffer& b);
154 void FillLeavesMakeClass(TBuffer& b);
155 void FillLeavesCollection(TBuffer& b);
156 void FillLeavesCollectionSplitVectorPtrMember(TBuffer& b);
157 void FillLeavesCollectionSplitPtrMember(TBuffer& b);
158 void FillLeavesCollectionMember(TBuffer& b);
159 void FillLeavesAssociativeCollectionMember(TBuffer& b);
160 void FillLeavesClones(TBuffer& b);
161 void FillLeavesClonesMember(TBuffer& b);
162 void FillLeavesCustomStreamer(TBuffer& b);
163 void FillLeavesMemberBranchCount(TBuffer& b);
164 void FillLeavesMemberCounter(TBuffer& b);
165 void FillLeavesMember(TBuffer& b);
166 void SetFillLeavesPtr();
167 void SetFillActionSequence();
172 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);
173 TBranchElement(TTree *tree,
const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = ROOT::RCompressionSetting::EAlgorithm::kInherit);
174 TBranchElement(TTree *tree,
const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = ROOT::RCompressionSetting::EAlgorithm::kInherit);
175 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);
176 TBranchElement(TBranch *parent,
const char* name, TClonesArray* clones, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = ROOT::RCompressionSetting::EAlgorithm::kInherit);
177 TBranchElement(TBranch *parent,
const char* name, TVirtualCollectionProxy* cont, Int_t basketsize = 32000, Int_t splitlevel = 0, Int_t compress = ROOT::RCompressionSetting::EAlgorithm::kInherit);
179 virtual ~TBranchElement();
181 virtual void Browse(TBrowser* b);
182 virtual TBranch *FindBranch(
const char *name);
183 virtual TLeaf *FindLeaf(
const char *name);
184 virtual char *GetAddress()
const;
185 TBranchElement *GetBranchCount()
const {
return fBranchCount; }
186 TBranchElement *GetBranchCount2()
const {
return fBranchCount2; }
187 Int_t *GetBranchOffset()
const {
return fBranchOffset; }
188 UInt_t GetCheckSum() {
return fCheckSum; }
189 virtual const char *GetClassName()
const {
return fClassName.Data(); }
190 virtual TClass *GetClass()
const {
return fBranchClass; }
191 virtual const char *GetClonesName()
const {
return fClonesName.Data(); }
192 TVirtualCollectionProxy *GetCollectionProxy();
193 TClass *GetCurrentClass();
194 virtual Int_t GetEntry(Long64_t entry = 0, Int_t getall = 0);
195 virtual Int_t GetExpectedType(TClass *&clptr,EDataType &type);
196 const char *GetIconName()
const;
197 Int_t GetID()
const {
return fID; }
198 TStreamerInfo *GetInfo()
const;
199 Bool_t GetMakeClass()
const;
200 char *GetObject()
const;
201 TVirtualArray *GetOnfileObject()
const {
return fOnfileObject; }
202 virtual const char *GetParentName()
const {
return fParentName.Data(); }
203 virtual Int_t GetMaximum()
const;
204 Int_t GetNdata()
const {
return fNdata; }
205 Int_t GetType()
const {
return fType; }
206 Int_t GetStreamerType()
const {
return fStreamerType; }
207 virtual TClass *GetTargetClass() {
return fTargetClass; }
208 virtual const char *GetTypeName()
const;
209 Double_t GetValue(Int_t i, Int_t len, Bool_t subarr = kFALSE)
const {
return GetTypedValue<Double_t>(i, len, subarr); }
210 template<
typename T > T GetTypedValue(Int_t i, Int_t len, Bool_t subarr = kFALSE)
const;
211 virtual void *GetValuePointer()
const;
212 Int_t GetClassVersion() {
return fClassVersion; }
213 Bool_t IsBranchFolder()
const {
return TestBit(kBranchFolder); }
214 Bool_t IsFolder()
const;
215 virtual Bool_t IsObjectOwner()
const {
return TestBit(kDeleteObject); }
216 virtual Bool_t Notify() {
if (fAddress) { ResetAddress(); }
return 1; }
217 virtual void Print(Option_t* option =
"")
const;
218 void PrintValue(Int_t i)
const;
219 virtual void Reset(Option_t* option =
"");
220 virtual void ResetAfterMerge(TFileMergeInfo *);
221 virtual void ResetAddress();
222 virtual void ResetDeleteObject();
223 virtual void ResetInitInfo(
bool recurse);
224 virtual void SetAddress(
void* addobj);
225 virtual Bool_t SetMakeClass(Bool_t decomposeObj = kTRUE);
226 virtual void SetObject(
void *objadd);
227 virtual void SetBasketSize(Int_t buffsize);
228 virtual void SetBranchFolder() { SetBit(kBranchFolder); }
229 virtual void SetClassName(
const char* name) { fClassName = name; }
230 virtual void SetOffset(Int_t offset);
231 virtual void SetMissing();
232 inline void SetParentClass(TClass* clparent);
233 virtual void SetParentName(
const char* name) { fParentName = name; }
234 virtual void SetTargetClass(
const char *name);
235 virtual void SetupAddresses();
236 virtual void SetType(Int_t btype) { fType = btype; }
237 virtual void UpdateFile();
238 void Unroll(
const char *name, TClass *cl, TStreamerInfo *sinfo,
char* objptr, Int_t bufsize, Int_t splitlevel);
240 enum EBranchElementType {
250 kClonesMemberNode = 31,
255 virtual Int_t FillImpl(ROOT::Internal::TBranchIMTHelper *);
257 ClassDef(TBranchElement,10)
260 inline void TBranchElement::SetParentClass(TClass* clparent)
262 fParentClass = clparent;
263 fParentName = clparent ? clparent->GetName() :
"";
266 inline void TBranchElement::ValidateAddress()
const
272 if (!fTree->GetMakeClass() && fAddress && (*((
char**) fAddress) != fObject)) {
279 if (TestBit(kDeleteObject)) {
281 Error(
"ValidateAddress",
"We owned an object whose address changed! our ptr: %p new ptr: %p",
282 (
void*)fObject, (
void*)*((
char**) fAddress));
283 const_cast<TBranchElement*
>(
this)->ResetBit(kDeleteObject);
285 const_cast<TBranchElement*
>(
this)->SetAddress(fAddress);
290 #endif // ROOT_TBranchElement