12 #ifndef ROOT_TRefArray
13 #define ROOT_TRefArray
30 #if (__GNUC__ >= 3) && !defined(__INTEL_COMPILER)
33 #pragma GCC system_header
39 class TRefArray :
public TSeqCollection {
41 friend class TRefArrayIter;
49 Bool_t BoundsOk(
const char *where, Int_t at)
const;
50 void Init(Int_t s, Int_t lowerBound);
51 Bool_t OutOfBoundsError(
const char *where, Int_t i)
const;
52 Int_t GetAbsLast()
const;
53 TObject *GetFromTable(Int_t idx)
const;
54 Bool_t GetObjectUID(Int_t &uid, TObject *obj,
const char *methodname);
57 typedef TRefArrayIter Iterator_t;
59 TRefArray(TProcessID *pid = 0);
60 TRefArray(Int_t s, TProcessID *pid);
61 TRefArray(Int_t s, Int_t lowerBound = 0, TProcessID *pid = 0);
62 TRefArray(
const TRefArray &a);
63 TRefArray& operator=(
const TRefArray &a);
65 virtual void Clear(Option_t *option=
"");
66 virtual void Compress();
67 virtual void Delete(Option_t *option=
"");
68 virtual void Expand(Int_t newSize);
69 Int_t GetEntries()
const;
70 Int_t GetEntriesFast()
const {
71 return GetAbsLast() + 1;
73 Int_t GetLast()
const;
74 TObject **GetObjectRef(
const TObject *obj)
const;
75 TProcessID *GetPID()
const {
return fPID;}
76 UInt_t GetUID(Int_t at)
const;
77 Bool_t IsEmpty()
const {
return GetAbsLast() == -1; }
78 TIterator *MakeIterator(Bool_t dir = kIterForward)
const;
80 void Add(TObject *obj) { AddLast(obj); }
81 virtual void AddFirst(TObject *obj);
82 virtual void AddLast(TObject *obj);
83 virtual void AddAt(TObject *obj, Int_t idx);
84 virtual void AddAtAndExpand(TObject *obj, Int_t idx);
85 virtual Int_t AddAtFree(TObject *obj);
86 virtual void AddAfter(
const TObject *after, TObject *obj);
87 virtual void AddBefore(
const TObject *before, TObject *obj);
88 virtual TObject *RemoveAt(Int_t idx);
89 virtual TObject *Remove(TObject *obj);
91 TObject *At(Int_t idx)
const;
92 TObject *Before(
const TObject *obj)
const;
93 TObject *After(
const TObject *obj)
const;
94 TObject *First()
const;
95 TObject *Last()
const;
96 virtual TObject *operator[](Int_t i)
const;
97 Int_t LowerBound()
const {
return fLowerBound; }
98 Int_t IndexOf(
const TObject *obj)
const;
99 void SetLast(Int_t last);
101 virtual void Sort(Int_t upto = kMaxInt);
102 virtual Int_t BinarySearch(TObject *obj, Int_t upto = kMaxInt);
104 ClassDef(TRefArray,1)
109 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40600
110 #pragma GCC diagnostic push
111 #pragma GCC diagnostic ignored "-Weffc++"
122 class TRefArrayIter :
public TIterator,
123 public std::iterator<std::bidirectional_iterator_tag,
124 TObject*, std::ptrdiff_t,
125 const TObject**, const TObject*&> {
128 const TRefArray *fArray;
133 TRefArrayIter() : fArray(0), fCurCursor(0), fCursor(0), fDirection(kIterForward) { }
136 TRefArrayIter(
const TRefArray *arr, Bool_t dir = kIterForward);
137 TRefArrayIter(
const TRefArrayIter &iter);
139 TIterator &operator=(
const TIterator &rhs);
140 TRefArrayIter &operator=(
const TRefArrayIter &rhs);
142 const TCollection *GetCollection()
const {
return fArray; }
145 Bool_t operator!=(
const TIterator &aIter)
const;
146 Bool_t operator!=(
const TRefArrayIter &aIter)
const;
147 TObject *operator*()
const;
149 ClassDef(TRefArrayIter,0)
152 #if (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__) >= 40600
153 #pragma GCC diagnostic pop
159 inline Bool_t TRefArray::BoundsOk(
const char *where, Int_t at)
const
161 return (at < fLowerBound || at-fLowerBound >= fSize)
162 ? OutOfBoundsError(where, at)
166 inline TObject *TRefArray::operator[](Int_t at)
const
168 int j = at-fLowerBound;
169 if (j >= 0 && j < fSize) {
171 if (!TProcessID::IsValid(fPID))
return 0;
172 TObject *obj = fPID->GetObjectWithID(fUIDs[j]);
173 if (obj==0) obj = GetFromTable(j);
180 inline TObject *TRefArray::At(Int_t at)
const
183 int j = at-fLowerBound;
184 if (j >= 0 && j < fSize) {
186 if (!TProcessID::IsValid(fPID))
return 0;
187 TObject *obj = fPID->GetObjectWithID(fUIDs[j]);
188 if (obj==0) obj = GetFromTable(j);