12 #ifndef ROOT_TCollection 13 #define ROOT_TCollection 57 #ifdef R__CHECK_COLLECTION_MULTI_ACCESS 60 #include <unordered_set> 65 #ifdef R__CHECK_COLLECTION_MULTI_ACCESS 69 std::atomic<std::thread::id> fWriteCurrent;
70 std::atomic<size_t> fWriteCurrentRecurse;
71 std::atomic<size_t> fReadCurrentRecurse;
72 std::unordered_multiset<std::thread::id> fReadSet;
73 std::atomic_flag fSpinLockFlag;
75 void Lock(
const TCollection *collection,
const char *
function);
79 void ReadLock(
const TCollection *collection,
const char *
function);
84 const char *
function);
87 TErrorLock() : fWriteCurrent(), fWriteCurrentRecurse(0), fReadCurrentRecurse(0)
89 std::atomic_flag_clear(&fSpinLockFlag);
96 WriteGuard(TErrorLock &lock,
const TCollection *collection,
const char *
function) : fLock(&lock)
98 fLock->Lock(collection,
function);
100 ~WriteGuard() { fLock->Unlock(); }
107 ReadGuard(TErrorLock &lock,
const TCollection *collection,
const char *
function) : fLock(&lock)
109 fLock->ReadLock(collection,
function);
111 ~ReadGuard() { fLock->ReadUnlock(); }
115 mutable TErrorLock fLock;
117 #define R__COLLECTION_WRITE_GUARD() TCollection::TErrorLock::WriteGuard wg(fLock, this, __PRETTY_FUNCTION__) 118 #define R__COLLECTION_READ_GUARD() TCollection::TErrorLock::ReadGuard rg(fLock, this, __PRETTY_FUNCTION__) 120 #define R__COLLECTION_ITER_GUARD(collection) \ 121 TCollection::TErrorLock::ReadGuard rg(collection->fLock, collection, __PRETTY_FUNCTION__) 125 #define R__COLLECTION_WRITE_GUARD() 126 #define R__COLLECTION_READ_GUARD() 127 #define R__COLLECTION_ITER_GUARD(collection) 173 virtual void Dump()
const ;
178 virtual const char *
GetName()
const;
253 if (fIterator ==
nullptr)
256 return fIterator ==
nullptr || **fIterator ==
nullptr;
260 return !(*
this == aIter);
291 template <
class Containee>
293 static_assert(std::is_base_of<TObject, Containee>::value,
"Containee type must inherit from TObject");
333 template <
class Containee>
335 static_assert(std::is_base_of<TObject, Containee>::value,
"Containee type must inherit from TObject");
347 return static_cast<Containee *
>(obj);
356 Containee *
operator*()
const {
return StaticCast(TIter::operator*()); }
421 #if defined (_REENTRANT) || defined (WIN32) 423 #define R__COLL_COND_MUTEX(mutex) this->IsUsingRWLock() ? mutex : nullptr 425 #define R__COLLECTION_READ_LOCKGUARD(mutex) ::ROOT::TReadLockGuard _R__UNIQUE_(R__readguard)(R__COLL_COND_MUTEX(mutex)) 426 #define R__COLLECTION_READ_LOCKGUARD_NAMED(name,mutex) ::ROOT::TReadLockGuard _NAME2_(R__readguard,name)(R__COLL_COND_MUTEX(mutex)) 428 #define R__COLLECTION_WRITE_LOCKGUARD(mutex) ::ROOT::TWriteLockGuard _R__UNIQUE_(R__readguard)(R__COLL_COND_MUTEX(mutex)) 429 #define R__COLLECTION_WRITE_LOCKGUARD_NAMED(name,mutex) ::ROOT::TWriteLockGuard _NAME2_(R__readguard,name)(R__COLL_COND_MUTEX(mutex)) 433 #define R__COLLECTION_READ_LOCKGUARD(mutex) (void)mutex 434 #define R__COLLECTION_COLLECTION_READ_LOCKGUARD_NAMED(name,mutex) (void)mutex 436 #define R__COLLECTION_WRITE_LOCKGUARD(mutex) (void)mutex 437 #define R__COLLECTION_WRITE_LOCKGUARD_NAMED(name,mutex) (void)mutex 446 #define R__FOR_EACH(type,proc) \ 447 SetCurrentCollection(); \ 448 TIter _NAME3_(nxt_,type,proc)(TCollection::GetCurrentCollection()); \ 449 type *_NAME3_(obj_,type,proc); \ 450 while ((_NAME3_(obj_,type,proc) = (type*) _NAME3_(nxt_,type,proc)())) \ 451 _NAME3_(obj_,type,proc)->proc
ROOT::Internal::TRangeDynCastIterator< T > end() const
virtual TObject * Remove(TObject *obj)=0
static Int_t fgGarbageStack
virtual void Clear(Option_t *option="")=0
const TCollection * GetCollection() const
virtual Option_t * GetOption() const
R__EXTERN TVirtualMutex * gCollectionMutex
TRangeStaticCast(const TCollection &col)
Namespace for new ROOT classes and functions.
TRangeDynCast(const TCollection &col)
ROOT::Internal::TRangeDynCastIterator< T > begin() const
virtual const char * GetCollectionEntryName(TObject *entry) const
For given collection entry return the string that is used to identify the object and, potentially, perform wildcard/regexp filtering on.
TRangeDynCast(const TCollection *col)
Int_t Compare(const TObject *obj) const
Compare two TCollection objects.
TIter & Begin()
Pointing to the first element of the container.
virtual void SetOwner(Bool_t enable=kTRUE)
Set whether this collection is the owner (enable==true) of its content.
Bool_t IsArgNull(const char *where, const TObject *obj) const
Returns true if object is a null pointer.
virtual void Draw(Option_t *option="")
Draw all objects in this collection.
virtual Int_t GetEntries() const
virtual void AddAll(const TCollection *col)
Add all objects from collection col to this collection.
This class implements a mutex interface.
static TIterCategory End()
bool ContaineeInheritsFrom(TClass *cl, TClass *base)
Return true if 'cl' inherits from 'base'.
virtual TIterator * MakeReverseIterator() const
R__ALWAYS_INLINE Bool_t TestBit(UInt_t f) const
virtual Bool_t IsFolder() const
Returns kTRUE in case object contains browsable objects (like containers or lists of other objects)...
static TCollection * fgCurrentCollection
Option_t * GetOption() const
Bool_t Contains(const char *name) const
Containee * operator*() const
TRangeStaticCast is an adaptater class that allows the typed iteration through a TCollection.
virtual TObject * Clone(const char *newname="") const
Make a clone of an collection using the Streamer facility.
Iterator abstract base class.
UInt_t Hash(ECaseCompare cmp=kExact) const
Return hash value.
virtual void Delete(Option_t *option="")=0
Delete this object.
#define ClassDef(name, id)
void AddVector(TObject *obj1,...)
Add all arguments to the collection.
TRangeDynCastIterator(const TIter &iter)
TIterCategory(const TCollection *col, Bool_t dir=kIterForward)
Bool_t Contains(const TObject *obj) const
const Bool_t kIterForward
virtual bool UseRWLock()
Set this collection to use a RW lock upon access, making it thread safe.
virtual void PrintCollectionEntry(TObject *entry, Option_t *option, Int_t recurse) const
Print the collection entry.
Bool_t operator!=(const TIter &aIter) const
Internal help class implmenting an iterator for TRangeDynCast.
Using a TBrowser one can browse all ROOT objects.
virtual void RecursiveRemove(TObject *obj)
Remove object from this collection and recursively remove the object from all other objects (and coll...
TTypedIter is a typed version of TIter.
TRangeStaticCast(const TCollection *col)
virtual Int_t GrowBy(Int_t delta) const
Increase the collection's capacity by delta slots.
R__ALWAYS_INLINE Bool_t IsUsingRWLock() const
static TCollection * GetCurrentCollection()
Return the globally accessible collection.
virtual TIterator * MakeIterator(Bool_t dir=kIterForward) const =0
Collection abstract base class.
virtual void Paint(Option_t *option="")
Paint all objects in this collection.
virtual const TCollection * GetCollection() const =0
The ROOT global object gROOT contains a list of all defined classes.
TTypedIter(const TIter &iter)
static void StartGarbageCollection()
Set up for garbage collection.
This class registers all instances of TObject and its derived classes in a hash table.
void SetName(const char *name)
virtual Bool_t Notify()
'Notify' all objects in this collection.
void SetCurrentCollection()
Set this collection to be the globally accesible collection.
virtual void Dump() const
Dump all objects in this collection.
static Bool_t fgEmptyingGarbage
static TIter End()
Pointing to the element after the last - to a nullptr value in our case.
const TCollection & fCollection
static void GarbageCollect(TObject *obj)
Add to the list of things to be cleaned up.
TTypedIter< T > begin() const
virtual Bool_t IsEmpty() const
const TCollection & EmptyCollection()
Return an empty collection for use with nullptr TRangeCast.
TIter(const TCollection *col, Bool_t dir=kIterForward)
virtual void ls(Option_t *option="") const
List (ls) all objects in this collection.
virtual ~TCollection()
TNamed destructor.
static TObjectTable * fgGarbageCollection
void Browse(TBrowser *b)
Browse this collection (called by TBrowser).
virtual void Add(TObject *obj)=0
static void EmptyGarbageCollection()
Do the garbage collection.
Mother of all ROOT objects.
void operator=(const TCollection &)
virtual void PrintCollectionHeader(Option_t *option) const
Print the collection header.
#define ClassDefInline(name, id)
virtual TObject * Next()=0
TObject * operator*() const
you should not use this method at all Int_t Int_t Double_t Double_t Double_t Int_t Double_t Double_t Double_t Double_t b
virtual TObject * FindObject(const char *name) const
Find an object in this collection using its name.
Bool_t AssertClass(TClass *cl) const
Make sure all objects in this collection inherit from class cl.
TTypedIter< T > end() const
virtual TObject ** GetObjectRef(const TObject *obj) const =0
const Bool_t kIterBackward
Bool_t operator==(const TIter &aIter) const
virtual void Print(Option_t *option="") const
Default print for collections, calls Print(option, 1).
Bool_t IsSortable() const
virtual Int_t GetSize() const
TObject * operator()(const char *name) const
Find an object in this collection by name.
TIterCategory(TIterator *it)
virtual Int_t Write(const char *name=0, Int_t option=0, Int_t bufsize=0)
Write all objects in this collection.
const TCollection & fCollection
virtual const char * GetName() const
Return name of this collection.
TRangeDynCast is an adaptater class that allows the typed iteration through a TCollection.
ULong_t Hash() const
Return hash value for this object.
static Containee * StaticCast(TObject *obj)
Containee * operator*() const