ViewVC Help
View File | Revision Log | Show Annotations | Root Listing
root/cvsroot/UserCode/MitAna/DataCont/interface/FastArrayBasic.h
Revision: 1.8
Committed: Mon Mar 23 13:07:17 2009 UTC (16 years, 1 month ago) by loizides
Content type: text/plain
Branch: MAIN
Changes since 1.7: +3 -1 lines
Log Message:
Reset entries cache when objects are added

File Contents

# User Rev Content
1 bendavid 1.1 //--------------------------------------------------------------------------------------------------
2 loizides 1.8 // $Id: FastArrayBasic.h,v 1.7 2009/03/12 18:19:47 loizides Exp $
3 bendavid 1.1 //
4     // FastArrayBasic
5     //
6 loizides 1.3 // Implementation of a "fast" array on the heap: Memory is dynamically allocated,
7 bendavid 1.1 // but there is an optimization in the read streamer similar to the TClonesArray
8 loizides 1.3 // where the heap memory of an existing object is reused.
9     // This class is meant to be used as a datamember for objects which are contained
10     // inside a TClonesArray.
11     // For various reasons, the array can not be written in split mode.
12     // Array is meant to store basic data types as opposed to FastArray
13     // which can hold arbitrary (non-heap using) classes.
14     // Since it stores basic types it can not derive from the Collection<ArrayElement>
15     // interface, or else the At() member functions would have to return pointers to
16     // basic elements. Something we did not want to do.
17 bendavid 1.1 //
18     // Authors: J.Bendavid
19     //--------------------------------------------------------------------------------------------------
20    
21 loizides 1.4 #ifndef MITANA_DATACONT_FASTARRAYBASIC_H
22     #define MITANA_DATACONT_FASTARRAYBASIC_H
23 bendavid 1.1
24     #include <TObject.h>
25     #include <TClass.h>
26     #include <TStorage.h>
27     #include "MitAna/DataCont/interface/Collection.h"
28    
29     namespace mithep
30     {
31 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32 = kFALSE>
32 bendavid 1.1 class FastArrayBasic : public BaseCollection
33     {
34     public:
35 loizides 1.4 FastArrayBasic(UShort_t icap=0);
36 bendavid 1.1 FastArrayBasic(const FastArrayBasic &a);
37     ~FastArrayBasic() { Init(0); }
38    
39     void Add(const ArrayElement &ae);
40     ArrayElement At(UInt_t idx);
41     const ArrayElement At(UInt_t idx) const;
42 loizides 1.3 void Clear(Option_t */*opt*/="") { fSize=0; Init(0); }
43     UInt_t Entries() const { return fSize; }
44 loizides 1.6 UInt_t GetEntries() const { return fSize; }
45 bendavid 1.1 UInt_t GetSize() const { return fCapacity; }
46     Bool_t IsOwner() const { return kTRUE; }
47 bendavid 1.5 TObject *ObjAt(UInt_t /*idx*/) { return 0; }
48     const TObject *ObjAt(UInt_t /*idx*/) const { return 0; }
49 loizides 1.7 void Reset();
50 bendavid 1.1 void Trim() { Expand(fSize); }
51     ArrayElement UncheckedAt(UInt_t idx);
52     const ArrayElement UncheckedAt(UInt_t idx) const;
53     ArrayElement operator[](UInt_t idx);
54     const ArrayElement operator[](UInt_t idx) const;
55    
56     protected:
57     void Init(UShort_t s);
58     void Expand(UShort_t s);
59    
60     UShort_t fSize; //size of array
61     UShort_t fCapacity; //!size of heap allocated
62     ArrayElement *fArray; //!heap storage for objects
63    
64 loizides 1.3 ClassDef(FastArrayBasic,1) // Fast array for basic types
65 bendavid 1.1 };
66     }
67    
68     //--------------------------------------------------------------------------------------------------
69 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
70     inline mithep::FastArrayBasic<ArrayElement, IsDouble32>::FastArrayBasic(UShort_t icap) :
71 bendavid 1.1 fSize(0),
72     fCapacity(0),
73     fArray(0)
74     {
75     // Default constructor.
76 loizides 1.4
77     if (icap)
78     Init(icap);
79 bendavid 1.1 }
80    
81     //--------------------------------------------------------------------------------------------------
82 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
83     inline mithep::FastArrayBasic<ArrayElement, IsDouble32>::FastArrayBasic(const FastArrayBasic &a) :
84 bendavid 1.2 fSize(0),
85 bendavid 1.1 fCapacity(0),
86     fArray(0)
87     {
88     // Copy constructor. Copy only elements which are used.
89 loizides 1.3
90 bendavid 1.2 Init(a.fSize);
91 bendavid 1.1 for (UInt_t i=0; i<a.fSize; ++i)
92     Add(a.fArray[i]);
93     }
94    
95     //--------------------------------------------------------------------------------------------------
96 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
97     void mithep::FastArrayBasic<ArrayElement, IsDouble32>::Add(const ArrayElement &ae)
98 bendavid 1.1 {
99     // Add a copy of an existing object.
100    
101     if (fSize >= fCapacity)
102     Expand(TMath::Max(16,2*fCapacity));
103    
104     ++fSize;
105     fArray[fSize-1] = ae;
106 loizides 1.8 BaseCollection::Clear();
107 bendavid 1.1 }
108    
109     //--------------------------------------------------------------------------------------------------
110 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
111     inline ArrayElement mithep::FastArrayBasic<ArrayElement, IsDouble32>::At(UInt_t idx)
112 bendavid 1.1 {
113     // Return entry at given index.
114    
115     if (idx<fSize)
116     return fArray[idx];
117    
118     ArrayElement tmp;
119     TObject::Fatal("At","Index too large: (%u < %u violated) for %s containing %s",
120     idx, fSize, this->GetName(), typeid(tmp).name());
121     return 0;
122     }
123    
124     //--------------------------------------------------------------------------------------------------
125 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
126     inline const ArrayElement mithep::FastArrayBasic<ArrayElement, IsDouble32>::At(UInt_t idx) const
127 bendavid 1.1 {
128     // Return entry at given index.
129    
130     if (idx<fSize)
131     return fArray[idx];
132    
133     ArrayElement tmp;
134     TObject::Fatal("At","Index too large: (%u < %u violated) for %s containing %s",
135     idx, fSize, this->GetName(), typeid(tmp).name());
136     return 0;
137     }
138    
139     //--------------------------------------------------------------------------------------------------
140 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
141     inline void mithep::FastArrayBasic<ArrayElement, IsDouble32>::Expand(UShort_t s)
142 bendavid 1.1 {
143    
144 loizides 1.3 // Expand or shrink the array to given number of elements.
145 bendavid 1.1
146     if (s < fSize) {
147     TObject::Fatal("Expand", "Cannot shrink FastArrayBasic to less than fSize");
148     return;
149     }
150    
151     if (!fArray || s==0) {
152     Init(s);
153     return;
154     }
155    
156     if (fCapacity == s)
157     return;
158    
159     fArray = static_cast<ArrayElement*>(TStorage::ReAlloc(fArray, s * sizeof(ArrayElement),
160     fCapacity * sizeof(ArrayElement)));
161     fCapacity = s;
162     }
163    
164     //--------------------------------------------------------------------------------------------------
165 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
166     inline void mithep::FastArrayBasic<ArrayElement, IsDouble32>::Init(UShort_t s)
167 bendavid 1.1 {
168    
169 loizides 1.3 // Initialize the array the heap.
170 bendavid 1.1
171     if (fArray && fCapacity != s) {
172     TStorage::Dealloc(fArray);
173     fArray = 0;
174     }
175    
176     fCapacity = s;
177    
178 loizides 1.3 if (!fArray && fCapacity > 0)
179     fArray = static_cast<ArrayElement*>(TStorage::Alloc(fCapacity*sizeof(ArrayElement)));
180 bendavid 1.1 }
181    
182     //-------------------------------------------------------------------------------------------------
183 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
184 loizides 1.7 void mithep::FastArrayBasic<ArrayElement, IsDouble32>::Reset()
185     {
186     // Reset this array.
187    
188     fSize = 0;
189     BaseCollection::Clear();
190     }
191    
192     //-------------------------------------------------------------------------------------------------
193     template<class ArrayElement, Bool_t IsDouble32>
194 bendavid 1.5 void mithep::FastArrayBasic<ArrayElement, IsDouble32>::Streamer(TBuffer &b)
195 bendavid 1.1 {
196     // Stream all objects in the array to or from the I/O buffer.
197 bendavid 1.5 // Ugly special case handling for Double32
198 bendavid 1.1
199     if (b.IsReading()) {
200     b >> fSize;
201     if (fSize) {
202     if (fSize > fCapacity)
203     Expand(TMath::Max(static_cast<Int_t>(fSize),2*fCapacity));
204    
205 bendavid 1.5 if (IsDouble32)
206     b.ReadFastArrayDouble32(reinterpret_cast<Double_t*>(fArray),fSize);
207     else
208     b.ReadFastArray(fArray,fSize);
209 loizides 1.8 BaseCollection::Clear();
210 bendavid 1.1 }
211     } else { /*writing*/
212     b << fSize;
213     if (fSize) {
214 bendavid 1.5 if (IsDouble32)
215     b.WriteFastArrayDouble32(reinterpret_cast<Double_t*>(fArray),fSize);
216     else
217     b.WriteFastArray(fArray,fSize);
218 bendavid 1.1 }
219     }
220     }
221    
222     //--------------------------------------------------------------------------------------------------
223 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
224     inline ArrayElement mithep::FastArrayBasic<ArrayElement, IsDouble32>::UncheckedAt(UInt_t idx)
225 bendavid 1.1 {
226     // Return entry at given index.
227    
228     return fArray[idx];
229     }
230    
231     //--------------------------------------------------------------------------------------------------
232 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
233 loizides 1.7 inline const ArrayElement
234     mithep::FastArrayBasic<ArrayElement, IsDouble32>::UncheckedAt(UInt_t idx) const
235 bendavid 1.1 {
236     // Return entry at given index.
237    
238     return fArray[idx];
239     }
240    
241     //--------------------------------------------------------------------------------------------------
242 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
243 loizides 1.7 inline const ArrayElement
244     mithep::FastArrayBasic<ArrayElement, IsDouble32>::operator[](UInt_t idx) const
245 bendavid 1.1 {
246     // Return entry at given index.
247    
248     return At(idx);
249     }
250    
251     //--------------------------------------------------------------------------------------------------
252 bendavid 1.5 template<class ArrayElement, Bool_t IsDouble32>
253     inline ArrayElement mithep::FastArrayBasic<ArrayElement, IsDouble32>::operator[](UInt_t idx)
254 bendavid 1.1 {
255     // Return entry at given index.
256    
257     return At(idx);
258     }
259     #endif