ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataCont/interface/RefArray.h
Revision: 1.22
Committed: Mon Mar 23 22:15:10 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
CVS Tags: Mit_014d, Mit_014c, Mit_014b, Mit_014a, Mit_014, Mit_014pre3, Mit_014pre2, Mit_014pre1, Mit_013d, Mit_013c, Mit_013b, Mit_013a, Mit_013, Mit_013pre1, Mit_012i, Mit_012h, Mit_012g, Mit_012f, Mit_012e, Mit_012d, Mit_012c, Mit_012b, Mit_012a, Mit_012, Mit_011a, Mit_011, Mit_010a, Mit_010, Mit_009c, Mit_009b, Mit_009a, Mit_009, Mit_008
Changes since 1.21: +2 -2 lines
Log Message:
Cosmetics

File Contents

# Content
1 //--------------------------------------------------------------------------------------------------
2 // $Id: RefArray.h,v 1.21 2009/03/23 13:07:17 loizides Exp $
3 //
4 // RefArray
5 //
6 // Implementation of an efficient TRefArray using the FastArray.
7 //
8 // RefArray now supports objects from multiple PIDs, but only a single
9 // PID will be stored as long as only objects from a single PID are added.
10 //
11 // Authors: C.Loizides, J.Bendavid
12 //--------------------------------------------------------------------------------------------------
13
14 #ifndef MITANA_DATACONT_REFARRAY_H
15 #define MITANA_DATACONT_REFARRAY_H
16
17 #include <TObject.h>
18 #include <TRefArray.h>
19 #include <TRefTable.h>
20 #include <TProcessID.h>
21 #include <TError.h>
22 #include "MitAna/DataCont/interface/RefResolver.h"
23 #include "MitAna/DataCont/interface/Collection.h"
24 #include "MitAna/DataCont/interface/FastArray.h"
25 #include "MitAna/DataCont/interface/FastArrayBasic.h"
26 #include "MitAna/DataCont/interface/ProcIDRef.h"
27
28 namespace mithep
29 {
30 template<class ArrayElement>
31 class RefArray : public Collection<ArrayElement>
32 {
33 public:
34 RefArray();
35
36 void Add(const ArrayElement *ae);
37 ArrayElement *At(UInt_t idx);
38 const ArrayElement *At(UInt_t idx) const;
39 void Clear(Option_t */*opt*/="") { fPIDs.Clear(); fUIDs.Clear(); }
40 UInt_t Entries() const { return fUIDs.Entries(); }
41 UInt_t GetEntries() const { return fUIDs.GetEntries(); }
42 UInt_t GetSize() const { return fUIDs.GetSize(); }
43 Bool_t HasObject(const ArrayElement *obj) const;
44 Bool_t IsOwner() const { return kTRUE; }
45 TObject *ObjAt(UInt_t idx);
46 const TObject *ObjAt(UInt_t idx) const;
47 void Reset();
48 void Trim() { fPIDs.Trim(); fUIDs.Trim(); }
49 ArrayElement *UncheckedAt(UInt_t idx);
50 const ArrayElement *UncheckedAt(UInt_t idx) const;
51 ArrayElement *operator[](UInt_t idx);
52 const ArrayElement *operator[](UInt_t idx) const;
53
54 protected:
55 TObject *GetObject(UInt_t idx) const;
56 TProcessID *GetPID(UInt_t idx) const;
57 UInt_t GetUID(UInt_t idx) const;
58
59 FastArray<ProcIDRef> fPIDs; //||process ids of referenced objects
60 FastArrayBasic<UInt_t> fUIDs; //||unique ids of referenced objects
61
62 ClassDef(RefArray, 1) // Implementation of our own TRefArray
63 };
64 }
65
66 //--------------------------------------------------------------------------------------------------
67 template<class ArrayElement>
68 inline mithep::RefArray<ArrayElement>::RefArray()
69 {
70 // Default constructor.
71 }
72
73 //--------------------------------------------------------------------------------------------------
74 template<class ArrayElement>
75 void mithep::RefArray<ArrayElement>::Add(const ArrayElement *ae)
76 {
77 // Add reference to object.
78
79 if (!ae)
80 return;
81
82 // check if the object can belong here and assign or get its uid
83 if (ae->TestBit(kHasUUID)) {
84 Fatal("Add", "Object cannot be added as it has not UUID!");
85 return;
86 }
87
88 UInt_t uid = 0;
89 TProcessID *pid = 0;
90 if (ae->TestBit(kIsReferenced)) {
91 uid = ae->GetUniqueID();
92 pid = TProcessID::GetProcessWithUID(uid, const_cast<ArrayElement*>(ae));
93 } else {
94 pid = TProcessID::GetSessionProcessID();
95 uid = TProcessID::AssignID(const_cast<ArrayElement*>(ae));
96 }
97
98 // If RefArray contains one and only one PID reference, then only add another if the added object
99 // has a different PID. When this occurs all of the extra spaces which had been left empty get
100 // filled in with the original PID
101 if (fPIDs.Entries()==1) {
102 if (pid != fPIDs.At(0)->Pid() ) {
103 while (fPIDs.Entries()<Entries())
104 fPIDs.GetNew()->SetPid(fPIDs.At(0)->Pid());
105
106 fPIDs.GetNew()->SetPid(pid);
107 }
108 }
109 else
110 fPIDs.GetNew()->SetPid(pid);
111
112 fUIDs.Add(uid);
113 BaseCollection::Clear();
114 }
115
116 //--------------------------------------------------------------------------------------------------
117 template<class ArrayElement>
118 inline ArrayElement *mithep::RefArray<ArrayElement>::At(UInt_t idx)
119 {
120 // Return entry at given index.
121
122 if (idx<Entries())
123 return static_cast<ArrayElement*>(GetObject(idx));
124
125 Fatal("At", "Given index (%u) is larger than array size (%u)", idx, Entries());
126 return 0;
127 }
128
129 //--------------------------------------------------------------------------------------------------
130 template<class ArrayElement>
131 inline const ArrayElement *mithep::RefArray<ArrayElement>::At(UInt_t idx) const
132 {
133 // Return entry at given index.
134
135 if (idx<Entries())
136 return static_cast<const ArrayElement*>(GetObject(idx));
137
138 Fatal("At", "Given index (%u) is larger than array size (%u)", idx, Entries());
139 return 0;
140 }
141
142 //--------------------------------------------------------------------------------------------------
143 template<class ArrayElement>
144 TObject *mithep::RefArray<ArrayElement>::GetObject(UInt_t idx) const
145 {
146 // Return entry at given index. Code adapted from TRef::GetObject().
147
148 TProcessID *pid = GetPID(idx);
149
150 if (!pid) {
151 Fatal("GetObject","Process id pointer is null!");
152 return 0;
153 }
154
155 if (!TProcessID::IsValid(pid)) {
156 Fatal("GetObject","Process id is invalid!");
157 return 0;
158 }
159
160 UInt_t uid = GetUID(idx);
161 return RefResolver::GetObjectWithID(uid,pid);
162 }
163
164 //--------------------------------------------------------------------------------------------------
165 template<class ArrayElement>
166 inline TProcessID *mithep::RefArray<ArrayElement>::GetPID(UInt_t idx) const
167 {
168 // Return pid corresponding to given idx.
169
170 TProcessID *pid = 0;
171 if (fPIDs.Entries()>1)
172 pid = fPIDs.UncheckedAt(idx)->Pid();
173 else
174 pid = fPIDs.UncheckedAt(0)->Pid();
175
176 return pid;
177 }
178
179 //--------------------------------------------------------------------------------------------------
180 template<class ArrayElement>
181 inline UInt_t mithep::RefArray<ArrayElement>::GetUID(UInt_t idx) const
182 {
183 // Return uid corresponding to given idx.
184
185 return fUIDs.UncheckedAt(idx);
186 }
187
188 //--------------------------------------------------------------------------------------------------
189 template<class ArrayElement>
190 Bool_t mithep::RefArray<ArrayElement>::HasObject(const ArrayElement *obj) const
191 {
192 // Check whether array contains a given object.
193
194 if (!obj->TestBit(kIsReferenced))
195 return kFALSE;
196
197 UInt_t oUid = obj->GetUniqueID();
198 TProcessID *oPid = TProcessID::GetProcessWithUID(oUid, const_cast<ArrayElement*>(obj));
199
200 for (UInt_t i=0; i<Entries(); ++i) {
201 if ( (GetUID(i)&0xffffff)==(oUid&0xffffff) && GetPID(i)->GetUniqueID()==oPid->GetUniqueID())
202 return kTRUE;
203 }
204
205 return kFALSE;
206 }
207
208 //--------------------------------------------------------------------------------------------------
209 template<class ArrayElement>
210 TObject *mithep::RefArray<ArrayElement>::ObjAt(UInt_t idx)
211 {
212 // Return object at given index.
213
214 if (idx<Entries())
215 return GetObject(idx);
216
217 Fatal("ObjAt", "Given index (%u) is larger than array size (%u)", idx, Entries());
218 return 0;
219 }
220
221 //--------------------------------------------------------------------------------------------------
222 template<class ArrayElement>
223 const TObject *mithep::RefArray<ArrayElement>::ObjAt(UInt_t idx) const
224 {
225 // Return object at given index.
226
227 if (idx<Entries())
228 return static_cast<const TObject*>(GetObject(idx));
229
230 Fatal("ObjAt", "Given index (%u) is larger than array size (%u)", idx, Entries());
231 return 0;
232 }
233
234 //--------------------------------------------------------------------------------------------------
235 template<class ArrayElement>
236 inline void mithep::RefArray<ArrayElement>::Reset()
237 {
238 // Reset the array.
239
240 fUIDs.Reset();
241 fPIDs.Reset();
242 BaseCollection::Clear();
243 }
244
245 //--------------------------------------------------------------------------------------------------
246 template<class ArrayElement>
247 inline ArrayElement *mithep::RefArray<ArrayElement>::UncheckedAt(UInt_t idx)
248 {
249 // Return entry at given index.
250
251 return static_cast<ArrayElement*>(GetObject(idx));
252 }
253
254 //--------------------------------------------------------------------------------------------------
255 template<class ArrayElement>
256 inline const ArrayElement *mithep::RefArray<ArrayElement>::UncheckedAt(UInt_t idx) const
257 {
258 // Return entry at given index.
259
260 return static_cast<const ArrayElement*>(GetObject(idx));
261 }
262
263 //--------------------------------------------------------------------------------------------------
264 template<class ArrayElement>
265 inline const ArrayElement *mithep::RefArray<ArrayElement>::operator[](UInt_t idx) const
266 {
267 // Return entry at given index.
268
269 return At(idx);
270 }
271
272 //--------------------------------------------------------------------------------------------------
273 template<class ArrayElement>
274 inline ArrayElement *mithep::RefArray<ArrayElement>::operator[](UInt_t idx)
275 {
276 // Return entry at given index.
277
278 return At(idx);
279 }
280 #endif