25 ClassImp(TLeafObject);
30 TLeafObject::TLeafObject(): TLeaf()
40 TLeafObject::TLeafObject(TBranch *parent,
const char *name,
const char *type)
41 :TLeaf(parent, name,type)
44 fClass = TClass::GetClass(type);
52 TLeafObject::~TLeafObject()
59 void TLeafObject::FillBasket(TBuffer &b)
61 if (!fObjAddress)
return;
62 TObject *
object = GetObject();
65 UChar_t n = (UChar_t) strlen(object->ClassName());
67 b.WriteFastArray(object->ClassName(),n+1);
72 if (fClass->Property() & kIsAbstract)
object =
new TObject;
73 else object = (TObject *)fClass->New();
74 object->SetBit(kInvalidObject);
75 object->SetUniqueID(123456789);
77 if (fClass->Property() & kIsAbstract)
delete object;
78 else fClass->Destructor(
object);
80 Error(
"FillBasket",
"Attempt to write a NULL object in leaf:%s",GetName());
91 TMethodCall *TLeafObject::GetMethodCall(
const char *name)
93 char *namecpy =
new char[strlen(name)+1];
95 char *params = strchr(namecpy,
'(');
96 if (params) { *params = 0; params++; }
97 else params = (
char *)
")";
99 if (!fClass) fClass = TClass::GetClass(GetTitle());
100 TMethodCall *m =
new TMethodCall(fClass, namecpy, params);
102 if (m->GetMethod())
return m;
103 Error(
"GetMethodCall",
"Unknown method:%s",name);
111 const char *TLeafObject::GetTypeName()
const
113 return fTitle.Data();
119 Bool_t TLeafObject::Notify()
121 fClass = TClass::GetClass(GetTitle());
128 void TLeafObject::PrintValue(Int_t)
const
130 printf(
"%lx\n",(Long_t)GetValuePointer());
136 void TLeafObject::ReadBasket(TBuffer &b)
142 b.ReadFastArray(classname,n+1);
143 fClass = TClass::GetClass(classname);
148 Long_t *voidobj =
new Long_t[1];
149 fObjAddress = (
void **)voidobj;
150 *fObjAddress = (TObject *)fClass->New();
152 object = (TObject*)(*fObjAddress);
153 if (fBranch->IsAutoDelete()) {
154 fClass->Destructor(
object);
155 object = (TObject *)fClass->New();
159 if (fClass->GetState() > TClass::kEmulated) {
163 if (!TestBit(kWarn)) {
164 Warning(
"ReadBasket",
"%s::Streamer not available, using TClass::ReadBuffer instead",fClass->GetName());
167 fClass->ReadBuffer(b,
object);
171 if (object->TestBit(kInvalidObject)) {
172 if (object->GetUniqueID() == 123456789) {
173 fClass->Destructor(
object);
177 *fObjAddress = object;
178 }
else GetBranch()->SetAddress(0);
184 void TLeafObject::SetAddress(
void *add)
186 fObjAddress = (
void **)add;
192 void TLeafObject::Streamer(TBuffer &b)
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;
201 fClass = TClass::GetClass(fTitle.Data());
202 if (!fClass) Warning(
"Streamer",
"Cannot find class:%s",fTitle.Data());
213 fClass = TClass::GetClass(fTitle.Data());
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;
223 b.WriteClassBuffer(TLeafObject::Class(),
this);
230 Bool_t TLeafObject::IsOnTerminalBranch()
const
232 if (fBranch->GetListOfBranches()->GetEntriesFast())
return kFALSE;