31 #if (__GNUC__ >= 3) && !defined(__INTEL_COMPILER)
34 #pragma GCC system_header
37 const Bool_t kSortAscending = kTRUE;
38 const Bool_t kSortDescending = !kSortAscending;
44 class TList :
public TSeqCollection {
46 friend class TListIter;
49 using TObjLinkPtr_t = std::shared_ptr<TObjLink>;
50 using TObjLinkWeakPtr_t = std::weak_ptr<TObjLink>;
54 TObjLinkWeakPtr_t fCache;
57 TObjLink *LinkAt(Int_t idx)
const;
58 TObjLink *FindLink(
const TObject *obj, Int_t &idx)
const;
60 TObjLinkPtr_t *DoSort(TObjLinkPtr_t *head, Int_t n);
62 Bool_t LnkCompare(
const TObjLinkPtr_t &l1,
const TObjLinkPtr_t &l2);
63 TObjLinkPtr_t NewLink(TObject *obj,
const TObjLinkPtr_t &prev =
nullptr);
64 TObjLinkPtr_t NewOptLink(TObject *obj, Option_t *opt,
const TObjLinkPtr_t &prev =
nullptr);
65 TObjLinkPtr_t NewLink(TObject *obj, TObjLink *prev);
66 TObjLinkPtr_t NewOptLink(TObject *obj, Option_t *opt, TObjLink *prev);
69 void InsertAfter(
const TObjLinkPtr_t &newlink,
const TObjLinkPtr_t &prev);
73 TList& operator=(
const TList&);
76 typedef TListIter Iterator_t;
78 TList() : fAscending(kTRUE) { }
79 TList(TObject *) : fAscending(kTRUE) { }
81 virtual void Clear(Option_t *option=
"");
82 virtual void Delete(Option_t *option=
"");
83 virtual TObject *FindObject(
const char *name)
const;
84 virtual TObject *FindObject(
const TObject *obj)
const;
85 virtual TIterator *MakeIterator(Bool_t dir = kIterForward)
const;
87 virtual void Add(TObject *obj) { AddLast(obj); }
88 virtual void Add(TObject *obj, Option_t *opt) { AddLast(obj, opt); }
89 virtual void AddFirst(TObject *obj);
90 virtual void AddFirst(TObject *obj, Option_t *opt);
91 virtual void AddLast(TObject *obj);
92 virtual void AddLast(TObject *obj, Option_t *opt);
93 virtual void AddAt(TObject *obj, Int_t idx);
94 virtual void AddAfter(
const TObject *after, TObject *obj);
95 virtual void AddAfter(TObjLink *after, TObject *obj);
96 virtual void AddBefore(
const TObject *before, TObject *obj);
97 virtual void AddBefore(TObjLink *before, TObject *obj);
98 virtual TObject *Remove(TObject *obj);
99 virtual TObject *Remove(TObjLink *lnk);
100 TObject *Remove(
const TObjLinkPtr_t &lnk) {
return Remove(lnk.get()); }
101 virtual void RemoveLast();
102 virtual void RecursiveRemove(TObject *obj);
104 virtual TObject *At(Int_t idx)
const;
105 virtual TObject *After(
const TObject *obj)
const;
106 virtual TObject *Before(
const TObject *obj)
const;
107 virtual TObject *First()
const;
108 virtual TObjLink *FirstLink()
const {
return fFirst.get(); }
109 virtual TObject **GetObjectRef(
const TObject *obj)
const;
110 virtual TObject *Last()
const;
111 virtual TObjLink *LastLink()
const {
return fLast.get(); }
113 virtual void Sort(Bool_t order = kSortAscending);
114 Bool_t IsAscending() {
return fAscending; }
127 class TObjLink :
public std::enable_shared_from_this<TObjLink> {
132 using TObjLinkPtr_t = std::shared_ptr<TObjLink>;
133 using TObjLinkWeakPtr_t = std::weak_ptr<TObjLink>;
136 TObjLinkWeakPtr_t fPrev;
140 TObjLink(
const TObjLink&) =
delete;
141 TObjLink& operator=(
const TObjLink&) =
delete;
146 TObjLink(TObject *obj) : fObject(obj) { }
147 virtual ~TObjLink() { }
149 TObject *GetObject()
const {
return fObject; }
150 TObject **GetObjectRef() {
return &fObject; }
151 void SetObject(TObject *obj) { fObject = obj; }
152 virtual Option_t *GetAddOption()
const {
return ""; }
153 virtual Option_t *GetOption()
const {
return fObject->GetOption(); }
154 virtual void SetOption(Option_t *) { }
155 TObjLink *Next() {
return fNext.get(); }
156 TObjLink *Prev() {
return fPrev.lock().get(); }
157 TObjLinkPtr_t NextSP() {
return fNext; }
158 TObjLinkPtr_t PrevSP() {
return fPrev.lock(); }
170 class TObjOptLink :
public TObjLink {
176 TObjOptLink(TObject *obj, Option_t *opt) : TObjLink(obj), fOption(opt) { }
178 Option_t *GetAddOption()
const {
return fOption.Data(); }
179 Option_t *GetOption()
const {
return fOption.Data(); }
180 void SetOption(Option_t *option) { fOption = option; }
185 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40600
186 #pragma GCC diagnostic push
187 #pragma GCC diagnostic ignored "-Weffc++"
197 class TListIter :
public TIterator,
198 public std::iterator<std::bidirectional_iterator_tag,
199 TObject*, std::ptrdiff_t,
200 const TObject**, const TObject*&> {
203 using TObjLinkPtr_t = std::shared_ptr<TObjLink>;
206 TObjLinkPtr_t fCurCursor;
207 TObjLinkPtr_t fCursor;
211 TListIter() : fList(0), fCurCursor(0), fCursor(0), fDirection(kIterForward),
215 TListIter(
const TList *l, Bool_t dir = kIterForward);
216 TListIter(
const TListIter &iter);
218 TIterator &operator=(
const TIterator &rhs);
219 TListIter &operator=(
const TListIter &rhs);
221 const TCollection *GetCollection()
const {
return fList; }
222 Option_t *GetOption()
const;
223 void SetOption(Option_t *option);
226 Bool_t operator!=(
const TIterator &aIter)
const;
227 Bool_t operator!=(
const TListIter &aIter)
const;
228 TObject *operator*()
const {
return (fCurCursor ? fCurCursor->GetObject() :
nullptr); }
230 ClassDef(TListIter,0)
233 inline bool operator==(TObjOptLink *l,
const std::shared_ptr<TObjLink> &r) {
237 inline bool operator==(
const std::shared_ptr<TObjLink> &l, TObjOptLink *r) {
241 inline TList::TObjLinkPtr_t TList::NewLink(TObject *obj, TObjLink *prev) {
242 return NewLink(obj, prev ? prev->shared_from_this() :
nullptr);
244 inline TList::TObjLinkPtr_t TList::NewOptLink(TObject *obj, Option_t *opt, TObjLink *prev) {
245 return NewOptLink(obj, opt, prev ? prev->shared_from_this() :
nullptr);
249 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40600
250 #pragma GCC diagnostic pop