Main Page   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

TList.h

Go to the documentation of this file.
00001 // @(#)root/cont:$Name:  $:$Id: TList.h,v 1.9 2002/07/29 09:22:28 rdm Exp $
00002 // Author: Fons Rademakers   10/08/95
00003 
00004 /*************************************************************************
00005  * Copyright (C) 1995-2000, Rene Brun and Fons Rademakers.               *
00006  * All rights reserved.                                                  *
00007  *                                                                       *
00008  * For the licensing terms see $ROOTSYS/LICENSE.                         *
00009  * For the list of contributors see $ROOTSYS/README/CREDITS.             *
00010  *************************************************************************/
00011 
00012 #ifndef ROOT_TList
00013 #define ROOT_TList
00014 
00015 
00017 //                                                                      //
00018 // TList                                                                //
00019 //                                                                      //
00020 // A doubly linked list. All classes inheriting from TObject can be     //
00021 // inserted in a TList.                                                 //
00022 //                                                                      //
00024 
00025 #ifndef ROOT_TSeqCollection
00026 #include "TSeqCollection.h"
00027 #endif
00028 #ifndef ROOT_TString
00029 #include "TString.h"
00030 #endif
00031 
00032 const Bool_t kSortAscending  = kTRUE;
00033 const Bool_t kSortDescending = !kSortAscending;
00034 
00035 class TObjLink;
00036 class TListIter;
00037 
00038 
00039 class TList : public TSeqCollection {
00040 
00041 friend  class TListIter;
00042 
00043 protected:
00044    TObjLink  *fFirst;     
00045    TObjLink  *fLast;      
00046    TObjLink  *fCache;     
00047    Bool_t     fAscending; 
00048 
00049    TObjLink          *LinkAt(Int_t idx) const;
00050    TObjLink          *FindLink(const TObject *obj, Int_t &idx) const;
00051    TObjLink         **DoSort(TObjLink **head, Int_t n);
00052    Bool_t             LnkCompare(TObjLink *l1, TObjLink *l2);
00053    virtual TObjLink  *NewLink(TObject *obj, TObjLink *prev = 0);
00054    virtual TObjLink  *NewOptLink(TObject *obj, Option_t *opt, TObjLink *prev = 0);
00055    virtual void       DeleteLink(TObjLink *lnk);
00056 
00057 public:
00058    TList() { fFirst = fLast = fCache = 0; }
00059    TList(TObject *) { fFirst = fLast = fCache = 0; } // for backward compatibility, don't use
00060    virtual           ~TList();
00061    virtual void      Clear(Option_t *option="");
00062    virtual void      Delete(Option_t *option="");
00063    virtual TObject  *FindObject(const char *name) const;
00064    virtual TObject  *FindObject(const TObject *obj) const;
00065    virtual TIterator *MakeIterator(Bool_t dir = kIterForward) const;
00066 
00067    virtual void      Add(TObject *obj) { AddLast(obj); }
00068    virtual void      Add(TObject *obj, Option_t *opt) { AddLast(obj, opt); }
00069    virtual void      AddFirst(TObject *obj);
00070    virtual void      AddFirst(TObject *obj, Option_t *opt);
00071    virtual void      AddLast(TObject *obj);
00072    virtual void      AddLast(TObject *obj, Option_t *opt);
00073    virtual void      AddAt(TObject *obj, Int_t idx);
00074    virtual void      AddAfter(TObject *after, TObject *obj);
00075    virtual void      AddAfter(TObjLink *after, TObject *obj);
00076    virtual void      AddBefore(TObject *before, TObject *obj);
00077    virtual void      AddBefore(TObjLink *before, TObject *obj);
00078    virtual TObject  *Remove(TObject *obj);
00079    virtual TObject  *Remove(TObjLink *lnk);
00080 
00081    virtual TObject  *At(Int_t idx) const;
00082    virtual TObject  *After(TObject *obj) const;
00083    virtual TObject  *Before(TObject *obj) const;
00084    virtual TObject  *First() const;
00085    virtual TObjLink *FirstLink() const { return fFirst; }
00086    virtual TObject **GetObjectRef(const TObject *obj) const;
00087    virtual TObject  *Last() const;
00088    virtual TObjLink *LastLink() const { return fLast; }
00089 
00090    virtual void      Sort(Bool_t order = kSortAscending);
00091    Bool_t            IsAscending() { return fAscending; }
00092 
00093    ClassDef(TList,4)  //Doubly linked list
00094 };
00095 
00096 
00098 //                                                                      //
00099 // TObjLink                                                             //
00100 //                                                                      //
00101 // Wrapper around a TObject so it can be stored in a TList.             //
00102 //                                                                      //
00104 class TObjLink {
00105 
00106 friend  class TList;
00107 
00108 private:
00109    TObjLink   *fNext;
00110    TObjLink   *fPrev;
00111    TObject    *fObject;
00112 
00113 protected:
00114    TObjLink() { fNext = fPrev = this; fObject = 0; }
00115 
00116 public:
00117    TObjLink(TObject *obj) : fNext(0), fPrev(0), fObject(obj) { }
00118    TObjLink(TObject *obj, TObjLink *lnk);
00119    virtual ~TObjLink() { }
00120 
00121    TObject                *GetObject() const { return fObject; }
00122    TObject               **GetObjectRef() { return &fObject; }
00123    void                    SetObject(TObject *obj) { fObject = obj; }
00124    virtual Option_t       *GetAddOption() const { return ""; }
00125    virtual Option_t       *GetOption() const { return fObject->GetOption(); }
00126    virtual void            SetOption(Option_t *) { }
00127    TObjLink               *Next() { return fNext; }
00128    TObjLink               *Prev() { return fPrev; }
00129 };
00130 
00132 //                                                                      //
00133 // TObjOptLink                                                          //
00134 //                                                                      //
00135 // Wrapper around a TObject so it can be stored in a TList including    //
00136 // an option string.                                                    //
00137 //                                                                      //
00139 class TObjOptLink : public TObjLink {
00140 
00141 private:
00142    TString   fOption;
00143 
00144 public:
00145    TObjOptLink(TObject *obj, Option_t *opt) : TObjLink(obj), fOption(opt) { }
00146    TObjOptLink(TObject *obj, TObjLink *lnk, Option_t *opt) : TObjLink(obj, lnk), fOption(opt) { }
00147    ~TObjOptLink() { }
00148    Option_t        *GetAddOption() const { return fOption.Data(); }
00149    Option_t        *GetOption() const { return fOption.Data(); }
00150    void             SetOption(Option_t *option) { fOption = option; }
00151 };
00152 
00153 
00155 //                                                                      //
00156 // TListIter                                                            //
00157 //                                                                      //
00158 // Iterator of linked list.                                             //
00159 //                                                                      //
00161 
00162 class TListIter : public TIterator {
00163 
00164 protected:
00165    const TList       *fList;         //list being iterated
00166    TObjLink          *fCurCursor;    //current position in list
00167    TObjLink          *fCursor;       //next position in list
00168    Bool_t             fDirection;    //iteration direction
00169    Bool_t             fStarted;      //iteration started
00170 
00171    TListIter() : fList(0), fCursor(0), fStarted(kFALSE) { }
00172 
00173 public:
00174    TListIter(const TList *l, Bool_t dir = kIterForward);
00175    TListIter(const TListIter &iter);
00176    ~TListIter() { }
00177    TIterator &operator=(const TIterator &rhs);
00178    TListIter &operator=(const TListIter &rhs);
00179 
00180    const TCollection *GetCollection() const { return fList; }
00181    Option_t          *GetOption() const;
00182    void               SetOption(Option_t *option);
00183    TObject           *Next();
00184    void               Reset() { fStarted = kFALSE; }
00185 
00186    ClassDef(TListIter,0)  //Linked list iterator
00187 };
00188 
00189 #endif

Generated on Thu Dec 18 14:52:21 2003 for ROOT by doxygen1.2.16