Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
TLeafObject.cxx
Go to the documentation of this file.
1// @(#)root/tree:$Id$
2// Author: Rene Brun 27/01/96
3
4/*************************************************************************
5 * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12/** \class TLeafObject
13\ingroup tree
14
15A TLeaf for a general object derived from TObject.
16*/
17
18#include "TLeafObject.h"
19#include "TBranch.h"
20#include "TBuffer.h"
21#include "TClass.h"
22#include "TMethodCall.h"
23#include "TDataType.h"
24
26
27////////////////////////////////////////////////////////////////////////////////
28/// Default constructor for LeafObject.
29
31{
32 fClass = 0;
33 fObjAddress = 0;
35}
36
37////////////////////////////////////////////////////////////////////////////////
38/// Create a LeafObject.
39
40TLeafObject::TLeafObject(TBranch *parent, const char *name, const char *type)
41 :TLeaf(parent, name,type)
42{
45 fObjAddress = 0;
47}
48
49////////////////////////////////////////////////////////////////////////////////
50/// Default destructor for a LeafObject.
51
53{
54}
55
56////////////////////////////////////////////////////////////////////////////////
57/// Pack leaf elements in Basket output buffer.
58
60{
61 if (!fObjAddress) return;
62 TObject *object = GetObject();
63 if (object) {
64 if (fVirtual) {
65 UChar_t n = (UChar_t) strlen(object->ClassName());
66 b << n;
67 b.WriteFastArray(object->ClassName(),n+1);
68 }
69 object->Streamer(b);
70 } else {
71 if (fClass) {
72 if (fClass->Property() & kIsAbstract) object = new TObject;
73 else object = (TObject *)fClass->New();
74 object->SetBit(kInvalidObject);
75 object->SetUniqueID(123456789);
76 object->Streamer(b);
77 if (fClass->Property() & kIsAbstract) delete object;
78 else fClass->Destructor(object);
79 } else {
80 Error("FillBasket","Attempt to write a NULL object in leaf:%s",GetName());
81 }
82 }
83}
84
85////////////////////////////////////////////////////////////////////////////////
86/// Returns pointer to method corresponding to name.
87///
88/// name is a string with the general form "method(list of params)"
89/// If list of params is omitted, () is assumed;
90
92{
93 char *namecpy = new char[strlen(name)+1];
94 strcpy(namecpy,name);
95 char *params = strchr(namecpy,'(');
96 if (params) { *params = 0; params++; }
97 else params = (char *) ")";
98
100 TMethodCall *m = new TMethodCall(fClass, namecpy, params);
101 delete [] namecpy;
102 if (m->GetMethod()) return m;
103 Error("GetMethodCall","Unknown method:%s",name);
104 delete m;
105 return 0;
106}
107
108////////////////////////////////////////////////////////////////////////////////
109/// Returns name of leaf type.
110
111const char *TLeafObject::GetTypeName() const
112{
113 return fTitle.Data();
114}
115
116////////////////////////////////////////////////////////////////////////////////
117/// This method must be overridden to handle object notification.
118
120{
122 return kFALSE;
123}
124
125////////////////////////////////////////////////////////////////////////////////
126/// Prints leaf value.
127
129{
130 printf("%zx\n",(size_t)GetValuePointer());
131}
132
133////////////////////////////////////////////////////////////////////////////////
134/// Read leaf elements from Basket input buffer.
135
137{
138 char classname[128];
139 UChar_t n;
140 if (fVirtual) {
141 b >> n;
142 b.ReadFastArray(classname,n+1);
143 fClass = TClass::GetClass(classname);
144 }
145 if (fClass) {
147 if (!fObjAddress) {
148 Longptr_t *voidobj = new Longptr_t[1];
149 fObjAddress = (void **)voidobj;
150 *fObjAddress = (TObject *)fClass->New();
151 }
152 object = (TObject*)(*fObjAddress);
153 if (fBranch->IsAutoDelete()) {
154 fClass->Destructor(object);
155 object = (TObject *)fClass->New();
156 }
157 if (!object) return;
158
160 object->Streamer(b);
161 } else {
162 //emulated class has no Streamer
163 if (!TestBit(kWarn)) {
164 Warning("ReadBasket","%s::Streamer not available, using TClass::ReadBuffer instead",fClass->GetName());
165 SetBit(kWarn);
166 }
167 fClass->ReadBuffer(b,object);
168 }
169 // in case we had written a null pointer a Zombie object was created
170 // we must delete it
171 if (object->TestBit(kInvalidObject)) {
172 if (object->GetUniqueID() == 123456789) {
173 fClass->Destructor(object);
174 object = 0;
175 }
176 }
178 } else GetBranch()->SetAddress(0);
179}
180
181////////////////////////////////////////////////////////////////////////////////
182/// Set leaf buffer data address.
183
185{
186 fObjAddress = (void **)add;
187}
188
189////////////////////////////////////////////////////////////////////////////////
190/// Stream an object of class TLeafObject.
191
192void TLeafObject::Streamer(TBuffer &b)
193{
194 if (b.IsReading()) {
195 UInt_t R__s, R__c;
196 Version_t R__v = b.ReadVersion(&R__s, &R__c);
197 if (R__v > 3 || R__v == 2) {
198 b.ReadClassBuffer(TLeafObject::Class(), this, R__v, R__s, R__c);
199 if (R__v == 2) fVirtual = kTRUE;
200 fObjAddress = 0;
202 if (!fClass) Warning("Streamer","Cannot find class:%s",fTitle.Data());
203
204 // We should rewarn in this process.
207
208 return;
209 }
210 //====process old versions before automatic schema evolution
211 TLeaf::Streamer(b);
212 fObjAddress = 0;
214 if (!fClass) Warning("Streamer","Cannot find class:%s",fTitle.Data());
215 if (R__v < 1) fVirtual = kFALSE;
216 if (R__v == 1) fVirtual = kTRUE;
217 if (R__v == 3) b >> fVirtual;
218 // We should rewarn in this process.
220 //====end of old versions
221
222 } else {
223 b.WriteClassBuffer(TLeafObject::Class(),this);
224 }
225}
226
227////////////////////////////////////////////////////////////////////////////////
228/// Return true if this leaf is does not have any sub-branch/leaf.
229
231{
233 return kTRUE;
234}
#define b(i)
Definition RSha256.hxx:100
long Longptr_t
Definition RtypesCore.h:82
short Version_t
Definition RtypesCore.h:65
unsigned char UChar_t
Definition RtypesCore.h:38
unsigned int UInt_t
Definition RtypesCore.h:46
const Bool_t kFALSE
Definition RtypesCore.h:101
const Bool_t kTRUE
Definition RtypesCore.h:100
#define ClassImp(name)
Definition Rtypes.h:364
@ kIsAbstract
Definition TDictionary.h:71
char name[80]
Definition TGX11.cxx:110
int type
Definition TGX11.cxx:121
A TTree is a list of TBranches.
Definition TBranch.h:89
TObjArray * GetListOfBranches()
Definition TBranch.h:242
virtual void SetAddress(void *add)
Set address of this branch.
Definition TBranch.cxx:2620
Bool_t IsAutoDelete() const
Return kTRUE if an existing object in a TBranchObject must be deleted.
Definition TBranch.cxx:2201
Buffer base class used for serializing objects.
Definition TBuffer.h:43
EState GetState() const
Definition TClass.h:485
void * New(ENewType defConstructor=kClassNew, Bool_t quiet=kFALSE) const
Return a pointer to a newly allocated object of this class.
Definition TClass.cxx:4964
void Destructor(void *obj, Bool_t dtorOnly=kFALSE)
Explicitly call destructor for object.
Definition TClass.cxx:5386
Long_t Property() const
Returns the properties of the TClass as a bit field stored as a Long_t value.
Definition TClass.cxx:6072
@ kEmulated
Definition TClass.h:125
Int_t ReadBuffer(TBuffer &b, void *pointer, Int_t version, UInt_t start, UInt_t count)
Function called by the Streamer functions to deserialize information from buffer b into object at p.
Definition TClass.cxx:6744
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
Definition TClass.cxx:2966
A TLeaf for a general object derived from TObject.
Definition TLeafObject.h:31
virtual ~TLeafObject()
Default destructor for a LeafObject.
virtual Bool_t Notify()
This method must be overridden to handle object notification.
virtual void PrintValue(Int_t i=0) const
Prints leaf value.
virtual void * GetValuePointer() const
Definition TLeafObject.h:63
const char * GetTypeName() const
Returns name of leaf type.
TLeafObject()
Default constructor for LeafObject.
Bool_t IsOnTerminalBranch() const
Return true if this leaf is does not have any sub-branch/leaf.
TObject * GetObject() const
Definition TLeafObject.h:61
virtual void ReadBasket(TBuffer &b)
Read leaf elements from Basket input buffer.
Bool_t fVirtual
Support for polymorphism, when set classname is written with object.
Definition TLeafObject.h:36
virtual void FillBasket(TBuffer &b)
Pack leaf elements in Basket output buffer.
virtual void SetAddress(void *add=0)
Set leaf buffer data address.
void ** fObjAddress
! Address of Pointer to object
Definition TLeafObject.h:35
TClassRef fClass
! pointer to class
Definition TLeafObject.h:34
TMethodCall * GetMethodCall(const char *name)
Returns pointer to method corresponding to name.
A TLeaf describes individual elements of a TBranch See TBranch structure in TTree.
Definition TLeaf.h:57
TBranch * GetBranch() const
Definition TLeaf.h:116
TBranch * fBranch
! Pointer to supporting branch (we do not own the branch)
Definition TLeaf.h:78
Method or function calling interface.
Definition TMethodCall.h:37
virtual void SetTitle(const char *title="")
Set the title of the TNamed.
Definition TNamed.cxx:164
TString fTitle
Definition TNamed.h:33
virtual const char * GetTitle() const
Returns title of object.
Definition TNamed.h:48
virtual const char * GetName() const
Returns name of object.
Definition TNamed.h:47
Int_t GetEntriesFast() const
Definition TObjArray.h:58
Mother of all ROOT objects.
Definition TObject.h:41
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
Definition TObject.h:201
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
Definition TObject.cxx:949
void SetBit(UInt_t f, Bool_t set)
Set or unset the user status bits as specified in f.
Definition TObject.cxx:766
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
Definition TObject.cxx:963
void ResetBit(UInt_t f)
Definition TObject.h:200
@ kInvalidObject
if object ctor succeeded but object should not be used
Definition TObject.h:72
const char * Data() const
Definition TString.h:369
const Int_t n
Definition legend1.C:16
auto * m
Definition textangle.C:8