210         Error(
"AddBefore", 
"before not found, object not added");
 
  237      if (before == 
fFirst.get())
 
  264         Error(
"AddAfter", 
"after not found, object not added");
 
  267      if (t == 
fLast.get())
 
  270         NewLink(obj, t->shared_from_this());
 
  293      if (after == 
fLast.get())
 
  296         NewLink(obj, after->shared_from_this());
 
  317   else if (lnk == 
fFirst.get())
 
  338   auto cached = 
fCache.lock();
 
  339   if (cached.get() && cached->GetObject() && cached->GetObject()->IsEqual(obj)) {
 
  378   auto cached = 
fCache.lock();
 
  379   if (cached.get() && cached->GetObject() && cached->GetObject()->IsEqual(obj)) {
 
  441      auto obj = tlk->GetObject();
 
  444            Error(
"Clear", 
"A list is accessing an object (%p) already deleted (list name = %s)",
 
  446         } 
else if (obj->IsOnHeap()) {
 
  477   TList removeDirectory; 
 
  503         auto obj = tlk->GetObject();
 
  505            Error(
"Delete", 
"A list is accessing an object (%p) already deleted (list name = %s)",
 
  507         else if (obj && obj->IsOnHeap())
 
  509         else if (obj && obj->IsA()->GetDirectoryAutoAdd())
 
  510            removeDirectory.
Add(obj);
 
  531         auto obj = tlk->GetObject();
 
  532         tlk->SetObject(
nullptr);
 
  534            Error(
"Delete", 
"A list is accessing an object (%p) already deleted (list name = %s)",
 
  536         else if (obj && obj->IsOnHeap())
 
  538         else if (obj && obj->IsA()->GetDirectoryAutoAdd())
 
  539            removeDirectory.
Add(obj);
 
  550   TIter iRemDir(&removeDirectory);
 
  552   while ((dirRem = iRemDir())) {
 
  553      (*dirRem->IsA()->GetDirectoryAutoAdd())(dirRem, 0);
 
  562void TList::DeleteLink(
TObjLink *lnk)
 
  588      if (
TObject *obj = lnk->GetObject()) {
 
  589         const char *objname = obj->GetName();
 
  590         if (objname && strcmp(
name, objname) == 0)
 
  618      if (ob->
IsEqual(obj)) 
return ob;
 
  647            if (
object->IsEqual(obj)) 
return lnk;
 
  712   while (i < idx && lnk) {
 
  738   auto newlink = std::make_shared<TObjLink>(obj);
 
  753   auto newlink = std::make_shared<TObjOptLink>(obj, opt);
 
  773      auto cached = 
fCache.lock();
 
  774      if (cached && cached->fNext.get() == 
nullptr && cached->fPrev.lock().get() == 
nullptr) {
 
  775         TObject *ob = cached->GetObject();
 
  789      TObject *ob = lnk->GetObject();
 
  792            lnk->SetObject(
nullptr);
 
  800            } 
else if (lnk == 
fLast) {
 
  801               fLast = lnk->fPrev.lock();
 
  802               fLast->fNext.reset();
 
  805               lnk->Prev()->fNext = next;
 
  806               lnk->Next()->fPrev = lnk->fPrev;
 
  840   if (lnk == 
fFirst.get()) {
 
  844      if (lnk == 
fLast.get()) {
 
  850   } 
else if (lnk == 
fLast.get()) {
 
  852      fLast->fNext.reset();
 
  880   if (lnk == 
fFirst.get()) {
 
  884      if (lnk == 
fLast.get()) {
 
  890   } 
else if (lnk == 
fLast.get()) {
 
  892      fLast->fNext.reset();
 
  918   if (lnk == 
fFirst.get()) {
 
  923      fLast->fNext.reset();
 
  946   if (!
fFirst->GetObject()->IsSortable()) {
 
  947      Error(
"Sort", 
"objects in list are not sortable");
 
  954   std::shared_ptr<TObjLink> ol, lnk = 
fFirst;
 
  956   if (lnk.get()) lnk->fPrev.reset();
 
  974   Int_t cmp = l1->GetObject()->Compare(l2->GetObject());
 
  989   std::shared_ptr<TObjLink> p1, p2, *h2, *t2;
 
  996         return &((*head)->fNext);
 
  999         p2 = (p1 = *head)->fNext;
 
 1001         p1->fNext = (*head = p2)->fNext;
 
 1002         return &((p2->fNext = p1)->fNext);
 
 1012         if (!--
n) 
return *h2 = p2, t2;
 
 1013      } 
while (
LnkCompare((p1 = *(head = &(p1->fNext))), p2));
 
 1019         if (!--
m) 
return *h2 = *t2, *t2 = p1, h2;
 
 1020      } 
while (!
LnkCompare(p1, (p2 = *(head = &(p2->fNext)))));
 
 1023         if (!--
n) 
return *h2 = p2, t2;
 
 1024      } 
while (
LnkCompare((p1 = *(head = &(p1->fNext))), p2));
 
 1037   newlink->fNext = prev->fNext;
 
 1038   newlink->fPrev = prev;
 
 1039   prev->fNext = newlink;
 
 1041      newlink->fNext->fPrev = newlink;
 
 1055        : fList(
l), fCurCursor(0), fCursor(0), fDirection(dir), fStarted(
kFALSE)
 
 1081   if (
this != &rhs && rhs1) {
 
 1113   if (!
fList) 
return 0;
 
 1170   if (IsA() == aIter.IsA()) {
 
 1201   if (
b.IsReading()) {
 
 1205         TObject::Streamer(
b);
 
 1209         for (
Int_t i = 0; i < nobjects; i++) {
 
 1212            if (
v > 4 && nch == 255)  {
 
 1217            readOption.resize(nbig,
'\0');
 
 1218            b.ReadFastArray((
char*) readOption.data(),nbig);
 
 1221                  Add(obj,readOption.c_str());
 
 1227         b.CheckByteCount(R__s, R__c,TList::IsA());
 
 1233         TObject::Streamer(
b);
 
 1237      for (
Int_t i = 0; i < nobjects; i++) {
 
 1241      b.CheckByteCount(R__s, R__c,TList::IsA());
 
 1246      R__c = 
b.WriteVersion(TList::IsA(), 
kTRUE);
 
 1247      TObject::Streamer(
b);
 
 1270      b.SetByteCount(R__c, 
kTRUE);
 
#define R__COLLECTION_READ_LOCKGUARD(mutex)
 
#define R__COLLECTION_WRITE_GUARD()
 
#define R__COLLECTION_READ_GUARD()
 
const Bool_t kIterForward
 
#define R__COLLECTION_ITER_GUARD(collection)
 
#define R__COLLECTION_WRITE_LOCKGUARD(mutex)
 
Buffer base class used for serializing objects.
 
Bool_t IsArgNull(const char *where, const TObject *obj) const
Returns true if object is a null pointer.
 
virtual const char * GetName() const
Return name of this collection.
 
static void GarbageCollect(TObject *obj)
Add to the list of things to be cleaned up.
 
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
 
Iterator abstract base class.
 
TObject * Next()
Return next object in the list. Returns 0 when no more objects in list.
 
void Reset()
Reset list iterator.
 
void SetOption(Option_t *option)
Sets the object option stored in the list.
 
Bool_t operator!=(const TIterator &aIter) const
This operator compares two TIterator objects.
 
TIterator & operator=(const TIterator &rhs)
Overridden assignment operator.
 
Option_t * GetOption() const
Returns the object option stored in the list.
 
Bool_t LnkCompare(const TObjLinkPtr_t &l1, const TObjLinkPtr_t &l2)
Compares the objects stored in the TObjLink objects.
 
TObjLinkPtr_t NewOptLink(TObject *obj, Option_t *opt, const TObjLinkPtr_t &prev=nullptr)
Return a new TObjOptLink (a TObjLink that also stores the option).
 
virtual void Add(TObject *obj)
 
virtual TObject * After(const TObject *obj) const
Returns the object after object obj.
 
virtual ~TList()
Delete the list.
 
Bool_t fAscending
cache to speedup sequential calling of Before() and After() functions
 
virtual TObject * Remove(TObject *obj)
Remove object from the list.
 
virtual TObject ** GetObjectRef(const TObject *obj) const
Return address of pointer to obj.
 
virtual void AddAt(TObject *obj, Int_t idx)
Insert object at position idx in the list.
 
TObjLink * FindLink(const TObject *obj, Int_t &idx) const
Returns the TObjLink object that contains object obj.
 
std::shared_ptr< TObjLink > TObjLinkPtr_t
 
virtual void AddFirst(TObject *obj)
Add object at the beginning of the list.
 
TObjLinkPtr_t fLast
pointer to first entry in linked list
 
void InsertAfter(const TObjLinkPtr_t &newlink, const TObjLinkPtr_t &prev)
Insert a new link in the chain.
 
virtual void RemoveLast()
Remove the last object of the list.
 
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
 
TObjLink * LinkAt(Int_t idx) const
sorting order (when calling Sort() or for TSortedList)
 
virtual TObjLink * FirstLink() const
 
virtual TObject * At(Int_t idx) const
Returns the object at position idx. Returns 0 if idx is out of range.
 
TObjLinkPtr_t NewLink(TObject *obj, const TObjLinkPtr_t &prev=nullptr)
Return a new TObjLink.
 
virtual TObject * Last() const
Return the last object in the list. Returns 0 when list is empty.
 
virtual void AddAfter(const TObject *after, TObject *obj)
Insert object after object after in the list.
 
virtual void RecursiveRemove(TObject *obj)
Remove object from this collection and recursively remove the object from all other objects (and coll...
 
virtual void AddBefore(const TObject *before, TObject *obj)
Insert object before object before in the list.
 
virtual TIterator * MakeIterator(Bool_t dir=kIterForward) const
Return a list iterator.
 
TObjLinkWeakPtr_t fCache
pointer to last entry in linked list
 
virtual TObject * Before(const TObject *obj) const
Returns the object before object obj.
 
virtual void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
 
virtual TObject * First() const
Return the first object in the list. Returns 0 when list is empty.
 
virtual void AddLast(TObject *obj)
Add object at the end of the list.
 
TObjLinkPtr_t * DoSort(TObjLinkPtr_t *head, Int_t n)
Sort linked list.
 
virtual void Clear(Option_t *option="")
Remove all objects from the list.
 
virtual void Sort(Bool_t order=kSortAscending)
Sort linked list.
 
Wrapper around a TObject so it can be stored in a TList.
 
void SetObject(TObject *obj)
 
TObject ** GetObjectRef()
 
virtual Option_t * GetAddOption() const
 
TObject * GetObject() const
 
Mother of all ROOT objects.
 
virtual Bool_t IsEqual(const TObject *obj) const
Default equal comparison (objects are equal if they have the same address in memory).
 
virtual void RecursiveRemove(TObject *obj)
Recursively remove this object from a list.
 
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
 
@ kCanDelete
if object in a list can be deleted
 
R__ALWAYS_INLINE bool HasBeenDeleted(const TObject *obj)
Check if the TObject's memory has been deleted.
 
R__EXTERN TVirtualRWMutex * gCoreMutex