File indexing completed on 2025-07-11 08:46:23
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef ROOT_TObject
0013 #define ROOT_TObject
0014
0015
0016
0017 #include "Rtypes.h"
0018 #include "TStorage.h"
0019 #include "TVersionCheck.h"
0020
0021 #include <stdarg.h>
0022 #include <string>
0023 #include <iosfwd>
0024
0025 #ifdef WIN32
0026 #undef RemoveDirectory
0027 #endif
0028
0029 class TList;
0030 class TBrowser;
0031 class TBuffer;
0032 class TObjArray;
0033 class TMethod;
0034 class TTimer;
0035
0036 namespace ROOT {
0037 namespace Internal {
0038 bool DeleteChangesMemoryImpl();
0039 }}
0040
0041 class TObject {
0042
0043 private:
0044 UInt_t fUniqueID;
0045 UInt_t fBits;
0046
0047 static Longptr_t fgDtorOnly;
0048 static Bool_t fgObjectStat;
0049
0050 static void AddToTObjectTable(TObject *);
0051
0052 protected:
0053 void MakeZombie() { fBits |= kZombie; }
0054 virtual void DoError(int level, const char *location, const char *fmt, va_list va) const;
0055
0056 public:
0057
0058
0059
0060
0061 enum EStatusBits {
0062 kCanDelete = BIT(0),
0063
0064 kMustCleanup = BIT(3),
0065 kIsReferenced = BIT(4),
0066 kHasUUID = BIT(5),
0067 kCannotPick = BIT(6),
0068
0069 kNoContextMenu = BIT(8),
0070
0071
0072 kInvalidObject = BIT(13)
0073 };
0074
0075 enum EDeprecatedStatusBits {
0076 kObjInCanvas = BIT(3)
0077 };
0078
0079
0080 enum {
0081 kIsOnHeap = 0x01000000,
0082 kNotDeleted = 0x02000000,
0083 kZombie = 0x04000000,
0084 kInconsistent = 0x08000000,
0085
0086 kBitMask = 0x00ffffff
0087 };
0088
0089
0090 enum {
0091 kSingleKey = BIT(0),
0092 kOverwrite = BIT(1),
0093 kWriteDelete = BIT(2),
0094 };
0095
0096 protected:
0097 enum {
0098
0099
0100
0101
0102
0103
0104
0105
0106 kOnlyPrepStep = BIT(3)
0107 };
0108
0109 public:
0110
0111 TObject();
0112 TObject(const TObject &object);
0113 TObject &operator=(const TObject &rhs);
0114 virtual ~TObject();
0115
0116 virtual void AppendPad(Option_t *option="");
0117 virtual void Browse(TBrowser *b);
0118 virtual const char *ClassName() const;
0119 virtual void Clear(Option_t * ="") { }
0120 ULong_t CheckedHash();
0121 virtual TObject *Clone(const char *newname="") const;
0122 virtual Int_t Compare(const TObject *obj) const;
0123 virtual void Copy(TObject &object) const;
0124 virtual void Delete(Option_t *option="");
0125 virtual Int_t DistancetoPrimitive(Int_t px, Int_t py);
0126 virtual void Draw(Option_t *option="");
0127 virtual void DrawClass() const;
0128 virtual TObject *DrawClone(Option_t *option="") const;
0129 virtual void Dump() const;
0130 virtual void Execute(const char *method, const char *params, Int_t *error = nullptr);
0131 virtual void Execute(TMethod *method, TObjArray *params, Int_t *error = nullptr);
0132 virtual void ExecuteEvent(Int_t event, Int_t px, Int_t py);
0133 virtual TObject *FindObject(const char *name) const;
0134 virtual TObject *FindObject(const TObject *obj) const;
0135 virtual Option_t *GetDrawOption() const;
0136 virtual UInt_t GetUniqueID() const;
0137 virtual const char *GetName() const;
0138 virtual const char *GetIconName() const;
0139 virtual Option_t *GetOption() const { return ""; }
0140 virtual char *GetObjectInfo(Int_t px, Int_t py) const;
0141 virtual const char *GetTitle() const;
0142 virtual Bool_t HandleTimer(TTimer *timer);
0143 Bool_t HasInconsistentHash() const;
0144 virtual ULong_t Hash() const;
0145 virtual Bool_t InheritsFrom(const char *classname) const;
0146 virtual Bool_t InheritsFrom(const TClass *cl) const;
0147 virtual void Inspect() const;
0148 virtual Bool_t IsFolder() const;
0149 virtual Bool_t IsEqual(const TObject *obj) const;
0150 virtual Bool_t IsSortable() const { return kFALSE; }
0151
0152 R__ALWAYS_INLINE Bool_t IsOnHeap() const { return TestBit(kIsOnHeap); }
0153 R__ALWAYS_INLINE Bool_t IsZombie() const { return TestBit(kZombie); }
0154
0155 virtual Bool_t Notify();
0156 virtual void ls(Option_t *option="") const;
0157 virtual void Paint(Option_t *option="");
0158 virtual void Pop();
0159 virtual void Print(Option_t *option="") const;
0160 virtual Int_t Read(const char *name);
0161 virtual void RecursiveRemove(TObject *obj);
0162 virtual void SaveAs(const char *filename="",Option_t *option="") const;
0163 virtual void SavePrimitive(std::ostream &out, Option_t *option = "");
0164 virtual void SetDrawOption(Option_t *option="");
0165 virtual void SetUniqueID(UInt_t uid);
0166 virtual void UseCurrentStyle();
0167 virtual Int_t Write(const char *name = nullptr, Int_t option = 0, Int_t bufsize = 0);
0168 virtual Int_t Write(const char *name = nullptr, Int_t option = 0, Int_t bufsize = 0) const;
0169
0170
0171
0172
0173
0174
0175
0176
0177
0178 Bool_t IsDestructed() const { return !TestBit(kNotDeleted); }
0179
0180
0181 void *operator new(size_t sz) { return TStorage::ObjectAlloc(sz); }
0182 void *operator new[](size_t sz) { return TStorage::ObjectAllocArray(sz); }
0183 void *operator new(size_t sz, void *vp) { return TStorage::ObjectAlloc(sz, vp); }
0184 void *operator new[](size_t sz, void *vp) { return TStorage::ObjectAlloc(sz, vp); }
0185 void operator delete(void *ptr);
0186 void operator delete[](void *ptr);
0187 #ifdef R__SIZEDDELETE
0188
0189 void operator delete(void*, size_t);
0190 void operator delete[](void*, size_t);
0191 #endif
0192 void operator delete(void *ptr, void *vp);
0193 void operator delete[](void *ptr, void *vp);
0194
0195
0196 void SetBit(UInt_t f, Bool_t set);
0197 void SetBit(UInt_t f) { fBits |= f & kBitMask; }
0198 void ResetBit(UInt_t f) { fBits &= ~(f & kBitMask); }
0199 R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const { return (Bool_t) ((fBits & f) != 0); }
0200 Int_t TestBits(UInt_t f) const { return (Int_t) (fBits & f); }
0201 void InvertBit(UInt_t f) { fBits ^= f & kBitMask; }
0202
0203
0204 virtual void Info(const char *method, const char *msgfmt, ...) const
0205 #if defined(__GNUC__)
0206 __attribute__((format(printf, 3, 4)))
0207 #endif
0208 ;
0209 virtual void Warning(const char *method, const char *msgfmt, ...) const
0210 #if defined(__GNUC__)
0211 __attribute__((format(printf, 3, 4)))
0212 #endif
0213 ;
0214 virtual void Error(const char *method, const char *msgfmt, ...) const
0215 #if defined(__GNUC__)
0216 __attribute__((format(printf, 3, 4)))
0217 #endif
0218 ;
0219 virtual void SysError(const char *method, const char *msgfmt, ...) const
0220 #if defined(__GNUC__)
0221 __attribute__((format(printf, 3, 4)))
0222 #endif
0223 ;
0224 virtual void Fatal(const char *method, const char *msgfmt, ...) const
0225 #if defined(__GNUC__)
0226 __attribute__((format(printf, 3, 4)))
0227 #endif
0228 ;
0229
0230 void AbstractMethod(const char *method) const;
0231 void MayNotUse(const char *method) const;
0232 void Obsolete(const char *method, const char *asOfVers, const char *removedFromVers) const;
0233
0234
0235 static Longptr_t GetDtorOnly();
0236 static void SetDtorOnly(void *obj);
0237 static Bool_t GetObjectStat();
0238 static void SetObjectStat(Bool_t stat);
0239
0240 friend class TClonesArray;
0241 friend bool ROOT::Internal::DeleteChangesMemoryImpl();
0242
0243 ClassDef(TObject,1)
0244 };
0245
0246
0247
0248
0249
0250
0251
0252
0253
0254 inline TObject::TObject() : fBits(kNotDeleted)
0255 {
0256
0257
0258 TStorage::UpdateIsOnHeap(fUniqueID, fBits);
0259
0260 fUniqueID = 0;
0261
0262 #ifdef R__WIN32
0263 if (R__unlikely(GetObjectStat())) TObject::AddToTObjectTable(this);
0264 #else
0265 if (R__unlikely(fgObjectStat)) TObject::AddToTObjectTable(this);
0266 #endif
0267 }
0268
0269
0270
0271
0272 inline TObject::TObject(const TObject &obj)
0273 {
0274 fBits = obj.fBits;
0275
0276
0277
0278 TStorage::UpdateIsOnHeap(fUniqueID, fBits);
0279
0280 fBits &= ~kIsReferenced;
0281 fBits &= ~kCanDelete;
0282
0283
0284 fUniqueID = obj.fUniqueID;
0285
0286 #ifdef R__WIN32
0287 if (R__unlikely(GetObjectStat())) TObject::AddToTObjectTable(this);
0288 #else
0289 if (R__unlikely(fgObjectStat)) TObject::AddToTObjectTable(this);
0290 #endif
0291 }
0292
0293
0294
0295
0296 inline TObject &TObject::operator=(const TObject &rhs)
0297 {
0298 if (R__likely(this != &rhs)) {
0299 fUniqueID = rhs.fUniqueID;
0300 if (IsOnHeap()) {
0301 fBits = rhs.fBits;
0302 fBits |= kIsOnHeap;
0303 } else {
0304 fBits = rhs.fBits;
0305 fBits &= ~kIsOnHeap;
0306 }
0307 fBits &= ~kIsReferenced;
0308 fBits &= ~kCanDelete;
0309 }
0310 return *this;
0311 }
0312
0313
0314
0315
0316
0317
0318
0319
0320
0321
0322
0323
0324 inline ULong_t TObject::CheckedHash()
0325 {
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338
0339 if (!CheckTObjectHashConsistency())
0340 fBits |= kInconsistent;
0341
0342
0343 return Hash();
0344 }
0345
0346
0347
0348
0349
0350
0351
0352
0353
0354
0355
0356
0357
0358 inline Bool_t TObject::HasInconsistentHash() const
0359 {
0360 return fBits & kInconsistent;
0361 }
0362
0363
0364
0365
0366 enum EObjBits {
0367 kCanDelete = TObject::kCanDelete,
0368 kMustCleanup = TObject::kMustCleanup,
0369 kObjInCanvas = TObject::kObjInCanvas,
0370 kIsReferenced = TObject::kIsReferenced,
0371 kHasUUID = TObject::kHasUUID,
0372 kCannotPick = TObject::kCannotPick,
0373 kNoContextMenu = TObject::kNoContextMenu,
0374 kInvalidObject = TObject::kInvalidObject
0375 };
0376
0377 namespace cling {
0378 std::string printValue(TObject *val);
0379 }
0380
0381 namespace ROOT {
0382
0383 namespace Internal {
0384 bool DeleteChangesMemory();
0385 }
0386
0387 namespace Detail {
0388
0389
0390
0391
0392
0393
0394
0395
0396
0397
0398
0399
0400
0401
0402 R__ALWAYS_INLINE bool HasBeenDeleted(const TObject *obj) {
0403 return !ROOT::Internal::DeleteChangesMemory() && obj->IsDestructed();
0404 }
0405
0406 }}
0407
0408 #endif