29 #if !defined(WIN32) && !defined(__MWERKS__) && !defined(R__SOLARIS)
52 Long_t TObject::fgDtorOnly = 0;
53 Bool_t TObject::fgObjectStat = kTRUE;
61 void TObject::Copy(TObject &obj)
const
63 obj.fUniqueID = fUniqueID;
66 obj.fBits |= kIsOnHeap;
69 obj.fBits &= ~kIsOnHeap;
71 obj.fBits &= ~kIsReferenced;
72 obj.fBits &= ~kCanDelete;
84 ROOT::CallRecursiveRemoveIfNeeded(*
this);
86 fBits &= ~kNotDeleted;
88 if (fgObjectStat && gObjectTable) gObjectTable->RemoveQuietly(
this);
96 void TObject::AddToTObjectTable(TObject *op)
98 TObjectTable::AddObj(op);
105 void TObject::AppendPad(Option_t *option)
108 gROOT->MakeDefCanvas();
110 if (!gPad->IsEditable())
return;
111 SetBit(kMustCleanup);
112 gPad->GetListOfPrimitives()->Add(
this,option);
113 gPad->Modified(kTRUE);
119 void TObject::Browse(TBrowser *b)
122 TClass::AutoBrowse(
this,b);
128 const char *TObject::ClassName()
const
130 return IsA()->GetName();
144 TObject *TObject::Clone(
const char *)
const
147 return gDirectory->CloneObject(
this);
150 return gROOT->CloneObject(
this);
159 Int_t TObject::Compare(
const TObject *)
const
161 AbstractMethod(
"Compare");
169 void TObject::Delete(Option_t *)
174 gInterpreter->DeleteGlobal(
this);
186 Int_t TObject::DistancetoPrimitive(Int_t, Int_t)
195 void TObject::Draw(Option_t *option)
210 void TObject::DrawClass()
const
219 TObject *TObject::DrawClone(Option_t *option)
const
221 TVirtualPad *pad = gROOT->GetSelectedPad();
222 TVirtualPad *padsav = gPad;
225 TObject *newobj = Clone();
226 if (!newobj)
return 0;
228 if (strlen(option)) pad->GetListOfPrimitives()->Add(newobj,option);
229 else pad->GetListOfPrimitives()->Add(newobj,GetDrawOption());
230 pad->Modified(kTRUE);
232 if (padsav) padsav->cd();
235 if (strlen(option)) newobj->Draw(option);
236 else newobj->Draw(GetDrawOption());
237 if (padsav) padsav->cd();
266 void TObject::Dump()
const
269 const void *actual = IsA()->DynamicCast(TObject::Class(),
this,kFALSE);
277 void TObject::Execute(
const char *method,
const char *params, Int_t *error)
281 Bool_t must_cleanup = TestBit(kMustCleanup);
283 gInterpreter->Execute(
this, IsA(), method, params, error);
285 if (gPad && must_cleanup) gPad->Modified();
295 void TObject::Execute(TMethod *method, TObjArray *params, Int_t *error)
299 Bool_t must_cleanup = TestBit(kMustCleanup);
301 gInterpreter->Execute(
this, IsA(), method, params, error);
303 if (gPad && must_cleanup) gPad->Modified();
311 void TObject::ExecuteEvent(Int_t, Int_t, Int_t)
321 TObject *TObject::FindObject(
const char *)
const
331 TObject *TObject::FindObject(
const TObject *)
const
341 Option_t *TObject::GetDrawOption()
const
343 if (!gPad)
return "";
345 TListIter next(gPad->GetListOfPrimitives());
347 while ((obj = next())) {
348 if (obj ==
this)
return next.GetOption();
357 const char *TObject::GetName()
const
359 return IsA()->GetName();
367 const char *TObject::GetIconName()
const
375 UInt_t TObject::GetUniqueID()
const
386 char *TObject::GetObjectInfo(Int_t px, Int_t py)
const
388 if (!gPad)
return (
char*)
"";
389 static char info[64];
390 Float_t x = gPad->AbsPixeltoX(px);
391 Float_t y = gPad->AbsPixeltoY(py);
392 snprintf(info,64,
"x=%g, y=%g",gPad->PadtoX(x),gPad->PadtoY(y));
401 const char *TObject::GetTitle()
const
403 return IsA()->GetTitle();
411 Bool_t TObject::HandleTimer(TTimer *)
433 ULong_t TObject::Hash()
const
436 const void *ptr =
this;
437 return TString::Hash(&ptr,
sizeof(
void*));
443 Bool_t TObject::InheritsFrom(
const char *classname)
const
445 return IsA()->InheritsFrom(classname);
451 Bool_t TObject::InheritsFrom(
const TClass *cl)
const
453 return IsA()->InheritsFrom(cl);
464 void TObject::Inspect()
const
466 gGuiFactory->CreateInspectorImp(
this, 400, 200);
473 Bool_t TObject::IsFolder()
const
483 Bool_t TObject::IsEqual(
const TObject *obj)
const
492 void TObject::ls(Option_t *option)
const
494 TROOT::IndentLevel();
495 std::cout <<
"OBJ: " << IsA()->GetName() <<
"\t" << GetName() <<
"\t" << GetTitle() <<
" : ";
496 std::cout << Int_t(TestBit(kCanDelete));
497 if (option && strstr(option,
"noaddr")==0) {
498 std::cout <<
" at: "<< this ;
500 std::cout << std::endl;
506 Bool_t TObject::Notify()
519 void TObject::Paint(Option_t *)
532 if (
this == gPad->GetListOfPrimitives()->Last())
return;
534 TListIter next(gPad->GetListOfPrimitives());
536 while ((obj = next()))
538 char *opt = StrDup(next.GetOption());
539 gPad->GetListOfPrimitives()->Remove((TObject*)
this);
540 gPad->GetListOfPrimitives()->AddLast(
this, opt);
550 void TObject::Print(Option_t *)
const
552 std::cout <<
"OBJ: " << IsA()->GetName() <<
"\t" << GetName() <<
"\t" << GetTitle() << std::endl;
562 Int_t TObject::Read(
const char *name)
564 if (gDirectory)
return gDirectory->ReadTObject(
this,name);
572 void TObject::RecursiveRemove(TObject *)
599 void TObject::SaveAs(
const char *filename, Option_t *option)
const
602 if (filename && strstr(filename,
".root")) {
603 if (gDirectory) gDirectory->SaveObjectAs(
this,filename,
"");
608 if (filename && strstr(filename,
".xml")) {
609 if (gDirectory) gDirectory->SaveObjectAs(
this,filename,
"");
614 if (filename && strstr(filename,
".json")) {
615 if (gDirectory) gDirectory->SaveObjectAs(
this,filename,option);
620 if (filename && strstr(filename,
".cc")) {
622 if (filename && strlen(filename) > 0) {
625 fname.Form(
"%s.cc", GetName());
628 out.open(fname.Data(), std::ios::out);
630 Error(
"SaveAs",
"cannot open file: %s", fname.Data());
633 ((TObject*)
this)->SavePrimitive(out,
"cc");
635 Info(
"SaveAs",
"cc file: %s has been generated", fname.Data());
641 if (filename && strlen(filename) > 0) {
644 fname.Form(
"%s.C", GetName());
647 out.open(fname.Data(), std::ios::out);
649 Error(
"SaveAs",
"cannot open file: %s", fname.Data());
652 out <<
"{"<<std::endl;
653 out <<
"//========= Macro generated from object: "<<GetName()<<
"/"<<GetTitle()<<std::endl;
654 out <<
"//========= by ROOT version"<<gROOT->GetVersion()<<std::endl;
655 ((TObject*)
this)->SavePrimitive(out,option);
656 out <<
"}"<<std::endl;
658 Info(
"SaveAs",
"C++ Macro file: %s has been generated", fname.Data());
664 void TObject::SavePrimitive(std::ostream &out, Option_t * )
666 out <<
"//Primitive: " << GetName() <<
"/" << GetTitle()
667 <<
". You must implement " << ClassName() <<
"::SavePrimitive" << std::endl;
677 void TObject::SetDrawOption(Option_t *option)
679 if (!gPad || !option)
return;
681 TListIter next(gPad->GetListOfPrimitives());
682 delete gPad->FindObject(
"Tframe");
684 while ((obj = next()))
686 next.SetOption(option);
694 void TObject::SetBit(UInt_t f, Bool_t set)
705 void TObject::SetUniqueID(UInt_t uid)
715 void TObject::UseCurrentStyle()
764 Int_t TObject::Write(
const char *name, Int_t option, Int_t bufsize)
const
767 if (option & kSingleKey) opt +=
"SingleKey";
768 if (option & kOverwrite) opt +=
"OverWrite";
769 if (option & kWriteDelete) opt +=
"WriteDelete";
771 if (gDirectory)
return gDirectory->WriteTObject(
this,name,opt.Data(),bufsize);
773 const char *objname =
"no name specified";
774 if (name) objname = name;
775 else objname = GetName();
776 Error(
"Write",
"The current directory (gDirectory) is null. The object (%s) has not been written.",objname);
785 Int_t TObject::Write(
const char *name, Int_t option, Int_t bufsize)
787 return ((
const TObject*)
this)->Write(name, option, bufsize);
793 void TObject::Streamer(TBuffer &R__b)
795 if (IsA()->CanIgnoreTObjectStreamer())
return;
797 if (R__b.IsReading()) {
802 if (TestBit(kIsReferenced)) {
806 pidf += R__b.GetPidOffset();
807 TProcessID *pid = R__b.ReadProcessID(pidf);
809 UInt_t gpid = pid->GetUniqueID();
811 fUniqueID = fUniqueID | 0xff000000;
813 fUniqueID = ( fUniqueID & 0xffffff) + (gpid<<24);
815 pid->PutObjectWithID(
this);
819 R__b.WriteVersion(TObject::IsA());
820 if (!TestBit(kIsReferenced)) {
825 UInt_t uid = fUniqueID & 0xffffff;
828 TProcessID *pid = TProcessID::GetProcessWithUID(fUniqueID,
this);
830 TRefTable *table = TRefTable::GetRefTable();
831 if(table) table->Add(uid, pid);
832 pidf = R__b.WriteProcessID(pid);
841 void TObject::DoError(
int level,
const char *location,
const char *fmt, va_list va)
const
843 const char *classname =
"UnknownClass";
844 if (TROOT::Initialized())
845 classname = ClassName();
847 ::ErrorHandler(level, Form(
"%s::%s", classname, location), fmt, va);
854 void TObject::Info(
const char *location,
const char *va_(fmt), ...)
const
857 va_start(ap, va_(fmt));
858 DoError(kInfo, location, va_(fmt), ap);
866 void TObject::Warning(
const char *location,
const char *va_(fmt), ...)
const
869 va_start(ap, va_(fmt));
870 DoError(kWarning, location, va_(fmt), ap);
872 if (TROOT::Initialized())
873 gROOT->Message(1001,
this);
880 void TObject::Error(
const char *location,
const char *va_(fmt), ...)
const
883 va_start(ap, va_(fmt));
884 DoError(kError, location, va_(fmt), ap);
886 if (TROOT::Initialized())
887 gROOT->Message(1002,
this);
894 void TObject::SysError(
const char *location,
const char *va_(fmt), ...)
const
897 va_start(ap, va_(fmt));
898 DoError(kSysError, location, va_(fmt), ap);
900 if (TROOT::Initialized())
901 gROOT->Message(1003,
this);
908 void TObject::Fatal(
const char *location,
const char *va_(fmt), ...)
const
911 va_start(ap, va_(fmt));
912 DoError(kFatal, location, va_(fmt), ap);
914 if (TROOT::Initialized())
915 gROOT->Message(1004,
this);
922 void TObject::AbstractMethod(
const char *method)
const
924 Warning(method,
"this method must be overridden!");
933 void TObject::MayNotUse(
const char *method)
const
935 Warning(method,
"may not use this method");
942 void TObject::Obsolete(
const char *method,
const char *asOfVers,
const char *removedFromVers)
const
944 const char *classname =
"UnknownClass";
945 if (TROOT::Initialized())
946 classname = ClassName();
948 ::Obsolete(Form(
"%s::%s", classname, method), asOfVers, removedFromVers);
954 Bool_t TObject::GetObjectStat()
961 void TObject::SetObjectStat(Bool_t stat)
969 Long_t TObject::GetDtorOnly()
977 void TObject::SetDtorOnly(
void *obj)
979 fgDtorOnly = (Long_t) obj;
985 void TObject::operator
delete(
void *ptr)
987 if ((Long_t) ptr != fgDtorOnly)
988 TStorage::ObjectDealloc(ptr);
996 void TObject::operator
delete[](
void *ptr)
998 if ((Long_t) ptr != fgDtorOnly)
999 TStorage::ObjectDealloc(ptr);
1004 #ifdef R__SIZEDDELETE
1008 void TObject::operator
delete(
void *ptr,
size_t size)
1010 if ((Long_t) ptr != fgDtorOnly)
1011 TStorage::ObjectDealloc(ptr, size);
1019 void TObject::operator
delete[](
void *ptr,
size_t size)
1021 if ((Long_t) ptr != fgDtorOnly)
1022 TStorage::ObjectDealloc(ptr, size);
1031 std::string cling::printValue(TObject *val) {
1032 std::ostringstream strm;
1033 strm <<
"Name: " << val->GetName() <<
" Title: " << val->GetTitle();
1037 #ifdef R__PLACEMENTDELETE
1041 void TObject::operator
delete(
void *ptr,
void *vp)
1043 TStorage::ObjectDealloc(ptr, vp);
1049 void TObject::operator
delete[](
void *ptr,
void *vp)
1051 TStorage::ObjectDealloc(ptr, vp);