00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 #ifndef ROOT_TList
00013 #define ROOT_TList
00014
00015
00017
00018
00019
00020
00021
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; }
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)
00094 };
00095
00096
00098
00099
00100
00101
00102
00104
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
00134
00135
00136
00137
00139
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
00157
00158
00159
00161
00162 class TListIter : public TIterator {
00163
00164 protected:
00165 const TList *fList;
00166 TObjLink *fCurCursor;
00167 TObjLink *fCursor;
00168 Bool_t fDirection;
00169 Bool_t fStarted;
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)
00187 };
00188
00189 #endif